4、ROS命令行工具:rosrun、roslaunch、rostopic、rosservice、rosnode、rosparam

说实话,很多新手学ROS,一上来就被各种launch文件、节点通信搞懵了。我当年也是这么过来的。但后来我发现,只要把这几个命令行工具玩熟了,整个ROS的骨架就清晰了。今天我就带你挨个过一遍,每个工具我都会结合我实际踩过的坑来讲。

4.1 rosrun:启动单个节点

rosrun 是最基础的启动命令。它的格式很简单:

rosrun [包名] [节点名] [可选参数]

比如启动小乌龟:

rosrun turtlesim turtlesim_node

我在项目中遇到过一个问题:有次我同时启动了多个同类型的节点,结果发现它们都在抢同一个话题。后来我才意识到,rosrun 默认不会帮你做节点重映射。你需要手动加 __name:=my_node 来区分。

小技巧: 如果你想让节点在后台运行,可以加个 & 符号。但我个人习惯用 roslaunch 来管理多个节点,更省心。

4.2 roslaunch:批量启动的利器

roslaunch 说白了就是 rosrun 的升级版。它通过一个 .launch 文件,一次性启动多个节点。你想想看,如果每次都要手动敲十几个 rosrun,那得多崩溃。

一个典型的launch文件长这样:

<launch>
  <node name="turtle1" pkg="turtlesim" type="turtlesim_node"/>
  <node name="keyboard" pkg="turtlesim" type="turtle_teleop_key"/>
</launch>

然后执行:

roslaunch my_package my_launch.launch

嗯,这里要注意:roslaunch 会自动启动 roscore,所以你不用再单独敲 roscore 了。我曾经有个同事,每次都用 rosrun 启动节点,然后忘了开 roscore,卡了半天才反应过来。

避坑指南: 我曾经在launch文件里写错了包名,结果 roslaunch 报错说找不到节点。排查了半天才发现是拼写错误。建议你写launch文件时,先用 rosrun 测试一下节点能不能单独启动。

4.3 rostopic:话题的侦察兵

rostopic 是我调试时用得最多的工具。它能让你看到话题里到底在传什么数据。常用命令有:

命令 作用
rostopic list 列出所有活跃话题
rostopic echo /topic_name 打印话题数据
rostopic pub /topic_name msg_type data 手动发布话题
rostopic hz /topic_name 查看话题发布频率

举个例子,你想看看小乌龟的位置数据:

rostopic echo /turtle1/pose

为什么会用到 rostopic pub?我记得有一次,我写了一个导航节点,但小车死活不动。我怀疑是话题没发出去。于是我用 rostopic pub 手动发了一个速度指令:

rostopic pub /cmd_vel geometry_msgs/Twist "linear:
  x: 0.5
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.5"

结果小车动了!说明我的节点有问题,而不是话题通信的问题。你看,一个命令就帮我定位了问题。

核心要点: rostopic echo 是调试的「第一把钥匙」。只要你能看到数据在流动,就说明通信没问题。

4.4 rosservice:远程调用的开关

话题是「发布-订阅」模式,而服务是「请求-响应」模式。说白了,话题是持续的数据流,服务是你叫它一声,它回你一句。

常用命令:

  • rosservice list — 列出所有服务
  • rosservice call /service_name args — 调用服务
  • rosservice info /service_name — 查看服务详情

比如重置小乌龟的位置:

rosservice call /reset

我建议你多试试 rosservice call。它就像是一个遥控器,能直接触发节点里的某个功能。我在做机械臂项目时,经常用这个命令来测试夹爪的开关。

4.5 rosnode:节点的户口本

rosnode 用来查看和管理节点。常用命令:

  • rosnode list — 列出所有节点
  • rosnode info /node_name — 查看节点详细信息
  • rosnode kill /node_name — 杀掉节点

举个例子:

rosnode info /turtlesim

它会告诉你这个节点发布了哪些话题、订阅了哪些话题、提供了哪些服务。嗯,这在你调试时特别有用。有一次我发现小车不动,用 rosnode info 一看,发现节点根本没订阅 /cmd_vel 话题,原来是节点启动参数配错了。

小技巧: 如果你发现节点启动后没反应,先用 rosnode list 看看它有没有在列表里。如果不在,说明节点根本没启动成功。

4.6 rosparam:参数服务器的小管家

rosparam 用来操作参数服务器。你可以把它理解成一个全局的配置中心。常用命令:

命令 作用
rosparam list 列出所有参数
rosparam get /param_name 获取参数值
rosparam set /param_name value 设置参数值
rosparam dump file.yaml 保存所有参数到文件
rosparam load file.yaml 从文件加载参数

比如设置小乌龟的背景颜色:

rosparam set /turtlesim/background_r 255

我个人习惯把参数都写在YAML文件里,然后用 rosparam load 一次性加载。这样改参数时不用改代码,方便多了。我曾经在一个项目中,因为参数写死在代码里,每次调参都要重新编译,折腾了好几天。后来改用参数服务器,效率翻倍。

核心要点: 参数服务器适合存放「不会频繁变化但需要全局访问」的配置,比如PID参数、传感器阈值等。别把大块数据往里塞,它毕竟不是数据库。

总结一下

这六个工具,说白了就是ROS的「六脉神剑」:

  • rosrun — 单节点启动
  • roslaunch — 多节点批量启动
  • rostopic — 看数据流
  • rosservice — 远程调用
  • rosnode — 查节点状态
  • rosparam — 管配置

你想想看,只要把这些工具用熟了,ROS在你面前就没有秘密了。遇到问题,先用 rostopic echo 看数据,再用 rosnode info 查节点,最后用 rosparam get 确认参数。这套组合拳打下来,90%的问题都能定位。

下一章,我会带你实战搭建一个完整的小车导航系统。到时候这些工具都会派上用场。