创建自定义ROS 2 msg 和 srv 文件,构建时报错

文章讲述了在使用ROS2创建自定义msg和srv文件时遇到CMake错误,解决方法是调整CMakeLists.txt中的find_package和rosidl_generate_interfaces调用顺序,确保find_package(rosidl_default_generators)在rosidl_generate_interfaces之前。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建自定义ROS 2 msg 和 srv 文件,构建时报错

colcon build编译后报错信息:

--- stderr: tutorial_interfaces
CMake Error at C:/opt/ros/humble/x64/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:64 (message):
  rosidl_generate_interfaces() must be called before ament_package()
Call Stack (most recent call first):
  CMakeLists.txt:32 (rosidl_generate_interfaces)

解决方案:

打开CMakeLists.txt,将
find_package
### 创建自定义服务 (srv) 文件ROS 2创建自定义服务文件涉及编写 `.srv` 文件并将其集成到包中。`.srv` 文件结构类似于消息文件 (`msg`),但分为请求响应两部分[^4]。 #### 编写 .srv 文件 假设要创建一个名为 `AddTwoInts.srv` 的简单服务来相加两个整数: ```plaintext int64 a int64 b --- int64 sum ``` 此文件位于包内的 `srv/` 目录下。例如,在工作空间中的某个包里,路径可能是 `my_package/srv/AddTwoInts.srv`. #### 修改 CMakeLists.txt package.xml 为了使新创建服务可用,需更新 `CMakeLists.txt` 来指定构建依赖项服务接口的位置: ```cmake find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "srv/AddTwoInts.srv" ) ``` 同样地,在 `package.xml` 添加必要的依赖声明以确保编译器知道处理这些接口所需的工具: ```xml <build_depend>rosidl_default_generators</build_depend> <exec_depend>rosidl_default_runtime</exec_depend> ``` #### 实现服务器端代码 下面是一个简单的 Python 脚本实现上述服务服务器端逻辑: ```python import rclpy from my_package.srv import AddTwoInts # 导入自定义服务类型 def add_two_ints_callback(request, response): response.sum = request.a + request.b return response def main(args=None): rclpy.init(args=args) node = rclpy.create_node('add_two_ints_server') s = node.create_service( AddTwoInts, 'add_two_ints', add_two_ints_callback ) print("Ready to add two ints.") rclpy.spin(node) if __name__ == '__main__': main() ``` 这段脚本会监听来自客户端的消息,并返回两者之作为回应[^1]. #### 实现客户端代码 对于客户端来说,则可以这样发起请求: ```python import sys import rclpy from my_package.srv import AddTwoInts def main(): rclpy.init() node = rclpy.create_node('add_two_ints_client') cli = node.create_client(AddTwoInts, 'add_two_ints') while not cli.wait_for_service(timeout_sec=1.0): node.get_logger().info('service not available, waiting again...') req = AddTwoInts.Request() req.a = int(sys.argv[1]) req.b = int(sys.argv[2]) future = cli.call_async(req) rclpy.spin_until_future_complete(node, future) try: result = future.result() print(f'Sum: {result.sum}') except Exception as e: node.get_logger().error(f"Service call failed %r" % (e,)) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 通过命令行参数传递给定数值至该程序即可获得计算结果.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值