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 支持 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 节点较劲了。