ros2自定义消息接口头文件
时间: 2024-12-30 10:32:03 浏览: 14
### ROS2 自定义消息接口头文件创建与使用
#### 定义自定义消息和服务
为了在ROS2中创建自定义的消息(`msg`)或服务(`srv`), 需要在对应的软件包内建立相应的`.msg` 或 `.srv` 文件。这些文件应放置于特定目录结构下的 `msg/` 和 `srv/` 子目录里[^1]。
对于每一个新创建的 `.msg` 或者 `.srv`, 必须更新该包中的 `CMakeLists.txt` 来调用宏 `rosidl_generate_interfaces()`,这会触发编译过程生成多种编程语言支持所需的源码和头文件。此功能由 `rosidl_default_generators` 提供。
```cmake
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/CustomMessage.msg"
"srv/AddTwoInts.srv"
)
```
上述命令假设项目名称为 `${PROJECT_NAME}`, 并指定了两个待处理的接口描述文件路径。一旦完成配置并执行构建流程,则会在安装空间找到对应的语言绑定资源。
#### 查看已注册的服务接口详情
要查看某个具体服务类型的详细信息, 可利用命令行工具 `ros2 interface show` 加上完整的类型名作为参数来获取其内部字段说明。例如:
```bash
install/setup.bash
ros2 interface show tutorial_interfaces/srv/AddThreeInts
```
这条指令展示了名为 `AddThreeInts` 的服务接口所包含的数据成员及其类型[^2]。
#### 实际应用案例展示
下面给出一段Python客户端程序片段用于请求加法运算的结果:
```python
import rclpy
from rclpy.node import Node
from tutorial_interfaces.srv import AddThreeInts
class MinimalClientAsync(Node):
def __init__(self):
super().__init__('minimal_client_async')
self.cli = self.create_client(AddThreeInts, 'add_three_ints')
while not self.cli.wait_for_service(timeout_sec=1.0):
self.get_logger().info('service not available, waiting again...')
self.req = AddThreeInts.Request()
def send_request(self):
self.req.a = int(input("Enter first number: "))
self.req.b = int(input("Enter second number: "))
self.req.c = int(input("Enter third number: "))
self.future = self.cli.call_async(self.req)
def main(args=None):
rclpy.init(args=args)
minimal_client = MinimalClientAsync()
minimal_client.send_request()
while rclpy.ok():
rclpy.spin_once(minimal_client)
if minimal_client.future.done():
try:
response = minimal_client.future.result()
except Exception as e:
minimal_client.get_logger().info(
f'Service call failed {e}')
else:
minimal_client.get_logger().info(
f'Result of add_three_ints: {response.sum}')
break
minimal_client.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
这段代码实现了向服务器发送三个整数相加的任务,并打印返回值到控制台。这里的关键在于导入了之前提到过的 `tutorial_interfaces.srv.AddThreeInts` 接口类以便实例化请求对象。
阅读全文