4、命令行调试工具:ros2 topic echo/bw/hz、ros2 service call、ros2 param get/set

说实话,很多刚接触ROS2的朋友,一上来就想着搭图形界面、搞可视化。我理解,看着花花绿绿的界面确实爽。但我要告诉你一个真相:真正高效的调试,90%的时间都在命令行里完成

我自己做项目时,最常用的就是这几个命令。它们就像手术刀,精准、快速、不拖泥带水。今天我就带你把这套工具玩透。

4.1 ros2 topic echo:监听话题数据

这个命令,说白了就是让你「偷看」话题里到底在传什么数据。我在调试激光雷达时,经常用它来确认数据有没有发出来。

基本用法很简单:

ros2 topic echo /topic_name

比如监听/cmd_vel话题:

ros2 topic echo /cmd_vel

你会看到类似这样的输出:

linear:
  x: 0.5
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.2
---

注意那个---分隔符,它表示一条消息的结束。每来一条新消息,就会打印一次。

我的小技巧: 如果你只想看最新的几条数据,可以用 --once 参数。比如 ros2 topic echo /cmd_vel --once,它只打印一条消息就退出,非常适合快速验证。

4.2 ros2 topic bw:测量话题带宽

这个命令可能用得少一些,但关键时刻能救命。它用来查看话题的数据传输速率,单位是字节每秒。

用法:

ros2 topic bw /topic_name

比如:

ros2 topic bw /camera/image_raw

输出示例:

Subscribed to [/camera/image_raw]
  0.00 B/s from 1 publisher
  0.00 B/s from 1 subscription
  average: 12.34 MB/s
注意: 这个命令需要订阅话题才能测量带宽。如果话题没有发布者,它会一直等待。我曾经在调试一个高帧率相机时,发现带宽异常高,结果发现是图像压缩没开,白白浪费了网络资源。

4.3 ros2 topic hz:检查话题发布频率

这个命令我几乎天天用。它用来查看话题的发布频率,单位是Hz。如果你的机器人运动不平滑,第一个要查的就是控制指令的频率。

用法:

ros2 topic hz /topic_name

比如检查/odom话题:

ros2 topic hz /odom

输出示例:

average rate: 50.002
  min: 0.019s max: 0.021s std dev: 0.00042s window: 100

这里显示平均频率是50Hz,非常稳定。如果看到频率忽高忽低,或者远低于预期,那就要排查问题了。

避坑指南: 我曾经调试一个电机驱动节点,发现/cmd_vel的频率只有10Hz,但代码里明明设的是50Hz。查了半天,发现是回调函数里有个阻塞操作,把循环卡住了。用ros2 topic hz一测,问题立刻暴露。

4.4 ros2 service call:调用服务

服务调用是ROS2里一种同步通信方式。你发一个请求,对方给你一个响应。我用它来触发一些一次性操作,比如拍照、重置里程计、切换模式等。

基本用法:

ros2 service call /service_name service_type "arguments"

举个例子,调用/spawn服务生成一个乌龟:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"

输出:

requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.0, name='turtle2')

response:
turtlesim.srv.Spawn_Response(name='turtle2')
我的习惯: 在写服务端代码之前,我会先用ros2 service call手动调一下,确认服务接口定义没问题。这样可以避免代码写完后才发现类型对不上。

4.5 ros2 param get/set:读取和设置参数

参数系统是ROS2里非常实用的功能。你可以在运行时动态修改节点的行为,而不用重启节点。我经常用它来调整PID参数、修改传感器阈值等。

4.5.1 获取参数

ros2 param get /node_name parameter_name

比如获取乌龟模拟器的背景颜色参数:

ros2 param get /turtlesim background_b

输出:

Integer value is: 255

4.5.2 设置参数

ros2 param set /node_name parameter_name value

比如把背景颜色改成红色:

ros2 param set /turtlesim background_r 255

输出:

Set parameter successful
注意: 不是所有参数都支持运行时修改。有些参数需要在节点启动时加载,改了也不会生效。我在项目中遇到过,改了参数但没反应,后来发现是参数声明时没加rcl_interfaces/msg/ParameterDescriptorread_only标记。

4.6 实战组合拳

光会单个命令还不够,你得学会组合使用。我给你一个我常用的调试流程:

  1. 先看话题列表ros2 topic list,确认所有话题都在
  2. 检查频率ros2 topic hz /关键话题,看频率是否正常
  3. 监听数据ros2 topic echo /关键话题,看数据内容是否合理
  4. 测带宽:如果感觉卡顿,用ros2 topic bw看看是不是数据量太大
  5. 调参数:用ros2 param set临时调整参数,验证效果后再改代码

这套流程我用了好几年,基本能解决80%的通信问题。你想想看,是不是比打开一堆图形界面快多了?

总结一下: 这四个命令——echo、bw、hz、service call、param get/set——是ROS2调试的基石。别嫌它们简陋,真正用熟了,你会发现它们比任何图形工具都顺手。嗯,今天就先聊到这儿,下一章我们聊聊日志系统,那个也是调试利器。