第4章:ROS2基础回顾——节点、话题、服务、动作
各位同学好,我是你们的仿真课讲师。这一章咱们来聊聊ROS2的核心通信机制。说实话,很多初学者一上来就被节点、话题、服务、动作这些概念搞晕了。我当年刚接触ROS时也一样,感觉像在学一门新语言。但别担心,今天我用最直白的方式帮你理清楚。
4.1 节点(Node)——ROS2的最小执行单元
节点是什么?说白了就是一个独立的可执行程序。每个节点负责完成某一项具体任务。比如在Gazebo仿真里,一个节点控制机器人底盘,另一个节点处理激光雷达数据,还有一个节点负责发布里程计信息。
我个人习惯把节点想象成「车间里的工人」。每个工人只干自己那摊活,互不干扰。这样设计的好处是——如果某个节点挂了,其他节点还能继续工作。我在项目中遇到过好几次,某个传感器节点崩溃了,但机器人底盘控制节点依然正常运行,这就是ROS2节点化设计的优势。
关键点:ROS2是分布式架构,节点之间通过DDS(数据分发服务)通信。这意味着节点可以运行在同一台机器上,也可以分布在不同的电脑上。
4.2 话题(Topic)——异步通信的「广播站」
话题是ROS2里最常用的通信方式。它是一种发布/订阅模型,说白了就是「有人发消息,有人收消息」。发布者只管发,订阅者只管收,双方不需要知道对方是谁。
举个例子:激光雷达节点不断发布扫描数据到/scan话题,导航节点订阅这个话题来获取环境信息。你想想看,如果导航节点没启动,激光雷达照样发数据,完全不受影响。这就是异步通信的特点。
嗯,这里要注意:话题通信是单向的、无反馈的。发布者发完就完事了,不会等订阅者回复。适合传感器数据、状态信息这类持续更新的数据。
命令行测试话题通信
咱们用命令行来实际感受一下。打开两个终端:
# 终端1:发布消息
ros2 topic pub /test_topic std_msgs/msg/String "data: 'Hello ROS2'" --rate 1
# 终端2:订阅消息
ros2 topic echo /test_topic
你会看到终端2每隔1秒收到一条消息。我曾经用这个命令调试过自定义消息类型,发现消息字段定义错了,导致数据一直对不上。所以建议你多试试ros2 topic list、ros2 topic info这些命令,排查问题很有用。
4.3 服务(Service)——同步通信的「一问一答」
服务和话题最大的区别是什么?服务是同步的、有反馈的。客户端发送请求,服务端处理完返回响应,客户端必须等待结果。
我习惯把服务比作「打电话问客服」。你问一个问题,客服查完告诉你答案,然后通话结束。适合那些需要即时响应的操作,比如「打开机械臂夹爪」、「查询当前机器人位姿」。
小技巧:服务适合低频、需要确认的操作。如果你需要高频发送数据,请用话题。我曾经把服务当话题用,结果系统卡得不行,后来才意识到设计模式选错了。
命令行测试服务通信
# 终端1:启动服务端
ros2 service list # 查看可用服务
# 调用服务(以/spawn为例,在turtlesim中)
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"
这个命令会在turtlesim仿真中生成一只新乌龟。你会立刻看到返回结果,包括新乌龟的名字。这就是服务的典型用法——请求-响应模式。
4.4 动作(Action)——带反馈的「长任务」
动作是ROS2里最复杂的通信机制,但也是最强大的。它结合了话题和服务的特点:可以发送目标、接收反馈、获取最终结果,还能随时取消任务。
你想想看,如果让机器人从A点走到B点,用服务就不合适——因为走路需要时间,服务会一直阻塞等待。用话题呢?又没法知道任务什么时候完成。这时候动作就派上用场了。
动作有三个核心部分:
- 目标(Goal):告诉机器人要去哪里
- 反馈(Feedback):机器人边走边告诉你当前位置
- 结果(Result):到达后告诉你「我到了」
避坑指南:我曾经在写动作服务器时忘记处理取消请求,结果用户想中断任务时,机器人还在傻乎乎地往前走。记得一定要实现cancel_callback,给用户一个「后悔药」。
命令行测试动作通信
# 查看动作列表
ros2 action list
# 发送动作目标(以turtlesim的旋转为例)
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}" --feedback
加上--feedback参数,你会看到实时反馈数据。这个功能在调试导航任务时特别有用,能直观看到机器人当前状态。
4.5 四种通信机制对比
| 通信方式 | 通信模式 | 是否有反馈 | 典型场景 |
|---|---|---|---|
| 话题(Topic) | 发布/订阅 | 无 | 传感器数据、状态信息 |
| 服务(Service) | 请求/响应 | 有(同步) | 查询参数、触发操作 |
| 动作(Action) | 目标/反馈/结果 | 有(异步) | 导航、机械臂控制 |
4.6 本章知识体系图
下面这张图帮你理清四种通信机制的关系和适用场景:
4.7 实用命令行速查
最后,我整理了一份常用命令清单,建议你收藏起来。调试时直接翻出来用:
# 话题相关
ros2 topic list # 列出所有话题
ros2 topic info /topic_name # 查看话题信息
ros2 topic echo /topic_name # 订阅话题消息
ros2 topic pub /topic_name ... # 发布话题消息
ros2 topic hz /topic_name # 查看发布频率
# 服务相关
ros2 service list # 列出所有服务
ros2 service type /service_name # 查看服务类型
ros2 service call /service_name ... # 调用服务
# 动作相关
ros2 action list # 列出所有动作
ros2 action info /action_name # 查看动作信息
ros2 action send_goal /action_name ... # 发送动作目标
好了,这一章的内容就到这里。记住一个原则:话题用于持续数据流,服务用于即时查询,动作用于耗时任务。搞清楚了这些,后面在Gazebo里调试机器人就顺手多了。