R
Member
刚接触ROS 2的时候,最搞不清楚的就是什么时候用Topic、什么时候用Service、什么时候用Action。用多了慢慢有经验了,分享一下。
## Topic:发布-订阅,持续数据流
**特点:**
- 异步通信
- 一对多发布
- 持续数据流,没有请求响应
**适用场景:**
- 传感器数据(摄像头图像、激光雷达点云、IMU)
- 机器人状态发布(关节角度、位姿)
- 高频数据流,几十Hz到几百Hz
**我们的用法:**
- 激光雷达点云:发布Topic,SLAM节点订阅
- 摄像头图像:发布Topic,视觉节点订阅
- 关节状态:控制器发布Topic,RViz订阅显示
## Service:请求-响应,一次性调用
**特点:**
- 同步通信
- 一对一
- 发一个请求,等一个响应,完事
**适用场景:**
- 一次性查询(获取参数、查询当前状态)
- 短时间能完成的操作(设置模式、触发动作)
- 不需要持续反馈的任务
**我们的用法:**
- 调用SLAM节点的"保存地图"服务
- 请求机器人当前电量信息
- 设置机器人的运行模式
## Action:长时任务,可反馈可取消
**特点:**
- 异步通信
- 目标-反馈-结果三段式
- 任务执行过程中持续反馈进度
- 可以中途取消目标
**适用场景:**
- 长时间运行的任务(导航到目标点、机械臂运动到位姿)
- 需要进度反馈的任务
- 可能需要取消的操作
**我们的用法:**
- 导航:发送目标点,Action反馈当前距离和角度,到达后返回结果
- 机械臂运动:发送目标位姿,反馈关节插值状态
## 选择决策表
| 需求 | 选择 |
|---|---|
| 持续数据流,传感器 | Topic |
| 快速查询,一次性调用 | Service |
| 长时间任务,需要进度 | Action |
| 需要中途取消 | Action |
## 一个容易混淆的点
Service看起来和Action很像,但区别在于:
- Service是"等我做完告诉你",中间没有反馈
- Action是"我开始做了,这是当前进度,做完了告诉你最终结果"
导航这种几分钟的任务,用Service会卡住客户端,必须用Action。
大家做ROS开发的时候,有没有踩过通信机制选择的坑?
## Topic:发布-订阅,持续数据流
**特点:**
- 异步通信
- 一对多发布
- 持续数据流,没有请求响应
**适用场景:**
- 传感器数据(摄像头图像、激光雷达点云、IMU)
- 机器人状态发布(关节角度、位姿)
- 高频数据流,几十Hz到几百Hz
**我们的用法:**
- 激光雷达点云:发布Topic,SLAM节点订阅
- 摄像头图像:发布Topic,视觉节点订阅
- 关节状态:控制器发布Topic,RViz订阅显示
## Service:请求-响应,一次性调用
**特点:**
- 同步通信
- 一对一
- 发一个请求,等一个响应,完事
**适用场景:**
- 一次性查询(获取参数、查询当前状态)
- 短时间能完成的操作(设置模式、触发动作)
- 不需要持续反馈的任务
**我们的用法:**
- 调用SLAM节点的"保存地图"服务
- 请求机器人当前电量信息
- 设置机器人的运行模式
## Action:长时任务,可反馈可取消
**特点:**
- 异步通信
- 目标-反馈-结果三段式
- 任务执行过程中持续反馈进度
- 可以中途取消目标
**适用场景:**
- 长时间运行的任务(导航到目标点、机械臂运动到位姿)
- 需要进度反馈的任务
- 可能需要取消的操作
**我们的用法:**
- 导航:发送目标点,Action反馈当前距离和角度,到达后返回结果
- 机械臂运动:发送目标位姿,反馈关节插值状态
## 选择决策表
| 需求 | 选择 |
|---|---|
| 持续数据流,传感器 | Topic |
| 快速查询,一次性调用 | Service |
| 长时间任务,需要进度 | Action |
| 需要中途取消 | Action |
## 一个容易混淆的点
Service看起来和Action很像,但区别在于:
- Service是"等我做完告诉你",中间没有反馈
- Action是"我开始做了,这是当前进度,做完了告诉你最终结果"
导航这种几分钟的任务,用Service会卡住客户端,必须用Action。
大家做ROS开发的时候,有没有踩过通信机制选择的坑?