1. ROS2 概述:从起源到生态,一个老工程师的视角

大家好,我是这门课的主讲。今天咱们聊聊 ROS2 的来龙去脉。

说实话,我第一次接触 ROS 还是 2013 年。那时候做机器人项目,最头疼的就是代码复用。每个传感器、每个电机都得自己写驱动,团队里几个人各写各的,最后集成简直是一场噩梦。ROS1 的出现,确实解决了大问题。但后来做工业项目时,我发现 ROS1 在实时性、多机通信上越来越吃力。嗯,这就是 ROS2 诞生的背景。

1.1 ROS2 的起源与发展

ROS(Robot Operating System)最早是 2007 年由斯坦福大学和 Willow Garage 公司联合发起的项目。它的初衷很简单:让机器人开发者能像写普通软件一样,轻松复用代码。

ROS1 在 2010 年发布了第一个正式版,迅速成为学术界的标配。但到了 2015 年左右,问题开始暴露。我在一个工厂自动化项目里,用 ROS1 控制多台机械臂协同工作。结果呢?网络稍微一波动,整个系统就崩了。ROS1 的通信基于 TCP,没有 QoS 保障,这在工业场景下是致命的。

2014 年,Open Robotics 启动了 ROS2 的研发。他们吸取了 ROS1 的教训,决定从底层重写通信机制。2017 年,ROS2 发布了第一个 beta 版。到了 2022 年,ROS2 Humble 版本发布,标志着 ROS2 已经足够成熟,可以用于生产环境。

核心时间线:

  • 2007 年:ROS 项目启动
  • 2010 年:ROS1 正式版发布
  • 2014 年:ROS2 研发启动
  • 2017 年:ROS2 beta 版发布
  • 2022 年:ROS2 Humble 发布,进入稳定期

1.2 ROS2 与 ROS1 的核心区别

说白了,ROS2 不是 ROS1 的升级版,而是重写版。我经常跟团队说:别把 ROS2 当成 ROS1 的补丁,它俩的底层逻辑完全不同。

对比维度 ROS1 ROS2
通信中间件 自定义 TCP/UDP DDS(数据分发服务)
实时性 不支持 支持(通过 DDS 的 QoS)
多机通信 依赖 Master 节点 去中心化,自动发现
安全性 无内置安全机制 支持 DDS 安全插件
跨平台 主要支持 Linux 支持 Linux、Windows、macOS、RTOS
生命周期管理 手动管理节点 内置生命周期管理

这里我重点说下 DDS。你想想看,ROS1 的通信需要一个 Master 节点来协调,Master 挂了整个系统就瘫痪了。我在一个仓库物流项目里就吃过这个亏——Master 节点所在的主机突然宕机,所有机器人瞬间失联。ROS2 用 DDS 后,每个节点都是对等的,没有单点故障。而且 DDS 提供了丰富的 QoS 策略,比如你可以设置消息的可靠性、时效性,这在工业场景下太重要了。

我的经验:如果你从 ROS1 迁移到 ROS2,最需要适应的不是 API 变化,而是思维模式。ROS1 里你习惯写一个中心节点来协调所有事情,ROS2 里要习惯用分布式的方式思考。我曾经花了两周才把一个 ROS1 的导航系统改造成 ROS2 风格,改完后发现代码量少了 30%,稳定性却提升了不止一个档次。

1.3 ROS2 的应用领域与生态

ROS2 的应用领域,说白了就是「ROS1 能做的它都能做,ROS1 做不了的它也能做」。我把它分成三大块:

  • 工业机器人:机械臂控制、AGV 调度、产线自动化。ROS2 的实时性和可靠性在这里是刚需。
  • 服务机器人:送餐机器人、清洁机器人、导览机器人。ROS2 的多机协作能力让这些场景更灵活。
  • 自动驾驶:虽然很多公司用自研中间件,但 ROS2 在原型验证阶段非常流行。它的工具链(如 rviz2、rosbag2)能大幅提升开发效率。

说到生态,ROS2 现在有超过 2000 个功能包。我常用的几个:

  • Navigation2:导航栈,支持多机器人协同
  • MoveIt2:运动规划,工业机械臂的标配
  • ros2_control:硬件抽象层,我最近的项目就在用这个
  • Micro-ROS:让 ROS2 跑在微控制器上,嵌入式场景的福音

避坑指南:我曾经在选型时犯过一个错误——以为 ROS2 的包都能直接兼容 ROS1。结果发现很多 ROS1 的包并没有移植到 ROS2,尤其是那些依赖特定硬件驱动的包。所以,做项目前一定要先确认你需要的功能包在 ROS2 下是否可用。建议去 index.ros.org 查一下包的兼容状态。

1.4 ROS2 系统架构总览

下面这张图是我自己画的 ROS2 系统架构图。你看,它分成了四层:

ROS2 系统架构总览 应用层 机器人应用、导航、机械臂控制、自动驾驶 框架层 rclcpp / rclpy、生命周期管理、参数系统 中间件层 DDS(Fast DDS / Cyclone DDS)、QoS 策略 操作系统层 Linux / Windows / macOS / RTOS

你看,最底层是操作系统,ROS2 支持 Linux、Windows、macOS,甚至 RTOS。往上是中间件层,DDS 是核心。再往上是框架层,我们写代码主要跟这层打交道。最顶层是应用层,也就是你最终要实现的机器人功能。

我个人习惯把 ROS2 的架构理解成一个「洋葱模型」——每一层都依赖下一层,但上层对下层是透明的。你写应用代码时,不需要关心底层用的是 Fast DDS 还是 Cyclone DDS,框架层帮你屏蔽了这些差异。

一个小技巧:刚开始学 ROS2 时,别急着深入 DDS 的细节。先学会用 rclcpp 写节点、发布订阅、调用服务。等你对框架层熟悉了,再回头研究 DDS 的 QoS 配置。我见过太多初学者一上来就研究 DDS 的 20 多种 QoS 策略,结果把自己绕晕了。记住:先会用,再优化。

好了,这一章的内容就到这里。ROS2 的起源、与 ROS1 的区别、应用场景和架构,咱们都聊了一遍。下一章,我会带你搭建 ROS2 的开发环境,咱们亲手跑第一个 ROS2 程序。到时候你会发现,ROS2 的安装比 ROS1 简单多了——至少不用再跟那个烦人的 Master 节点较劲了。