ROS 2 入门与环境搭建(从 Noetic 到 Kilted)
前言
ROS(Robot Operating System,机器人操作系统)是全球最主流的机器人开发中间件平台。2020 年 ROS Noetic 作为 ROS 1 的最终版本发布后,社区全面转向 ROS 2。本文将从 ROS 1 与 ROS 2 的对比讲起,带你搭建最新的 ROS 2 Kilted Kaiju 开发环境。
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 去中心化通信,任何节点故障不影响其他节点,更适合工业级和商业部署。
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 核心概念
节点(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)
参数用于节点运行时的动态配置,无需重启节点即可修改:
# 查看节点参数
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 支持并行编译和更灵活的包管理。
常用命令速查
# 节点管理
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 联合仿真实战