第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 本章知识体系图

下面这张图帮你理清四种通信机制的关系和适用场景:

ROS2 四大通信机制 节点 话题 (Topic) 发布/订阅,无反馈 服务 (Service) 请求/响应,同步 动作 (Action) 目标/反馈/结果,异步 选择原则:高频无反馈用话题,低频需确认用服务,长任务带反馈用动作

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里调试机器人就顺手多了。


可可精品资料库