ROS2 入门指南与命令大全(🤖)
适用版本:ROS 2 Humble / Iron / Jazzy
操作系统:Ubuntu 22.04 / 24.04
目录
1、什么是 ROS2?
ROS2(Robot Operating System 2)是一套面向机器人开发的开源中间件框架,并不是一个真正的操作系统,而是运行在 Linux/Windows/macOS 之上的一层通信与工具生态。
ROS1 vs ROS2
| 特性 | ROS 1 | ROS 2 |
|---|---|---|
| 通信中间件 | 自研 TCPROS | DDS(Data Distribution Service) |
| 实时性支持 | × | √ |
| 多平台支持 | 仅 Linux | Linux / Windows / macOS |
| 安全通信 | × | √(SROS2) |
| Python 版本 | Python 2 | Python 3 |
| 主节点依赖 | 需要 rosmaster |
×(去中心化) |
| 生命周期管理 | × | √(Lifecycle Node) |
[‼️]
ROS 1 已于 2025 年 5 月 停止维护,强烈建议所有新项目使用 ROS 2。
2、核心概念速览
ROS2 的架构围绕五个核心通信机制展开:
🔵 节点(Node)
机器人系统的"最小执行单元"。每个节点通常负责一个具体功能(读取激光雷达、控制电机等),节点之间相互独立,通过通信机制协作。
Node 节点示意图:摄像头节点/激光雷达节点/决策节点/电机控制节点,每个节点专注一件事独立运行
🟢 话题(Topic)— 异步发布-订阅
适用于连续数据流,如传感器数据、图像、速度指令。
Topic 话题示意图:摄像头节点向广播塔发布图像,目标检测/录制/显示节点分别订阅,展示异步一对多模式
🟡 服务(Service)— 同步请求-响应
适用于短期、即时的操作,如获取机器人状态、触发一次拍照。
Service 服务示意图:导航节点发请求“给我当前地图”,地图服务节点响应返回数据,展示同步阅塞式请求响应流程
🟠 动作(Action)— 异步长任务
适用于耗时任务,支持进度反馈和中途取消,如"移动到目标点"。
Action 动作示意图:动作客户端发送目标(移动到坐标(3,4)),服务端实时反馈进度并返回最终结果,支持随时取消
🔴 参数(Parameter)
节点内部的运行时配置,可动态读写,如速度上限、PID 系数等。
Parameter 参数示意图:导航节点内部的参数列表(max_speed/safety_distance等),可通过终端命令运行时动态读写,无需重启节点
3、环境配置与工作空间
3.1 加载 ROS2 环境
每次打开新终端都需要 source,或将其写入 ~/.bashrc:
# 加载系统级 ROS2 环境(根据版本替换 humble/iron/jazzy)
source /opt/ros/humble/setup.bash
# 加载本地工作空间(编译后)
source ~/ros2_ws/install/setup.bash
# 永久生效(加入 ~/.bashrc)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
3.2 创建工作空间
# 1. 创建工作空间目录
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
# 2. 编译(首次可为空)
colcon build
# 3. 加载环境
source install/setup.bash
工作空间目录结构:
ros2_ws/
├── src/ ← 放你的功能包源码
├── build/ ← 编译中间文件(自动生成)
├── install/ ← 安装产物(自动生成)
└── log/ ← 编译日志(自动生成)
3.3 创建功能包
cd ~/ros2_ws/src
# Python 包
ros2 pkg create my_pkg --build-type ament_python --dependencies rclpy std_msgs
# C++ 包
ros2 pkg create my_cpp_pkg --build-type ament_cmake --dependencies rclcpp std_msgs
4. ros2 命令大全
所有 ROS2 命令的统一格式:
ros2 <命令> <子命令> [参数]
任何命令加 --help 查看帮助:
ros2 --help
ros2 topic --help
ros2 topic pub --help
4.1 节点管理 ros2 node
| 命令 | 说明 |
|---|---|
ros2 node list |
列出当前所有运行中的节点 |
ros2 node info <节点名> |
查看节点详细信息(订阅/发布的话题、服务等) |
# 示例
ros2 node list
# 输出: /turtlesim
ros2 node info /turtlesim
# 输出:该节点的订阅者、发布者、服务列表
4.2 话题管理 ros2 topic
| 命令 | 说明 |
|---|---|
ros2 topic list |
列出所有活动话题 |
ros2 topic list -t |
列出所有话题及其消息类型 |
ros2 topic echo <话题名> |
实时打印话题数据 |
ros2 topic info <话题名> |
查看话题的发布者/订阅者数量和类型 |
ros2 topic hz <话题名> |
查看话题发布频率(Hz) |
ros2 topic bw <话题名> |
查看话题带宽占用 |
ros2 topic pub <话题> <类型> <数据> |
手动向话题发布一条消息 |
ros2 topic pub --rate <hz> ... |
以指定频率持续发布 |
ros2 topic pub --once ... |
仅发布一次 |
# 示例:让小乌龟移动
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}}"
# 以 1Hz 持续发布
ros2 topic pub --rate 1 /chatter std_msgs/msg/String "data: 'Hello ROS2'"
# 查看 IMU 数据
ros2 topic echo /imu/data
# 查看摄像头话题频率
ros2 topic hz /camera/image_raw
4.3 服务管理 ros2 service
| 命令 | 说明 |
|---|---|
ros2 service list |
列出所有活动服务 |
ros2 service list -t |
列出服务及其类型 |
ros2 service type <服务名> |
查看指定服务的类型 |
ros2 service call <服务名> <类型> <参数> |
调用一个服务 |
ros2 service find <类型> |
查找某类型的服务 |
# 示例:在小乌龟仿真中生成一只新乌龟
ros2 service call /spawn turtlesim/srv/Spawn \
"{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"
# 清空画布
ros2 service call /clear std_srvs/srv/Empty
4.4 动作管理 ros2 action
| 命令 | 说明 |
|---|---|
ros2 action list |
列出所有活动动作 |
ros2 action list -t |
列出动作及其类型 |
ros2 action info <动作名> |
查看动作的详细信息 |
ros2 action send_goal <动作名> <类型> <目标> |
发送动作目标 |
ros2 action send_goal --feedback ... |
发送目标并显示反馈 |
# 示例:控制小乌龟旋转到指定角度
ros2 action send_goal --feedback /turtle1/rotate_absolute \
turtlesim/action/RotateAbsolute "{theta: 1.57}"
4.5 参数管理 ros2 param
| 命令 | 说明 |
|---|---|
ros2 param list |
列出所有节点的参数 |
ros2 param list <节点名> |
列出指定节点的参数 |
ros2 param get <节点名> <参数名> |
获取参数值 |
ros2 param set <节点名> <参数名> <值> |
动态设置参数值 |
ros2 param dump <节点名> |
将节点参数导出为 YAML 文件 |
ros2 param load <节点名> <文件> |
从 YAML 文件加载参数 |
# 查看小乌龟节点的参数
ros2 param list /turtlesim
# 获取背景颜色参数
ros2 param get /turtlesim background_r
# 修改背景颜色(0-255)
ros2 param set /turtlesim background_r 150
ros2 param set /turtlesim background_g 0
ros2 param set /turtlesim background_b 200
# 导出参数到文件
ros2 param dump /turtlesim > turtlesim_params.yaml
# 从文件加载参数
ros2 param load /turtlesim turtlesim_params.yaml
4.6 功能包管理 ros2 pkg
| 命令 | 说明 |
|---|---|
ros2 pkg list |
列出所有可用功能包 |
ros2 pkg create <包名> |
创建新功能包 |
ros2 pkg executables <包名> |
列出包内所有可执行文件 |
ros2 pkg prefix <包名> |
查看包的安装路径 |
ros2 pkg xml <包名> |
查看包的 package.xml 内容 |
ros2 run <包名> <可执行文件> |
运行功能包中的某个节点 |
# 运行小乌龟仿真
ros2 run turtlesim turtlesim_node
# 运行小乌龟键盘控制
ros2 run turtlesim turtle_teleop_key
# 列出 turtlesim 所有可执行文件
ros2 pkg executables turtlesim
# 创建一个 Python 包
ros2 pkg create my_robot --build-type ament_python \
--dependencies rclpy geometry_msgs nav_msgs
4.7 接口查看 ros2 interface
| 命令 | 说明 |
|---|---|
ros2 interface list |
列出所有可用接口(msg/srv/action) |
ros2 interface show <接口名> |
查看接口定义 |
ros2 interface package <包名> |
查看某包的所有接口 |
ros2 interface packages |
列出所有含接口的包 |
# 查看 Twist 消息结构(速度控制)
ros2 interface show geometry_msgs/msg/Twist
# 查看 LaserScan 消息结构(激光雷达)
ros2 interface show sensor_msgs/msg/LaserScan
# 查看服务定义
ros2 interface show turtlesim/srv/Spawn
# 查看动作定义
ros2 interface show nav2_msgs/action/NavigateToPose
4.8 数据录制与回放 ros2 bag
这是机器人开发中非常重要的调试工具,可以录制传感器数据用于离线重现和测试。
| 命令 | 说明 |
|---|---|
ros2 bag record -a |
录制所有话题 |
ros2 bag record <话题1> <话题2> |
录制指定话题 |
ros2 bag record -a -o <文件名> |
录制所有话题并指定输出目录名 |
ros2 bag info <路径> |
查看 bag 文件信息(话题、时长、消息数) |
ros2 bag play <路径> |
回放 bag 数据 |
ros2 bag play <路径> --clock |
回放时发布仿真时钟(配合 rviz 使用) |
ros2 bag play <路径> --rate <倍速> |
以指定倍速回放(如 0.5 为半速) |
ros2 bag play <路径> --loop |
循环回放 |
# 录制激光雷达和里程计数据
ros2 bag record /scan /odom -o robot_data
# 查看录制文件信息
ros2 bag info robot_data/
# 以半速回放
ros2 bag play robot_data/ --rate 0.5 --clock
4.9 启动系统 ros2 launch
launch 文件用于一次性启动多个节点,并传入配置参数。
| 命令 | 说明 |
|---|---|
ros2 launch <包名> <launch文件> |
运行启动文件 |
ros2 launch <包名> <launch文件> <参数>:=<值> |
带参数运行 |
# 启动导航栈
ros2 launch nav2_bringup navigation_launch.py
# 启动带参数的 launch
ros2 launch my_robot robot.launch.py use_sim_time:=true map:=my_map.yaml
# 查看 launch 文件可用参数
ros2 launch my_robot robot.launch.py --show-args
4.10 环境与守护进程
# 设置域 ID(隔离同一局域网内不同机器人)
export ROS_DOMAIN_ID=42
# 限制仅本机通信
export ROS_LOCALHOST_ONLY=1
# 查看守护进程状态(加速 ros2 node list 等命令)
ros2 daemon status
# 启动/停止/重启守护进程
ros2 daemon start
ros2 daemon stop
# 查看 ROS2 doctor(系统健康检查)
ros2 doctor
# 查看 wtf(等价于 ros2 doctor --report)
ros2 doctor --report
5、构建工具 colcon
colcon 是 ROS2 官方推荐的构建工具,替代了 ROS1 的 catkin_make。
| 命令 | 说明 |
|---|---|
colcon build |
构建工作空间所有包 |
colcon build --packages-select <包名> |
只构建指定包 |
colcon build --packages-up-to <包名> |
构建指定包及其所有依赖 |
colcon build --symlink-install |
软链接安装(Python 修改无需重新编译) |
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release |
以 Release 模式编译 |
colcon test |
运行所有测试 |
colcon test --packages-select <包名> |
运行指定包的测试 |
colcon test-result |
查看测试结果 |
colcon graph |
显示包依赖关系图 |
# 日常开发推荐命令
colcon build --symlink-install
# 只编译某个包(节省时间)
colcon build --packages-select my_robot --symlink-install
# 清理构建产物(谨慎使用)
rm -rf build/ install/ log/
[💡]
--symlink-install对 Python 包尤其有用!修改 Python 源文件后无需重新colcon build,直接运行即可看到效果。
6、可视化与调试工具
6.1 rqt — 模块化 GUI 工具箱
# 启动 rqt 主界面(可在菜单中加载各种插件)
rqt
# 查看节点与话题关系图(最常用!)
rqt_graph
# 实时数值绘图(调试 PID 等)
rqt_plot
# 查看日志
rqt_console
# 动态调参(无需重启节点)
rqt_reconfigure
6.2 rviz2 — 三维可视化
# 启动 RViz2
rviz2
# 以仿真时间启动(配合 rosbag 回放使用)
rviz2 --ros-args -p use_sim_time:=true
# 加载配置文件启动
rviz2 -d my_config.rviz
常用 RViz2 显示类型:
| 显示类型 | 用途 |
|---|---|
RobotModel |
显示机器人 URDF 模型 |
LaserScan |
显示激光雷达点云 |
PointCloud2 |
显示 3D 点云(如 LiDAR) |
Image |
显示相机图像 |
Map |
显示 2D 栅格地图 |
Path |
显示规划路径 |
TF |
显示坐标变换关系 |
Marker |
显示自定义标记物 |
6.3 Gazebo — 物理仿真
# 启动现代 Gazebo (Harmonic/Garden)
gz sim
# 启动空场景
gz sim empty.sdf
# 通过 launch 文件启动(推荐)
ros2 launch ros_gz_sim gz_sim.launch.py gz_args:=empty.sdf
# ROS2 与 Gazebo 通信桥接
ros2 run ros_gz_bridge parameter_bridge \
/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist
7、实战:第一个 Hello ROS2
Step 1:启动小乌龟示例
# 终端 1:启动小乌龟仿真
ros2 run turtlesim turtlesim_node
# 终端 2:启动键盘控制
ros2 run turtlesim turtle_teleop_key

Step 2:观察系统状态
# 查看节点列表
ros2 node list
# /turtlesim
# /teleop_turtle
# 查看话题列表
ros2 topic list -t
# /turtle1/cmd_vel [geometry_msgs/msg/Twist]
# /turtle1/pose [turtlesim/msg/Pose]
# 实时查看位置
ros2 topic echo /turtle1/pose
# 查看指令频率
ros2 topic hz /turtle1/cmd_vel

Step 3:手动控制
# 让乌龟直线移动(线速度 2.0)
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 2.0}, angular: {z: 0.0}}"
# 让乌龟旋转
ros2 topic pub --rate 2 /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.5}, angular: {z: 1.0}}"
# 清空画布
ros2 service call /clear std_srvs/srv/Empty
# 产生第二只乌龟
ros2 service call /spawn turtlesim/srv/Spawn \
"{x: 5.0, y: 5.0, theta: 1.57, name: 'turtle2'}"

Step 4:可视化
# 查看节点拓扑图
rqt_graph
# 绘制位置变化曲线
rqt_plot /turtle1/pose/x /turtle1/pose/y

8、常用技巧与最佳实践
Tab 补全
确保安装了 argcomplete 并加入 shell,可以对所有 ros2 命令使用 Tab 补全:
sudo apt install python3-argcomplete
快速定位话题/节点
# 模糊过滤(用 grep)
ros2 topic list | grep camera
ros2 node list | grep robot
# 查看完整的节点信息
ros2 node info /my_node
多机通信
# 机器 A(主机)
export ROS_DOMAIN_ID=10
ros2 run turtlesim turtlesim_node
# 机器 B(同一局域网,同一 DOMAIN_ID)
export ROS_DOMAIN_ID=10
ros2 topic list # 可以看到机器 A 的话题!
参数文件(YAML)
# params.yaml
my_node:
ros__parameters:
speed: 1.5
max_distance: 10.0
frame_id: "base_link"
# 启动节点时加载参数文件
ros2 run my_pkg my_node --ros-args --params-file params.yaml
仿真时间
# 节点使用仿真时间(配合 rosbag 或 Gazebo)
ros2 run my_pkg my_node --ros-args -p use_sim_time:=true
快速查命令帮助
# 不记得命令时,先 --help
ros2 topic pub --help
ros2 bag record --help
colcon build --help
参考资源
| 资源 | 链接 |
|---|---|
| 官方文档 | https://docs.ros.org/en/humble/ |
| 官方教程 | https://docs.ros.org/en/humble/Tutorials.html |
| ROS2 社区 | https://discourse.ros.org/ |
| ROS Answers | https://answers.ros.org/ |
| GitHub | https://github.com/ros2 |
| 中文社区 | https://www.guyuehome.com/ |
[📚]
本文命令基于 ROS 2 Humble 版本整理。不同版本之间命令基本兼容,如遇差异请参考对应版本的官方文档。

浙公网安备 33010602011771号