🔧 第08课:ROS2 CLI工具

工具与仿真 ✅ Docker验证通过

📋 课程目标

🧠 ROS2 CLI工具体系

ros2 命令体系: ros2 ─┬── action ─ 动作管理 ├── bag ─ 数据录制回放 ├── component ─ 组件管理 ├── daemon ─ 守护进程 ├── doctor ─ 系统诊断 ├── interface ─ 接口查询 ├── launch ─ 启动文件 ├── lifecycle ─ 生命周期 ├── msg ─ 消息定义 ├── node ─ 节点管理 ├── param ─ 参数管理 ├── pkg ─ 包管理 ├── run ─ 运行节点 ├── security ─ 安全管理 ├── service ─ 服务管理 ├── srv ─ 服务定义 ├── topic ─ 话题管理 ├── type ─ 类型查询 └── wtf ─ 诊断别名

📦 包管理 (ros2 pkg)

# 列出所有已安装包
ros2 pkg list

# 查找包含关键字的包
ros2 pkg list | grep nav2

# 查看包的安装路径
ros2 pkg prefix nav2_controller

# 列出包的可执行文件
ros2 pkg executables nav2_controller

# 查看包的XML描述
ros2 pkg xml my_package

# 创建新包
ros2 pkg create my_new_pkg --build-type ament_python --dependencies rclpy std_msgs

# 构建包
colcon build --packages-select my_new_pkg

# 运行包中的节点
ros2 run my_new_pkg my_node

📡 话题管理 (ros2 topic)

# ====== 列出话题 ======
ros2 topic list
ros2 topic list -t  # 显示类型

# ====== 查看话题信息 ======
ros2 topic info /scan
ros2 topic info /scan -v  # 详细信息(含QoS)

# ====== 查看话题数据 ======
ros2 topic echo /scan                    # 实时查看
ros2 topic echo /scan --once             # 只看一条
ros2 topic echo /scan --field ranges     # 只看ranges字段
ros2 topic echo /scan --no-arr           # 不展开数组
ros2 topic echo /cmd_vel --filter "linear.x > 0.1"  # 过滤

# ====== 测量话题性能 ======
ros2 topic hz /scan          # 发布频率
ros2 topic hz /scan --window 100  # 100条滑动窗口
ros2 topic bw /scan          # 带宽使用
ros2 topic delay /scan       # 消息延迟

# ====== 发布消息 ======
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
  "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.3}}"

ros2 topic pub --once /trigger std_msgs/msg/Bool "{data: true}"
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5}}"

# ====== 查看消息类型 ======
ros2 topic type /scan
ros2 topic find sensor_msgs/msg/LaserScan  # 查找使用此类型的话题

🔌 服务管理 (ros2 service)

# 列出所有服务
ros2 service list

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

# 查找使用某类型的服务
ros2 service find example_interfaces/srv/SetBool

# 调用服务
ros2 service call /enable_robot example_interfaces/srv/SetBool "{data: true}"
ros2 service call /get_status std_srvs/srv/Trigger "{}"

# 查看接口定义
ros2 interface show example_interfaces/srv/SetBool

⚡ 动作管理 (ros2 action)

# 列出所有Action
ros2 action list

# 查看Action信息
ros2 action info /navigate_to_pose

# 查看Action类型
ros2 action type /navigate_to_pose

# 发送Action目标
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose \
  "{pose: {header: {frame_id: 'map'}, pose: {position: {x: 2.0, y: 1.0}}}}"

# 发送目标并显示反馈
ros2 action send_goal --feedback /navigate_to_pose nav2_msgs/action/NavigateToPose \
  "{pose: {header: {frame_id: 'map'}, pose: {position: {x: 2.0}}}}"

🎛️ 参数管理 (ros2 param)

# 列出节点参数
ros2 param list /my_node

# 获取参数值
ros2 param get /my_node kp

# 设置参数值
ros2 param set /my_node kp 2.5

# 查看参数描述
ros2 param describe /my_node kp

# 导出参数到YAML
ros2 param dump /my_node

# 从YAML加载参数
ros2 param load /my_node params.yaml

🧩 节点管理 (ros2 node)

# 列出活跃节点
ros2 node list

# 查看节点详细信息(话题/服务/动作/参数)
ros2 node info /my_node

# 查看节点接口描述
ros2 node describe /my_node

📋 接口查询 (ros2 interface)

# 列出所有消息类型
ros2 interface list
ros2 interface list | grep msg   # 只看消息
ros2 interface list | grep srv   # 只看服务
ros2 interface list | grep action # 只看Action

# 查看接口定义
ros2 interface show sensor_msgs/msg/LaserScan
ros2 interface show example_interfaces/srv/SetBool
ros2 interface show nav2_msgs/action/NavigateToPose

# 查看包中的接口
ros2 interface package sensor_msgs

# 回显消息
ros2 interface proto sensor_msgs/msg/LaserScan

🩺 系统诊断 (ros2 doctor)

# 运行系统检查
ros2 doctor

# 详细报告
ros2 doctor --report

# 检查特定类别
ros2 doctor --category network
ros2 doctor --category dds

🔄 生命周期管理 (ros2 lifecycle)

# 获取当前状态
ros2 lifecycle get /my_lifecycle_node

# 列出可用转换
ros2 lifecycle list /my_lifecycle_node

# 触发转换
ros2 lifecycle set /my_lifecycle_node configure
ros2 lifecycle set /my_lifecycle_node activate
ros2 lifecycle set /my_lifecycle_node deactivate
ros2 lifecycle set /my_lifecycle_node cleanup

# 查看节点类型
ros2 lifecycle nodes

📊 CLI调试工作流

🔍 典型调试流程

# Step 1: 检查节点是否运行
ros2 node list

# Step 2: 检查话题是否存在
ros2 topic list

# Step 3: 查看话题数据
ros2 topic echo /scan --once

# Step 4: 检查话题频率
ros2 topic hz /scan

# Step 5: 检查节点连接
ros2 topic info /scan -v

# Step 6: 检查QoS是否匹配
# 如果Publisher是RELIABLE但Subscriber是BEST_EFFORT,不会连接

# Step 7: 检查服务
ros2 service list
ros2 service type /my_service

# Step 8: 检查参数
ros2 param list /my_node

# Step 9: 系统诊断
ros2 doctor --report

💡 实用CLI技巧

一键命令组合

# 查看所有活跃话题的频率
for topic in $(ros2 topic list); do
  echo "=== $topic ==="
  timeout 3 ros2 topic hz "$topic" 2>&1 | tail -1
done

# 查看所有节点的参数
for node in $(ros2 node list); do
  echo "=== $node ==="
  ros2 param list "$node"
done

# 快速测试话题发布
ros2 topic pub --once /test std_msgs/msg/String "{data: 'hello'}"

# 监控特定节点的日志
ros2 topic echo /rosout --filter "name == '/my_node'"

🎯 练习题

📝 练习1:系统诊断

启动多个节点后,使用 ros2 doctor 检查系统健康状态,解读报告内容。

📝 练习2:CLI调试实战

故意创建一个QoS不匹配的情况(Publisher用RELIABLE,Subscriber用BEST_EFFORT),用CLI工具诊断为什么没有数据传输。

📝 练习3:自动化脚本

编写Bash脚本,自动检查指定话题的频率是否在合理范围内,超出阈值时报警。

🏆 成就解锁

🏅 CLI工具大师

经验值:+150 XP