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}"
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
-a 记录所有话题。数据量太大,硬盘容易爆。我一般只记录跟问题相关的话题,比如速度指令和位姿数据。
3.7 实战小案例:让海龟动起来
光说不练假把式。咱们用这些工具让turtlesim动起来。
步骤:
- 启动海龟模拟器:
ros2 run turtlesim turtlesim_node - 新开终端,查看节点:
ros2 node list - 查看话题:
ros2 topic list - 发布速度指令:
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 - 查看海龟位置:
ros2 topic echo /turtle1/pose - 记录数据:
ros2 bag record /turtle1/pose - 回放数据:
ros2 bag play <bag文件名>
你想想看,用这几个命令,就能控制海龟、查看数据、记录回放。这就是ROS2 CLI工具的魅力。
嗯,今天就先到这。下一章咱们聊聊如何用launch文件一次性启动多个节点。到时候你会发现,手动敲命令虽然灵活,但launch文件才是真正的效率神器。