常用命令
这是一份关于 ROS2 (Robot Operating System 2) 常用命令行工具的详细全面指南。本指南旨在帮助你从零开始,系统地掌握 ROS2 的核心命令行操作,涵盖环境准备、节点管理、话题通信、服务调用、参数配置、数据录制与回放,以及包管理与工作空间构建。内容将按照逻辑顺序编排,并提供清晰的步骤和命令解释。
ROS2 常用命令行完整指南 ¶
核心提示:环境配置 ¶
在开始任何 ROS2 操作之前,最关键的一步是设置环境变量。这告诉你的系统去哪里找到 ROS2 的命令和功能包。每次打开一个新的终端,都需要执行以下命令(假设你使用的是 ROS2 的 Jazzy 版本
# 替换 .bash 为你使用的 shell (如 .zsh)
<div markdown="1" style="margin-top: -30px; font-size: 0.75em; opacity: 0.7;">
:material-circle-edit-outline: 约 2691 个字 :fontawesome-solid-code: 72 行代码 :material-clock-time-two-outline: 预计阅读时间 11 分钟
</div>
source /opt/ros/jazzy/setup.bash
如果你创建并构建了自己的工作空间(workspace
# source ~/your_ws/install/setup.bash
获取帮助:任何时候不确定命令的用法,都可以使用 -h 或 --help 参数。
ros2 -h
ros2 <command> -h # 例如: ros2 node -h
ros2 <command> <verb> -h # 例如: ros2 topic echo -h
这会显示该命令所有可用的子命令和参数 。
环境与诊断 ¶
在正式工作前,先确保环境健康。
- 查看环境变量
- 命令:
printenv | grep -i ros - 作用: 显示所有包含 "ros" 的环境变量,确认
ROS_DOMAIN_ID、AMENT_PREFIX_PATH等是否正确设置。 - 示例:
- 命令:
printenv | grep -i ros
# 输出示例:
# ROS_DISTRO=jazzy
# AMENT_PREFIX_PATH=/opt/ros/jazzy
# ...
- 运行诊断工具
- 命令:
ros2 doctor - 作用: 快速检查 ROS2 系统的常见问题,如环境配置、网络设置等。
- 详细报告:
ros2 doctor --report会生成一份更全面的报告,有助于定位复杂问题 。
- 命令:
- 管理后台守护进程 (Daemon)
- 命令:
ros2 daemon status:查看守护进程状态。ros2 daemon stop:停止守护进程。ros2 daemon start:启动守护进程。
- 作用: ROS2 CLI 工具使用守护进程来缓存节点信息,加快发现速度。如果发现
ros2 node list显示的信息长时间不更新,可以尝试停止并重启守护进程 。
- 命令:
核心概念与操作 ¶
这部分是 ROS2 CLI 的核心,涵盖了构建机器人应用的基础通信机制。
节点 (Node) 管理 ¶
节点是执行特定计算任务的进程。一个机器人系统通常由许多节点组成 。
- 运行一个节点
- 命令:
ros2 run <package_name> <executable_name> - 作用: 从指定的功能包中启动一个可执行文件,从而运行一个或多个节点 。
- 示例: 启动经典的乌龟模拟器节点。
- 命令:
ros2 run turtlesim turtlesim_node
- 列出所有运行中的节点
- 命令:
ros2 node list - 作用: 查看当前系统中所有活动的节点名称 。
- 示例: 在另一个终端运行键盘控制节点后,再次查看。
- 命令:
# 新终端
ros2 run turtlesim turtle_teleop_key
# 再开一个新终端
ros2 node list
# 输出:
# /turtlesim
# /teleop_turtle
- 查看节点信息
- 命令:
ros2 node info <node_name> - 作用: 获取指定节点的详细信息,包括它发布和订阅的话题、提供的服务和动作、连接的对方节点等 。
- 示例: 查看
/turtlesim节点的信息。
- 命令:
ros2 node info /turtlesim
# 输出会列出其订阅的 /turtle1/cmd_vel, 发布的 /turtle1/pose 等话题
- 重映射节点属性
- 命令:
ros2 run <package_name> <executable_name> --ros-args --remap <name>:=<new_name> - 作用: 在启动节点时,动态地修改其内部的名称,如节点名、话题名、服务名等,以避免命名冲突或实现灵活配置 。
- 示例: 将
turtlesim_node的节点名重命名为my_turtle。
- 命令:
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
话题 (Topic) 管理 ¶
话题是节点间异步通信的“总线”。一个节点将数据作为“消息”发布到一个话题上,另一个节点则订阅该话题以接收数据 。
- 列出所有活动话题
- 命令:
ros2 topic listros2 topic list -t
- 作用: 显示当前系统中所有活跃的话题。
-t选项可以在列表后附加显示消息类型 。 - 示例:
- 命令:
ros2 topic list -t
# 输出示例:
# /turtle1/cmd_vel [geometry_msgs/msg/Twist]
# /turtle1/pose [turtlesim/msg/Pose]
- 查看话题上的数据流
- 命令:
ros2 topic echo <topic_name> - 作用: 实时打印话题上发布的消息内容,是调试传感器数据、控制指令最常用的命令 。
- 示例: 在运行键盘控制节点的终端里按方向键,这里会实时显示速度指令数据。
- 命令:
ros2 topic echo /turtle1/cmd_vel
- 查看话题信息
- 命令:
ros2 topic info <topic_name> [-v] - 作用: 显示话题的类型,以及有多少发布者和订阅者。加上
-v(verbose) 可以列出这些发布者和订阅者的具体名称 。 - 示例:
- 命令:
ros2 topic info /turtle1/cmd_vel -v
- 查看消息发布频率
- 命令:
ros2 topic hz <topic_name> - 作用: 统计话题上消息发布的平均频率、最大 / 最小时间间隔等,常用于分析系统性能 。
- 示例:
- 命令:
ros2 topic hz /turtle1/pose
- 手动发布话题消息
- 命令:
ros2 topic pub <topic_name> <msg_type> '<data>' - 作用: 直接从命令行向指定话题发布数据,非常适合测试订阅者节点。可以使用
-r <频率>选项以固定频率持续发布,或使用--once只发布一次 。 - 示例: 让海龟转圈(数据格式为 YAML
) 。
- 命令:
ros2 topic pub --once /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 interface show <msg_type> - 作用: 显示消息类型的详细结构(字段名和类型
) ,在编写代码或手动发布消息时,必须知道消息的格式 。 - 示例:
- 命令:
ros2 interface show geometry_msgs/msg/Twist
服务 (Service) 管理 ¶
服务是一种基于“请求 - 响应”的同步通信机制,用于一次性任务,例如查询状态或执行一个快速动作 。
- 列出所有服务
- 命令:
ros2 service list - 作用: 显示当前系统中所有可用的服务 。
- 命令:
- 查看服务类型
- 命令:
ros2 service type <service_name> - 作用: 查看指定服务使用的请求 / 响应数据类型。
- 命令:
- 调用服务
- 命令:
ros2 service call <service_name> <service_type> '<request_data>' - 作用: 从命令行调用一个服务,并发送请求数据,然后等待并显示响应 。
- 示例: 在乌龟模拟器中生成一个新海龟。
- 命令:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.2, name: 'turtle2'}"
参数 (Parameter) 管理 ¶
参数是节点的配置项,可以在启动时设置,也可以在运行时动态修改 。
- 列出节点的参数
- 命令:
ros2 param list <node_name> - 作用: 查看指定节点所有可用的参数名称 。
- 命令:
- 获取参数值
- 命令:
ros2 param get <node_name> <param_name> - 作用: 读取参数的当前值 。
- 示例: 获取
/turtlesim节点中背景色的绿色通道值。
- 命令:
ros2 param get /turtlesim background_g
- 设置参数值
- 命令:
ros2 param set <node_name> <param_name> <value> - 作用: 在运行时动态修改参数的值(需要节点支持动态参数
) 。 - 示例: 立即将背景色改为偏红色。
- 命令:
ros2 param set /turtlesim background_r 150
- 导出 / 导入参数到文件
- 命令:
ros2 param dump <node_name>ros2 param load <node_name> <yaml_file>
- 作用:
dump将节点当前的所有参数保存到一个 YAML 文件中。load则从文件批量加载参数,方便下次启动时复现相同的配置。
- 命令:
动作 (Action) 管理 ¶
动作是用于长时间执行任务的通信机制,它结合了服务(用于发送目标和获取结果)和话题(用于提供周期性反馈)的特点 。
- 列出所有动作
- 命令:
ros2 action list - 作用: 显示系统中所有可用的动作 。
- 附加类型:
ros2 action list -t可以显示动作的类型。
- 命令:
- 查看动作信息
- 命令:
ros2 action info <action_name> - 作用: 查看指定动作的客户端和服务器端信息 。
- 命令:
- 发送动作目标
- 命令:
ros2 action send_goal <action_name> <action_type> '<goal_data>' [--feedback] - 作用: 向动作服务器发送一个目标请求。添加
--feedback选项可以实时查看服务器返回的反馈信息 。 - 示例: 让乌龟旋转 90 度(1.57 弧度
) ,并查看反馈。
- 命令:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "theta: 1.57" --feedback
具集与数据管理 ¶
这部分介绍 ROS2 中强大的辅助工具,它们能帮助你更好地理解、调试和记录系统状态。
- 启动多个节点 (Launch)
- 命令:
ros2 launch <package_name> <launch_file.py> - 作用: 通过一个 Python 编写的 launch 文件,一次性启动预先定义好的多个节点、参数、配置文件等,极大地简化了复杂系统的启动过程 。
- 示例:
- 命令:
ros2 launch turtlesim multisim.launch.py
- 可视化节点关系图 (rqt_graph)
- 命令:
rqt_graph或在rqt主界面中通过Plugins->Introspection->Node Graph打开。 - 作用: 以图形化的方式显示所有运行中的节点以及它们之间通过话题连接的关系,是理解系统架构最直观的工具 。
- 命令:
- 查看日志 (rqt_console)
- 命令:
ros2 run rqt_console rqt_console或在rqt中打开。 - 作用: 集中显示所有节点的日志输出,支持按日志级别(Debug、Info、Warn、Error
) 、节点名称等进行过滤,是调试的利器 。
- 命令:
- 录制与回放数据 (ros2 bag)
- 命令:
- 录制:
ros2 bag record <topic1> <topic2> ...或ros2 bag record -a(录制所有话题) - 查看信息:
ros2 bag info <bag_directory> - 回放:
ros2 bag play <bag_directory>
- 录制:
- 作用: 将话题上发布的数据流录制到文件中,之后可以精确地回放这些数据,仿佛真实的传感器数据再次发布一样。这对于调试、测试和算法开发来说是非常宝贵的工具 。
- 示例:
- 命令:
# 录制乌龟的位置和速度话题
ros2 bag record /turtle1/pose /turtle1/cmd_vel
# 回放录制的内容
ros2 bag play rosbag2_2025_01_01-12_00_00/
- 3D 可视化工具 (RViz2)
- 命令:
rviz2或ros2 run rviz2 rviz2 - 作用: 强大的 3D 可视化工具,用于显示机器人模型(URDF
) 、传感器数据(如激光雷达点云、图像、点云) 、地图、路径规划、TF 坐标变换等 。
- 命令:
第四部分:包管理与工作空间 ¶
当你开始编写自己的代码时,就需要创建和管理自己的工作空间。
- 创建工作空间
- 步骤:
- 创建工作空间目录和源代码目录
src:mkdir -p ~/ros2_ws/src - 进入 src 目录:
cd ~/ros2_ws/src
- 创建工作空间目录和源代码目录
- 步骤:
- 创建新功能包
- 命令:
- C++ 包:
ros2 pkg create --build-type ament_cmake <package_name> - Python 包:
ros2 pkg create --build-type ament_python <package_name>
- C++ 包:
- 作用: 在
src目录下生成一个标准格式的新功能包,包含必要的package.xml、CMakeLists.txt或setup.py等文件 。 - 可选参数: 可以添加
--dependencies <依赖列表>来直接声明依赖,--node-name <节点名>来创建一个简单的初始节点文件 。 - 示例:
- 命令:
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_py_pkg --dependencies rclpy
- 构建工作空间
- 命令:
colcon build - 作用: 在工作空间根目录
~/ros2_ws/下执行,编译 src 目录下的所有功能包,并生成build、install、log目录 。 - 常用选项:
--packages-select <package_name>:只编译指定的一个或多个包,节省时间 。--symlink-install:使用符号链接安装 Python 节点,修改 Python 文件后无需重新编译。
- 命令:
- 配置工作空间环境
- 命令:
source install/setup.bash - 作用: 每次在新终端中使用自己编译的节点或功能包前,都需要 source 工作空间的 setup 文件,这样才能让你的系统找到它们 。
- 命令:
- 解析包依赖
- 命令:
rosdep install -i --from-path src --rosdistro <distro> -y - 作用: 在工作空间根目录下运行,根据各功能包
package.xml中声明的依赖,自动安装系统中缺少的依赖项 。
- 命令:
总结:ROS2 CLI 工作流 ¶
下图总结了使用 ROS2 命令行工具进行开发和调试的典型工作流程:
flowchart TD
A[开始] --> B{环境准备};
B --> B1[source ROS2环境];
B1 --> B2[设置ROS_DOMAIN_ID];
B2 --> C{核心操作};
C --> C1[运行节点 ros2 run];
C --> C2[查看节点 ros2 node];
C --> C3[监控话题 ros2 topic];
C --> C4[调用服务 ros2 service];
C --> C5[配置参数 ros2 param];
C1 & C2 & C3 & C4 & C5 --> D[可视化调试];
D --> D1[rqt_graph 节点关系图];
D --> D2[rviz2 3D可视化];
D --> D3[rqt_console 日志过滤];
D --> E[数据管理];
E --> E1[ros2 bag record 录制数据];
E --> E2[ros2 bag play 回放数据];
E2 --> F[分析与改进];
F --> C;
F --> G[开发与构建];
G --> G1[ros2 pkg create 创建包];
G1 --> G2[编写节点代码];
G2 --> G3[colcon build 编译];
G3 --> G4[source install/setup.bash];
G4 --> C;
通过熟练掌握上述命令,你将能够有效地与 ROS2 系统进行交互,无论是调试现有的功能包,还是构建自己复杂的机器人应用。请记住,-h 参数是你最好的伙伴,它能为你提供任何命令的即时帮助。