ROS 2 入门与环境搭建(从 Noetic 到 Kilted)
前言
把一台机器人拆开,里面是电机、摄像头、激光雷达和一堆算法。它们本该像一支球队一样默契配合,但出厂时彼此却是"聋子"和"哑巴":摄像头看见了障碍,却不知道该喊谁;轮子想躲,却听不见指令。
ROS(Robot Operating System,机器人操作系统)就是给机器人装上"神经系统"的那套软件。 它其实不是真的操作系统,而是一套跑在 Linux 上的通信与工具框架——把"看见障碍"变成"抬腿避开"这件本该自然发生的事,变成一条数据能顺畅跑完的通路。没有它,机器人的每个零件都是各干各的孤岛;有了它,它们才像有了神经末梢和脊髓,能协调起来。
读到这里,你已经站在了机器人开发的入口。本文先讲清"为什么要有 ROS、它和 ROS 1 差在哪",再带你把最新的 ROS 2 Kilted Kaiju 在 Ubuntu 24.04 上跑起来,最后认识节点、话题、服务等几个你这辈子都要打交道的老朋友。读完你就能在自己的电脑上让两个程序"对话"——这正是所有机器人协作的起点。
ROS 1 vs ROS 2 核心区别
| 特性 | ROS 1 (Noetic) | ROS 2 (Kilted) |
|---|---|---|
| 通信机制 | 自定义 TCP/UDP 协议 | DDS(Data Distribution Service)标准中间件 |
| 支持平台 | 仅 Linux (Ubuntu 20.04) | Linux / Windows / macOS / RTOS |
| Python 版本 | Python 2 + Python 3 | 仅 Python 3 |
| 构建系统 | catkin | colcon + ament |
| 节点发现 | 依赖 rosmaster 中心节点 | 分布式发现(DDS Discovery) |
| 实时性 | 无原生实时支持 | 支持 Real-Time(通过 ros2_control) |
| 安全机制 | 无 | SROS2(加密、认证、访问控制) |
| 生命周期 | 无节点生命周期管理 | 节点生命周期(配置、激活、失活、清理) |
核心差异:ROS 1 依赖中心化的
rosmaster,一旦 master 挂掉整个系统瘫痪。ROS 2 采用 DDS 去中心化通信,任何节点故障不影响其他节点,更适合工业级和商业部署。
DDS 是什么? 把它想成机器人内部的"对讲机网络"。ROS 1 只有一台总台(rosmaster)负责转接所有通话,总台一炸全哑;ROS 2 用的是 DDS,每个节点自带一部能自动找人的对讲机,谁都能直接喊话,一台坏了别人照常说。这就是"去中心化"——也是它敢进工厂、上产品的原因。
ROS 2 发行版全景
ROS 2 每年 5 月发布一个新版本,命名规则为按字母顺序的形容词 + 海龟名:
| 版本 | 代号 | 发布日期 | EOL 日期 | 支持平台 | 状态 |
|---|---|---|---|---|---|
| ROS 2 Humble | Hawksbill | 2022.05 | 2027.05 | Ubuntu 22.04 | ✅ LTS 长期支持 |
| ROS 2 Iron | Irwini | 2023.05 | 2024.11 | Ubuntu 22.04 | ❌ 已终止 |
| ROS 2 Jazzy | Jalisco | 2024.05 | 2029.05 | Ubuntu 24.04 | ✅ 支持中 |
| ROS 2 Kilted | Kaiju | 2025.05 | 2026.11 | Ubuntu 24.04 / Windows | ✅ 最新稳定版 |
| ROS 2 Lyrical | Luth | 2026.05(预计) | 2031.05 | TBD | 🔨 开发中 |
选择建议:
- 生产环境 / 长期项目 → Humble(LTS,支持到 2027 年)
- 最新功能 / 学习研究 → Kilted(本文使用此版本)
- Ubuntu 22.04 用户 → 选 Humble 或 Jazzy
- Ubuntu 24.04 用户 → 选 Jazzy 或 Kilted
Kilted Kaiju 新特性亮点
Kilted Kaiju 于 2025 年 5 月 23 日(世界海龟日)发布,是 ROS 2 的第 11 个版本,包含多项重要更新:
1. Tier 1 RMW Zenoh 支持(首次)
Eclipse Zenoh 作为 DDS 替代方案首次成为 Tier 1 中间件:
- 支持 低带宽、高延迟网络环境(如无人机远程通信)
- 内置 SROS2 安全套件(访问控制、身份验证、加密)
- 满足 REP-2004 代码质量及 REP-2005 核心包要求
# 安装 Zenoh RMW
sudo apt install ros-kilted-rmw-zenoh-cpp
# 切换默认中间件为 Zenoh
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
2. Python 性能大幅提升
社区将 C++ 的事件执行器移植到 Python:
- 初步基准测试性能提升可达 10 倍
- 扩展 Python 类型检查(Actions、Generics)
- 新增
ament_mypy工具辅助类型检查
# 启用新执行器(需手动切换)
from rclpy.executors import ThreadPoolExecutor
executor = ThreadPoolExecutor(num_threads=4)
executor.add_node(node)
executor.spin()
3. ROSBag 全面增强
- 多包同时回放:单命令回放多个 bag 文件
- 交互式进度条:执行、暂停、快进 bag 回放
- 独立 Action Server:通过 action 触发录制
- 新增消息时序过滤、topic 排序、大小贡献分析等工具
# 多包同时回放
ros2 bag play bag1 bag2 bag3
# 交互式回放(可暂停/快进)
ros2 bag play recording --clock --playback-rate 1.0
4. Windows 体验改进
使用 Pixi(prefix.dev)和 Conda 作为默认安装机制,替代了此前复杂的安装流程:
- 更简单的依赖管理
- 工作区级别安装(非全局)
- 降低维护者负担
5. 其他改进
- NV12 图像格式支持(摄像头/显卡硬件加速)
- Action 内省:
ros2 action echo命令可查看 action server 状态 - 改进的日志系统与诊断工具
实战:Ubuntu 24.04 安装 ROS 2 Kilted
第一步:设置 Locale
# 检查当前 locale
locale
# 安装并设置 UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
第二步:添加 ROS 2 apt 仓库
# 启用 Universe 仓库
sudo apt install software-properties-common
sudo add-apt-repository universe
# 安装 curl 并添加 ROS 2 仓库密钥
sudo apt update && sudo apt install curl -y
# 使用 ros-apt-source 自动配置仓库
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
sudo dpkg -i /tmp/ros2-apt-source.deb
第三步:安装 ROS 2
# 更新包索引
sudo apt update
sudo apt upgrade
# 安装桌面版(推荐,含 RViz、Gazebo 集成、演示、教程)
sudo apt install ros-kilted-desktop
# 可选:安装开发工具(含 rosdep、colcon-build 等)
sudo apt install ros-dev-tools
最小安装:如果只需要通信库和命令行工具(无 GUI),可安装
ros-kilted-ros-base代替。
第四步:环境配置
# 加载 ROS 2 环境变量
source /opt/ros/kilted/setup.bash
# 建议添加到 ~/.bashrc 实现自动加载
echo "source /opt/ros/kilted/setup.bash" >> ~/.bashrc
source ~/.bashrc
第五步:验证安装
打开 终端 1,运行 C++ talker 节点:
source /opt/ros/kilted/setup.bash
ros2 run demo_nodes_cpp talker
打开 终端 2,运行 Python listener 节点:
source /opt/ros/kilted/setup.bash
ros2 run demo_nodes_py listener
如果终端 1 显示 Publishing 消息,终端 2 显示 I heard 消息,说明安装成功 ✅。
两个程序能"唠上",靠的不是魔法,而是一套约定好的通信规则。在写自己的机器人程序之前,得先认识 ROS 2 的几个核心概念——它们是之后每篇文章的通用语言。
ROS 2 核心概念
节点(Node)
节点是 ROS 2 中的基本计算单元,每个节点负责一个单一功能:把它想成流水线上的一个工人——只干一件事,比如一个专门读摄像头,一个专门算路线。工人越多、分工越细,整条线越不容易因为一个环节罢工而全停。
# Python 节点示例
import rclpy
from rclpy.node import Node
class MinimalNode(Node):
def __init__(self):
super().__init__('minimal_node')
self.get_logger().info('Hello ROS 2!')
def main():
rclpy.init()
node = MinimalNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
话题(Topic)— 异步发布/订阅
话题是节点间的单向异步通信机制,适用于持续的数据流(如传感器数据):把它想成公司里的广播喇叭——谁有消息就对着喇叭喊,想听的人自己竖着耳朵听。喊的人和听的人互相不认识、也不在乎对方在不在,所以最适合"传感器一直在吐数据"这种场景。
# 查看所有活跃话题
ros2 topic list
# 查看话题数据类型和频率
ros2 topic info /chatter
# 实时监听话题数据
ros2 topic echo /chatter
服务(Service)— 同步请求/响应
服务是节点间的同步通信机制,适用于一问一答场景(如查询状态):更像去柜台办事——你问一句、对方答一句,不问不答。适合"查个电量""请求一次逆解"这类一锤子买卖,而不适合长时间的任务。
# 查看所有服务
ros2 service list
# 调用服务
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 5, b: 3}"
动作(Action)— 长时间任务
动作用于执行长时间运行的任务,支持中途反馈和取消(如机器人导航到目标点):它是"接了个长活儿"——你派机器人去厨房拿杯水,它能一边走一边回头喊"我已经走到门口了",你也能中途喊停。服务和动作的区别,就是"问个问题"和"派个活儿"的区别。
# 查看所有动作
ros2 action list
# 发送动作目标
ros2 action send_goal /fibonacci example_interfaces/action/Fibonacci "{order: 5}"
参数(Parameter)
参数用于节点运行时的动态配置,无需重启节点即可修改:它是节点的"旋钮"——不用关掉程序,现场拧一下就能改速度、改阈值。比如把巡逻速度从 0.5 m/s 调到 1.0 m/s,机器人当场就变快。
# 查看节点参数
ros2 param list /minimal_node
# 设置参数值
ros2 param set /minimal_node my_param "hello"
ROS 2 工作空间与编译
# 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
# 编译工作空间
colcon build
# 加载工作空间环境(覆盖安装空间)
source install/setup.bash
注意:ROS 2 使用 colcon 构建系统,替代了 ROS 1 的 catkin。colcon 支持并行编译和更灵活的包管理。
常用命令速查
下面这张速查表是你往后会反复回来翻的"字典",按节点、话题、服务、动作、包五类列出了最常用的命令。不用背,用到时照着抄就行。还要记住一件事:跑这些命令前,得先 source 你的环境(安装空间或工作空间的 setup.bash),否则终端根本不认识 ros2 这个命令。
# 节点管理
ros2 node list # 列出所有活跃节点
ros2 node info /node_name # 查看节点详细信息
# 话题管理
ros2 topic list # 列出所有话题
ros2 topic echo /topic_name # 监听话题数据
ros2 topic pub /topic_name type "{data}" # 发布消息
# 服务管理
ros2 service list # 列出所有服务
ros2 service call /srv_name type "{req}" # 调用服务
# 动作管理
ros2 action list # 列出所有动作
ros2 action send_goal /action_name type "{goal}" # 发送动作
# 包管理
ros2 pkg list # 列出所有包
ros2 pkg prefix package_name # 查看包路径
ros2 pkg create --build-type ament_cmake my_pkg # 创建新包
下一步
在下一篇文章 ROS 2 机器人仿真实战(Gazebo 与 MoveIt2) 中,我们将学习:
- Gazebo 仿真环境搭建
- URDF/XACRO 机器人模型创建
- MoveIt2 运动规划入门
- Gazebo + MoveIt2 联合仿真实战
如果入门环境已经玩熟、想往工业部署方向走,推荐接着读进阶系列:[ROS 2 工业级环境构建:Docker 容器化与 PREEMPT_RT 实时内核](/posts/硬件/ROS/ROS工业/硬件/ROS工业/ROS 2 工业级环境构建-Docker容器化与PREEMPT_RT实时内核/)——同一套环境,从"能跑"升级到"能交付";以及它的配套电路篇工业级机器人电源板:防反接、缓启动与 eFuse。