ROS 2 是机器人软件开发里常见的基础框架,用来组织节点、话题、服务、动作、参数、坐标变换和数据记录。它不是一个单独的库,而是一套让机器人模块协作的通信和工程体系。
如果只是做普通物联网设备,MQTT、HTTP、串口协议可能已经足够;如果项目里有传感器融合、运动控制、地图、导航、机械臂、仿真、多个进程协同,ROS 2 会更合适。
官方入口
版本怎么选
截至 2026-05,ROS 2 仍然建议按 Ubuntu 版本选择发行版,不要随意混装。
| 系统 | 建议发行版 | 说明 |
|---|---|---|
| Ubuntu 26.04 | Lyrical |
最新稳定发行版,适合新机器和新项目 |
| Ubuntu 24.04 | Jazzy |
长期维护周期较长,资料和生态更稳 |
| Ubuntu 22.04 | Humble |
老项目常见,适合维护已有环境 |
| Ubuntu 20.04 | ROS 1 Noetic / 旧 ROS 2 | 不建议新项目继续从这里开始 |
新手如果电脑是 Ubuntu 24.04,优先选择 Jazzy;如果已经是 Ubuntu 26.04,再选择 Lyrical。
ROS 2 核心概念
| 概念 | 作用 |
|---|---|
| Node | 节点,一个独立功能进程或组件 |
| Topic | 话题,发布订阅模型,适合连续数据 |
| Service | 服务,请求响应模型,适合一次性调用 |
| Action | 动作,适合耗时任务,比如导航到目标点 |
| Parameter | 参数,运行时配置 |
| Message | 消息类型,定义话题传输的数据结构 |
| Launch | 启动文件,一次启动多个节点和配置 |
| Bag | 数据录制与回放,常用于调试传感器数据 |
| tf2 | 坐标变换系统,维护机器人各坐标系关系 |
可以把 ROS 2 理解成:很多小节点通过 Topic、Service、Action 互相通信,再由 Launch 统一启动,由 Bag 记录现场数据,由 tf2 管理坐标关系。
Ubuntu 24.04 安装 Jazzy
先确认系统版本:
1 | lsb_release -a |
配置 UTF-8 环境:
1 | locale |
启用基础软件源,并添加 ROS 2 apt 源:
1 | sudo apt install software-properties-common |
安装 ROS 2:
1 | sudo apt update |
desktop 包包含 RViz、示例和常用桌面工具。服务器环境可以只装基础包:
1 | sudo apt install ros-jazzy-ros-base |
Ubuntu 26.04 安装 Lyrical
如果使用 Ubuntu 26.04,把上面的安装包名称换成 lyrical:
1 | sudo apt install ros-lyrical-desktop |
环境文件也要对应切换:
1 | source /opt/ros/lyrical/setup.bash |
不要在一个终端里同时 source 多个发行版,否则后面排查会非常痛苦。
配置环境变量
临时生效:
1 | source /opt/ros/jazzy/setup.bash |
长期生效:
1 | echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc |
如果你使用 zsh:
1 | echo "source /opt/ros/jazzy/setup.zsh" >> ~/.zshrc |
检查命令是否可用:
1 | ros2 --help |
首次使用依赖解析工具时,初始化 rosdep:
1 | sudo rosdep init |
如果提示已经初始化过,后续只需要执行 rosdep update。
跑通第一个示例
开两个终端,每个终端都要先 source 环境。
终端一:
1 | source /opt/ros/jazzy/setup.bash |
终端二:
1 | source /opt/ros/jazzy/setup.bash |
如果 talker 不断输出 Publishing,listener 不断输出 I heard,说明 C++ 和 Python 的基础通信都跑通了。
常用命令速查
| 命令 | 作用 |
|---|---|
ros2 node list |
查看节点 |
ros2 node info /node_name |
查看节点信息 |
ros2 topic list |
查看话题 |
ros2 topic echo /topic |
打印话题数据 |
ros2 topic info /topic |
查看话题类型和连接数量 |
ros2 interface show std_msgs/msg/String |
查看消息结构 |
ros2 service list |
查看服务 |
ros2 service call /service type "{}" |
调用服务 |
ros2 action list |
查看动作 |
ros2 param list |
查看参数 |
ros2 param get /node param_name |
获取参数 |
ros2 launch package file.launch.py |
启动 launch 文件 |
ros2 bag record /topic |
录制话题 |
ros2 bag play bag_dir |
回放 bag |
创建工作空间
ROS 2 项目通常放在 workspace 里,源码放进 src。
1 | mkdir -p ~/ros2_ws/src |
初始化依赖:
1 | rosdep update |
构建:
1 | colcon build |
让当前终端识别这个工作空间:
1 | source install/setup.bash |
长期开发时,可以只把系统 ROS 写进 ~/.bashrc,项目 workspace 的 install/setup.bash 在进入项目时手动 source。这样不同项目之间不容易互相污染。
创建第一个包
进入 src:
1 | cd ~/ros2_ws/src |
创建 Python 包:
1 | ros2 pkg create --build-type ament_python --license Apache-2.0 --node-name hello_node leroi_demo |
回到工作空间根目录构建:
1 | cd ~/ros2_ws |
运行节点:
1 | ros2 run leroi_demo hello_node |
如果提示找不到包或找不到可执行文件,优先检查:
- 是否在 workspace 根目录执行了
colcon build。 - 是否执行了
source install/setup.bash。 - 包名、节点名是否拼写一致。
setup.py或CMakeLists.txt是否正确安装了可执行入口。
发布订阅怎么理解
Topic 是 ROS 里最常用的通信方式。
一个节点发布数据:
1 | camera_node -> /camera/image -> detect_node |
另一个节点订阅数据:
1 | detect_node -> /target/pose -> controller_node |
关键点:
- 发布者和订阅者的话题名必须一致。
- 消息类型必须一致。
- 多个节点可以同时订阅同一个话题。
- Topic 适合连续数据,比如图像、雷达、里程计、状态。
- Service 更适合一次性请求,比如“保存地图”。
- Action 更适合长任务,比如“移动到目标点”。
turtlesim 入门调试
安装桌面版后通常可以直接跑 turtlesim:
1 | ros2 run turtlesim turtlesim_node |
另开一个终端控制:
1 | ros2 run turtlesim turtle_teleop_key |
查看话题:
1 | ros2 topic list |
查看小乌龟位姿:
1 | ros2 topic echo /turtle1/pose |
这套流程适合理解节点、话题、键盘控制、实时状态输出。
常见报错
ros2: command not found
环境没有 source。
1 | source /opt/ros/jazzy/setup.bash |
如果每次打开终端都丢失,检查 ~/.bashrc 或 ~/.zshrc。
Unable to locate package ros-jazzy-desktop
常见原因:
- Ubuntu 版本和 ROS 发行版不匹配。
- ROS apt 源没有添加成功。
- 没有执行
sudo apt update。 universe仓库没有启用。- 网络无法访问相关软件源。
先确认:
1 | lsb_release -a |
colcon: command not found
开发工具未安装:
1 | sudo apt install ros-dev-tools |
如果仍不可用,再补:
1 | sudo apt install python3-colcon-common-extensions |
package not found
通常是 workspace 没有 source:
1 | cd ~/ros2_ws |
如果刚修改过代码,重新构建:
1 | colcon build --packages-select package_name |
两台机器节点互相发现不了
排查方向:
- 两台机器是否在同一网络。
- 防火墙是否阻止 DDS 通信。
ROS_DOMAIN_ID是否一致。- 是否跨 ROS 2 发行版混用。
- 虚拟机、Docker、VPN 是否影响组播。
可以先在两台机器分别查看:
1 | echo $ROS_DOMAIN_ID |
同一项目里建议显式设置一个固定域:
1 | export ROS_DOMAIN_ID=12 |
RViz 或 turtlesim 无法打开
常见原因:
- 安装的是
ros-base,没有桌面工具。 - SSH 没有开启 X11 转发。
- 虚拟机图形加速异常。
- Docker 没有透传显示环境。
本机学习建议安装:
1 | sudo apt install ros-jazzy-desktop |
服务器只跑节点时不一定需要桌面工具。
学习顺序
- 安装 ROS 2 并跑通
talker/listener。 - 使用
turtlesim理解节点、话题和命令行。 - 建立自己的
ros2_ws。 - 创建第一个 Python 或 C++ 包。
- 写一个 publisher 和 subscriber。
- 学会 launch 文件,一次启动多个节点。
- 学会 rosbag,录制和回放现场数据。
- 学 tf2、URDF、RViz,再进入机器人模型、仿真和导航。