24. 节点、话题、服务与动作¶
24.1 学习目标¶
从正在运行的机器人识别节点和通信接口,知道何时看话题、调用服务或追踪动作,不把所有交互都当成“发布消息”。
24.2 适用范围¶
ROS 2 正文环境。ROS 1 对应命令见附录 A。
24.3 操作前检查¶
启动底盘基础节点,不启动导航和高级应用。另开一个加载相同环境的终端。
24.4 工作原理¶
节点是一个运行中的 ROS 功能单元,例如读取串口的底盘驱动或发布图像的相机驱动。节点之间通过接口传递数据:
- 话题适合连续数据流,例如速度、雷达和里程计。
- 服务适合一次请求、一次响应,例如读取或切换某项状态。
- 动作适合耗时任务,可提供反馈并允许取消,例如导航到目标点。
接口类型规定消息字段。名字相同但类型不同的接口不能直接通信。ROS 2 还受域标识符(Domain Identifier, Domain ID)、数据分发服务(Data Distribution Service, DDS)实现和服务质量(Quality of Service, QoS)策略影响。
话题的发布者和订阅者还要满足通信策略。reliability 表示是否要求可靠送达,history 表示怎样保存历史消息,depth 表示队列最多保留多少条。节点和话题都能列出来,只能证明发现过程基本成功;发布者与订阅者的策略不兼容时,订阅端仍可能收不到数据。
24.5 操作步骤¶
ros2 node list
ros2 node info <节点名>
ros2 topic list -t
ros2 service list -t
ros2 action list -t
检查底盘速度话题:
ros2 topic info /cmd_vel --verbose
ros2 interface show geometry_msgs/msg/Twist
在 --verbose 输出中逐个比较发布者和订阅者的类型、reliability、history 与 depth。先记录两端当前值,再决定是否需要修改配置。
对传感器先看频率,再看单条内容:
ros2 topic hz <话题名>
ros2 topic echo --once <话题名>
使用服务和动作前先查看类型:
ros2 service type <服务名>
ros2 action info <动作名>
需要理解连接图时运行 rqt_graph,但不要用图中的连线替代消息内容和 QoS 检查。
运行配套发布订阅实验¶
先完成第 23 章的构建步骤。终端 A 运行 C++ 示例发布者;查看 package.xml、CMakeLists.txt、src/publisher.cpp 和 src/subscriber.cpp:
source ~/wheeltec_course_ws/install/setup.bash
ros2 run cpp_pubsub talker
终端 B 运行 Python 示例订阅者;查看 package.xml、setup.py、py_pubsub/publisher.py 和 py_pubsub/subscriber.py:
source ~/wheeltec_course_ws/install/setup.bash
ros2 run py_pubsub listener
另开终端检查通信契约:
source ~/wheeltec_course_ws/install/setup.bash
ros2 topic info /course/chatter --verbose
ros2 topic echo /course/chatter --once
确认类型为 std_msgs/msg/String,并至少有一个发布者和一个订阅者。停止两个节点后交换语言再运行一次;C++ 发布、Python 订阅以及相反组合都能收到消息时,接口才算跨语言兼容。
24.6 验收标准¶
- 能从底盘节点找出订阅的速度话题和发布的里程计/IMU。
- 能说明一个传感器话题的类型、频率和发布者。
- 能指出服务与动作相对话题的区别。
- 多机通信时记录 Domain ID 和 QoS;
ping只能说明网络层可达,不能证明 ROS 2 接口匹配。
24.7 故障排查¶
涉及传感器时,先确认设备能被系统识别,再检查驱动节点;随后核对话题类型和 QoS。数据可见但上层仍失败时,检查时间戳与坐标关系,最后再查看动作服务器或其他算法节点。
| 现象 | 检查 |
|---|---|
| 节点列表为空 | ROS 环境、Domain ID、DDS 和网络 |
| 话题存在但收不到 | QoS、命名空间、类型和发布频率 |
| 同名节点重复 | 旧进程、重复启动或命名空间缺失 |
| 动作无法取消 | 动作服务器状态、客户端实现和通信链 |