ROS2学习通信接口
时间: 2025-05-14 07:04:08 浏览: 34
### ROS2通信接口的学习资料
#### 什么是ROS2中的通信接口?
在ROS2中,通信接口是指用于实现节点间消息传递的标准协议。这些接口主要包括话题(Topic)、服务(Service)和动作(Action)。它们分别对应于发布/订阅模式、请求/响应模式以及目标驱动的任务执行模式[^1]。
#### 如何定义并创建自定义的消息类型?
为了满足特定应用需求,开发者可以扩展标准消息集并通过创建自定义`.msg`文件来定义新的数据结构。具体操作如下:
- **创建 `.msg` 文件**: 定义新消息类型的字段及其属性。
```plaintext
float64 x_position
float64 y_position
string object_name
```
- **编译消息文件**: 使用 `ament_cmake` 或其他构建工具处理新增加的 `.msg` 文件以便生成相应语言绑定代码。
对于更复杂的交互场景,则需设计服务或动作接口:
- **服务 (Srv)**: 描述客户端发送给服务器的数据包格式和服务端返回的结果形式。
```plaintext
int32 a
int32 b
---
int32 sum
```
- **动作 (Action)**: 支持长时间运行的操作,并允许反馈更新状态直至完成整个过程结束为止。
```plaintext
# Goal definition
uint8 target_id
# Result definition
bool success_flag
# Feedback definition during execution
float32 progress_percentage
```
以上所有定制化组件均遵循跨平台兼容原则即所谓“语言无关”的特性^,^[^2].
#### 示例代码展示
下面给出一段简单的Python脚本演示如何利用上述概念建立基本的服务调用逻辑:
```python
import rclpy
from example_interfaces.srv import AddTwoInts
def main(args=None):
rclpy.init(args=args)
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 = 41
req.b = 1
future = cli.call_async(req)
rclpy.spin_until_future_complete(node, future)
if future.result() is not None:
response = future.result()
node.get_logger().info(
f'Result of add_two_ints: {req.a} + {req.b} = {response.sum}')
else:
node.get_logger().error('Exception while calling service: %r' % (future.exception(),))
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
此程序片段展示了怎样设置一个向远程计算两整数之和功能发起异步请求的过程.
阅读全文
相关推荐


















