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/ParameterDescriptor的read_only标记。
4.6 实战组合拳
光会单个命令还不够,你得学会组合使用。我给你一个我常用的调试流程:
- 先看话题列表:
ros2 topic list,确认所有话题都在 - 检查频率:
ros2 topic hz /关键话题,看频率是否正常 - 监听数据:
ros2 topic echo /关键话题,看数据内容是否合理 - 测带宽:如果感觉卡顿,用
ros2 topic bw看看是不是数据量太大 - 调参数:用
ros2 param set临时调整参数,验证效果后再改代码
这套流程我用了好几年,基本能解决80%的通信问题。你想想看,是不是比打开一堆图形界面快多了?
总结一下: 这四个命令——echo、bw、hz、service call、param get/set——是ROS2调试的基石。别嫌它们简陋,真正用熟了,你会发现它们比任何图形工具都顺手。嗯,今天就先聊到这儿,下一章我们聊聊日志系统,那个也是调试利器。