发布于 

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 联合仿真实战

参考资料