4. 命令行工具:ros2 node、ros2 topic、ros2 service、ros2 action、ros2 param 常用命令

ROS2 将机器人系统中的每一个可运行单元抽象为 节点(Node),节点之间通过 话题(Topic)、服务(Service)、动作(Action) 和 参数(Parameter) 进行通信。命令行工具是理解系统运行状态、排查通信故障、验证算法逻辑的“第一双手”。本章围绕 ros2 node、ros2 topic、ros2 service、ros2 action、ros2 param 五组命令,讲解其核心用途与典型操作流程。

4.1 核心原理:ROS2 通信机制与命令行入口

ROS2 基于 DDS(数据分发服务)实现分布式通信。节点在 DDS 域中通过话题进行异步、单向、多对多的数据流传输;通过服务进行同步、双向、一次性的请求-应答;通过动作处理需要长时间执行且可反馈、可取消的任务;参数则是节点对外暴露的配置项。命令行工具本质上是向 DDS 网络发送查询或控制指令,因此所有命令都依赖 daemon 发现机制,需确保节点与终端处于同一 ROS_DOMAIN_ID。

核心命令速查表

命令组常用子命令作用
ros2 nodelist, info查看节点列表、节点详情(含订阅/发布/服务)
ros2 topiclist, info, echo, pub, hz, bw查看话题、输出数据、手动发布、统计频率/带宽
ros2 servicelist, type, find, call查看服务、调用服务
ros2 actionlist, info, send_goal查看动作、发送目标
ros2 paramlist, get, set, dump, load查看/修改参数、批量保存/加载
ROS2 命令行工具与通信机制关系图 ros2 命令行 ros2 node ros2 topic ros2 service ros2 action ros2 param 节点 Node /turtle1 /camera_node 话题 Topic /cmd_vel /odom 服务 Service /spawn /set_pen 动作 Action /turtle_rotate /nav_to_pose 参数 /speed /radius 典型排查流程: 1. ros2 node list → 确认节点是否在线 2. ros2 topic list / ros2 topic info /topic → 确认话题是否发布 3. ros2 topic echo /topic → 查看数据内容 → ros2 topic hz /topic → 检查发布频率

4.2 方法流程:五组命令的典型操作路径

以 turtlesim 为例,启动模拟器后,按以下流程逐一验证各组命令。

4.2.1 ros2 node:查看节点拓扑

ros2 node list          # 列出所有在线节点
ros2 node info /turtlesim  # 查看节点详情

node info 会输出该节点的订阅者、发布者、服务服务器、动作服务器等完整通信接口,是判断节点是否按预期工作的第一道检查。

4.2.2 ros2 topic:监控与调试数据流

ros2 topic list -t      # 显示话题及其消息类型
ros2 topic echo /turtle1/cmd_vel   # 实时打印话题数据
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}, angular: {z: 1.0}}" --once
ros2 topic hz /turtle1/pose        # 统计话题发布频率

topic pub 常用于手动模拟发布者,验证下游节点是否响应;topic hz 可快速判断话题是否卡顿或中断。

4.2.3 ros2 service:同步请求-应答

ros2 service list -t    # 列出所有服务及类型
ros2 service type /spawn
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.2, name: 'turtle2'}"

服务调用适合一次性操作,如生成新海龟、重置位置、设置画笔颜色等。

4.2.4 ros2 action:长时间任务控制

ros2 action list -t
ros2 action info /turtle1/rotate_absolute
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}" --feedback

动作带有反馈(feedback)和取消(cancel)机制,适合导航、机械臂运动等耗时任务。

4.2.5 ros2 param:动态配置

ros2 param list /turtlesim
ros2 param get /turtlesim background_b
ros2 param set /turtlesim background_r 150
ros2 param dump /turtlesim   # 保存参数到文件
ros2 param load /turtlesim turtlesim.yaml  # 从文件加载

参数可在节点运行中动态修改,无需重启,极大方便了调试。

4.3 案例场景:用命令行诊断“海龟不动了”

假设你启动了一个海龟仿真节点,但发送速度指令后海龟没有反应。按以下步骤快速定位问题:

  1. 检查节点是否存活:ros2 node list,确认 /turtlesim 和 /teleop_turtle 都在列表中。
  2. 检查话题是否发布:ros2 topic list,查看是否有 /turtle1/cmd_vel。
  3. 监听话题内容:ros2 topic echo /turtle1/cmd_vel,按下方向键,观察是否有数据输出。若无输出,说明键盘控制节点未发布;若有输出但海龟不动,则可能是订阅端问题。
  4. 手动发布测试:ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 3.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}",若海龟前进,说明话题链路正常,问题在键盘节点;若仍不动,检查 ros2 topic hz /turtle1/cmd_vel 是否显示频率为 0。
  5. 检查服务与参数:若海龟位置异常,可调用 /reset 服务;若背景颜色异常,用 ros2 param set 调整。

技巧:使用 ros2 topic echo --once 只打印一条消息,适合验证话题是否有数据;ros2 topic pub --rate 10 可以按固定频率持续发布,模拟传感器数据流。

4.4 误区与复盘:常见命令行使用陷阱

误区一:忘记设置 ROS_DOMAIN_ID。多台机器或同一机器多开不同域时,节点间无法互相发现。执行 export ROS_DOMAIN_ID=1 并确保所有终端一致。

误区二:混淆话题与服务的使用场景。话题适合高频、单向数据(如传感器流),服务适合低频、双向请求(如开关控制)。若用服务传高频数据,会导致阻塞和延迟。

误区三:topic pub 时消息格式错误。YAML 语法要求严格,字符串必须加引号,浮点数不能省略小数点。例如 "{x: 2.0}" 不能写成 "{x: 2}"(虽然有时能解析,但类型可能不匹配)。

误区四:忽略 action 的反馈与取消。动作任务可能执行数秒到数分钟,若只发送目标而不监听反馈,无法判断进度;若任务卡死,需用 ros2 action send_goal --cancel 或 Ctrl+C 中断。

误区五:param set 后不保存。运行时修改的参数在节点重启后丢失。使用 ros2 param dump 定期保存,并在启动脚本中通过 --params-file 加载。

4.5 复盘清单:命令行工具自检表

  • 能否用 ros2 node info 查看节点的完整通信接口?
  • 能否用 ros2 topic hz 判断话题发布频率是否正常?
  • 能否用 ros2 topic pub --once 手动触发一次消息?
  • 能否用 ros2 service call 调用一个带复杂参数的服务?
  • 能否用 ros2 action send_goal --feedback 观察动作执行进度?
  • 能否用 ros2 param dump 和 ros2 param load 实现参数持久化?

掌握这五组命令,相当于拥有了 ROS2 系统的“透视镜”和“遥控器”。无论是调试自己的节点,还是分析现成功能包,命令行工具都能帮助你快速定位问题、验证假设。建议在 turtlesim 中反复练习,直到能够不看文档完成上述所有操作。