3、ROS2命令行工具实战:掌握核心CLI工具的使用

说实话,ROS2的命令行工具是我每天打交道最多的东西。你想想看,一个机器人系统跑起来,几十个节点在通信,没有趁手的工具怎么行?我个人习惯是,不管项目多急,先把这些CLI工具玩熟。今天咱们就一个一个来过。

3.1 ros2 node:管理你的节点

节点是ROS2的最小执行单元。每个节点负责一件事,比如控制电机、处理激光数据。我刚开始用ROS2时,经常搞不清系统里到底跑了哪些节点。

常用命令:

# 列出所有节点
ros2 node list

# 查看节点信息
ros2 node info /turtlesim

嗯,这里要注意:节点名前面要加斜杠。这是ROS2的命名规则,跟文件路径有点像。

我的小技巧:ros2 node list 之前,先确认你的节点确实在运行。我曾经花半小时排查一个"不存在"的节点,结果发现是启动脚本没执行。

3.2 ros2 topic:数据通信的命脉

Topic是ROS2里最常用的通信方式。说白了,就是发布者往一个话题上发数据,订阅者从上面收数据。一对多,非常灵活。

核心命令:

# 列出所有话题
ros2 topic list

# 查看话题信息
ros2 topic info /turtle1/cmd_vel

# 实时查看话题数据
ros2 topic echo /turtle1/cmd_vel

# 手动发布话题
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

为什么我要强调 ros2 topic echo?因为调试时太有用了。我在项目中遇到过,机器人走偏了,用echo一看,发现话题里发的速度值根本不对。省去了写测试代码的麻烦。

避坑指南: 发布话题时,消息类型和字段名必须完全匹配。我曾经少写了一个下划线,结果命令执行成功但机器人没反应。后来才发现字段名写错了。

3.3 ros2 service:请求-响应模式

Service跟Topic不一样。Topic是"发了就不管",Service是"你问我答"。适合那些需要确认结果的场景,比如让机器人拍照并返回图片数据。

常用命令:

# 列出服务
ros2 service list

# 查看服务类型
ros2 service type /spawn

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

我个人习惯,在调用服务前先用 ros2 service type 确认一下类型。因为服务名可能重复,但类型不同,调错了会报错。

3.4 ros2 action:长时间任务的好帮手

Action是Service的升级版。适合那些需要很长时间才能完成的任务,比如导航到某个点。你可以随时查询进度,也可以中途取消。

核心命令:

# 列出动作
ros2 action list

# 查看动作信息
ros2 action info /turtle1/rotate_absolute

# 发送动作目标
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
重点: Action有反馈机制。你可以在执行过程中看到"当前转了30度,还剩60度"。这在调试导航、机械臂控制时特别有用。

3.5 ros2 param:动态配置参数

参数就是节点的配置项。比如PID控制器的Kp值、摄像头的帧率。你可以在运行时修改,不用重启节点。

常用命令:

# 列出参数
ros2 param list

# 获取参数值
ros2 param get /turtlesim background_b

# 设置参数值
ros2 param set /turtlesim background_b 255

# 保存参数到文件
ros2 param dump /turtlesim

我曾经在调试机器人底盘时,用 ros2 param set 实时调整PID参数。边调边看机器人反应,比改代码重启快多了。

注意: 不是所有参数都支持运行时修改。有些参数需要节点重启才能生效。用之前最好查一下文档。

3.6 ros2 bag:数据记录与回放

Bag是ROS2的"黑匣子"。你可以记录所有话题数据,然后回放分析。调试时发现问题,先录个bag,回头慢慢看。

核心命令:

# 记录所有话题
ros2 bag record -a

# 记录指定话题
ros2 bag record /turtle1/cmd_vel /turtle1/pose

# 查看bag信息
ros2 bag info rosbag2_2024_01_01-10_00_00

# 回放bag
ros2 bag play rosbag2_2024_01_01-10_00_00
我的经验: 记录bag时别用 -a 记录所有话题。数据量太大,硬盘容易爆。我一般只记录跟问题相关的话题,比如速度指令和位姿数据。

3.7 实战小案例:让海龟动起来

光说不练假把式。咱们用这些工具让turtlesim动起来。

步骤:

  1. 启动海龟模拟器:ros2 run turtlesim turtlesim_node
  2. 新开终端,查看节点:ros2 node list
  3. 查看话题:ros2 topic list
  4. 发布速度指令:ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}" --once
  5. 查看海龟位置:ros2 topic echo /turtle1/pose
  6. 记录数据:ros2 bag record /turtle1/pose
  7. 回放数据:ros2 bag play <bag文件名>

你想想看,用这几个命令,就能控制海龟、查看数据、记录回放。这就是ROS2 CLI工具的魅力。

总结一下: node管进程,topic管数据流,service管请求响应,action管长时间任务,param管配置,bag管记录回放。把这六个工具用熟,ROS2开发就入门了。

嗯,今天就先到这。下一章咱们聊聊如何用launch文件一次性启动多个节点。到时候你会发现,手动敲命令虽然灵活,但launch文件才是真正的效率神器。