一、ROS2前世今生:从ROS1到ROS2的演进之路

1.1 ROS1的辉煌与隐痛

ROS1诞生于2007年,那时候我还在学校折腾机器人底盘。说实话,ROS1的出现让机器人开发从「手写所有通信协议」变成了「发布订阅就能搞定」,这简直是革命性的。

但用久了你会发现,ROS1有几个硬伤:

  • 单点故障:roscore挂了,整个系统就瘫痪。我在实验室调试时遇到过,跑了半小时的SLAM,突然roscore崩了,所有数据全丢。
  • 实时性不足:ROS1的通信基于TCP,延迟不稳定。做机械臂控制时,我亲眼看到指令延迟从2ms跳到200ms,机器人直接抖成帕金森。
  • 跨平台困难:ROS1强依赖Ubuntu,Windows和RTOS基本没戏。你想在嵌入式MCU上跑ROS1?嗯,基本不可能。
  • 多机器人支持差:ROS1的命名空间设计很别扭,多机器人场景下节点名冲突是家常便饭。

核心痛点总结:ROS1本质上是为「单机、非实时、科研验证」场景设计的。当机器人走向产品化、多机协同、工业级实时控制时,ROS1的架构瓶颈就暴露无遗了。

1.2 为什么需要ROS2?

2014年左右,ROS社区开始反思。我记得当时在ROSCon上,有人直接问:「ROS1还能撑多久?」答案是:我们需要一个全新的架构。

ROS2的核心驱动力来自几个方面:

  1. 工业级需求:机器人从实验室走向工厂,需要确定性延迟、安全认证、多语言支持。
  2. 实时系统集成:机械臂、AGV、无人机都需要硬实时控制,ROS1做不到。
  3. 多机器人协同:集群机器人、车联网场景,需要分布式、去中心化的通信。
  4. 跨平台部署:从Linux到Windows、macOS,甚至裸机RTOS,都要能跑。
  5. 产品化要求:生命周期管理、安全通信、日志系统,这些ROS1都没有。

我的个人经验:2016年我参与一个仓储机器人项目,要求7×24小时运行。ROS1跑了三天,roscore就内存泄漏挂了。从那以后,我坚定地转向了ROS2。

1.3 核心设计目标

ROS2的设计目标,说白了就是解决ROS1的痛点。我把它归纳为五个关键词:

设计目标 解决什么问题 实现方式
去中心化 单点故障 抛弃roscore,使用DDS发现机制
实时性 延迟不可控 支持QoS策略,可配置可靠/尽力传输
跨平台 依赖Ubuntu 底层用DDS,抽象操作系统层
多语言 C++/Python为主 原生支持C++、Python、Java、Go等
安全性 无认证加密 集成SROS2,支持加密和权限控制

1.4 架构变革:从ROS1到ROS2

架构上最大的变化,就是通信层从ROS1自研的TCPROS/UDPROS,换成了DDS(数据分发服务)。你想想看,DDS是工业级标准,已经在航空、国防领域用了十几年,稳定性和实时性都经过验证。

下面这张图展示了ROS1和ROS2的架构对比:

ROS1 架构 应用层(节点、话题、服务) TCPROS/UDPROS(自研协议) roscore(中心化) Linux(强依赖) ROS2 架构 应用层(节点、话题、服务) rcl(ROS客户端库) DDS中间件(去中心化) Linux / Windows / macOS / RTOS ❌ 中心化架构 ❌ 自研协议 ❌ 仅Linux ✅ 去中心化 ✅ DDS标准协议 ✅ 多平台支持

1.5 DDS:ROS2的通信基石

DDS是什么?说白了就是一个「发布-订阅」的中间件标准。ROS2选择DDS而不是自研协议,原因很简单:没必要重复造轮子。

DDS带来的核心能力:

  • 去中心化发现:每个节点通过DDS的发现协议自动找到对方,不需要roscore。我曾经在100个节点的集群上测试,发现时间不到1秒。
  • QoS策略:你可以控制消息的可靠性、持久性、延迟要求。比如传感器数据用「尽力传输」降低延迟,控制指令用「可靠传输」保证送达。
  • 分区和过滤:支持按主题、内容过滤消息,多机器人场景下非常有用。

避坑指南:DDS有多个实现(Fast DDS、Cyclone DDS、Connext DDS),不同实现的性能差异很大。我建议初学者先用默认的Fast DDS,等熟悉了再根据场景切换。

1.6 架构变革的细节

除了通信层,ROS2在架构上还有几个关键变化:

  1. 节点生命周期管理:ROS2引入了状态机,节点可以配置、激活、停用。这在产品化部署中非常实用。
  2. 参数系统重构:ROS1的参数服务器是全局的,ROS2改成了每个节点独立管理参数,避免了命名冲突。
  3. 编译系统升级:从catkin换成了ament,支持CMake和Python setuptools混合编译。
  4. 启动系统:ROS2的launch文件支持Python脚本,比ROS1的XML灵活得多。

我的建议:如果你是从ROS1迁移过来,先别急着改代码。先理解DDS的QoS概念,这是ROS2最核心的变化。我见过太多人把ROS1的代码直接搬过来,结果发现通信行为完全不一样。

1.7 总结:ROS2到底改变了什么?

一句话概括:ROS2把ROS从一个「学术工具」变成了「工业级框架」。

它保留了ROS1的编程模型(节点、话题、服务),但底层全部重写。你写ROS2代码的感觉和ROS1很像,但运行时的行为完全不同——更稳定、更实时、更安全。

嗯,这就是ROS2的前世今生。下一章我们会深入DDS的细节,看看它到底是怎么工作的。