1. ROS2前世今生:从ROS1到ROS2的进化之路
大家好,我是你们这门课的老朋友。今天咱们聊聊ROS2的来龙去脉。
说实话,我接触ROS1那会儿还是2013年。那时候做机器人开发,感觉就像发现了新大陆。但用着用着,问题就来了。嗯,咱们先看看ROS1到底卡在哪了。
1.1 ROS1的辉煌与局限
ROS1诞生于2007年,初衷是给科研用的。它解决了机器人开发中最大的痛点——代码复用。你想想看,以前每个团队都得从零写驱动、写通信,有了ROS1,大家站在了同一起跑线上。
但ROS1有个致命伤:它不是为产品设计的。我在2017年帮一家工厂做AGV调度系统,就踩过这个坑。
ROS1的核心问题:
- 单点故障:roscore挂了,整个系统瘫痪。我在产线上遇到过,机器人跑到一半,roscore崩了,差点撞到人。
- 实时性差:ROS1的通信基于TCP,延迟不稳定。做机械臂力控时,这简直要命。
- 跨平台困难:ROS1强依赖Linux,Windows和RTOS基本没戏。
- 安全性缺失:没有加密、没有认证,工业场景谁敢用?
我个人的经验:如果你只是做学术验证,ROS1完全够用。但一旦涉及产品落地,尤其是多机器人协作、实时控制、安全通信,ROS1的短板就暴露无遗。
1.2 为什么要有ROS2?
说白了,ROS2就是来解决ROS1这些历史遗留问题的。2015年,Open Robotics开始设计ROS2,2017年发布第一个正式版。
为什么会这样?因为机器人行业变了。从实验室走向工厂、从单机走向集群、从科研走向产品,ROS1的架构已经撑不住了。
我举个例子:多机器人协同。在ROS1里,每个机器人得有自己的roscore,跨机器人通信得自己搭桥。ROS2直接原生支持分布式,每个节点都是对等的,没有中心节点。
注意:ROS2不是ROS1的升级版,而是重写版。API不兼容,但设计理念一脉相承。如果你从ROS1迁移过来,要做好心理准备——很多习惯得改。
1.3 ROS2的核心设计理念
ROS2的设计,我总结为四个关键词:去中心化、实时性、跨平台、安全性。
| 设计理念 | ROS1做法 | ROS2做法 |
|---|---|---|
| 通信架构 | 中心化(roscore) | 去中心化(DDS) |
| 实时性 | 不支持 | 原生支持(通过DDS的QoS) |
| 跨平台 | 仅Linux | Linux/Windows/macOS/RTOS |
| 安全性 | 无 | 内置加密、认证、权限控制 |
这里最核心的变化,就是底层通信从ROS1自研的TCPROS换成了DDS(数据分发服务)。DDS是工业级标准,已经在航空、国防领域用了十几年。ROS2相当于把DDS的能力直接拿过来用。
DDS带来的好处:
- 去中心化:没有单点故障,节点之间直接通信
- QoS控制:可以设置可靠性、延迟、持久化等策略
- 自动发现:节点上线后自动发现彼此,不用手动配置
- 跨网络:支持局域网、广域网,甚至卫星通信
1.4 ROS2的架构总览
下面这张图,是我自己画的ROS2架构。你看完就能明白,ROS2到底是怎么组织的。
你看,从下往上:操作系统 → DDS → 客户端库 → 应用代码。每一层各司其职,上层不用关心下层怎么实现。
我个人觉得,这种分层设计最大的好处是解耦。比如你想换DDS实现,只需要改配置文件,应用代码一行都不用动。我在项目中就试过从Fast DDS切换到Cyclone DDS,整个过程不到半小时。
1.5 避坑指南:从ROS1迁移到ROS2
如果你之前用过ROS1,下面这些坑我建议你提前知道:
我曾经踩过的坑:
- 不要直接移植:ROS1的包不能直接在ROS2里编译。你得用
ros1_bridge做桥接,或者重写。 - 回调模型变了:ROS2里
spin()是阻塞的,而且支持多线程。我一开始没注意,导致回调死锁。 - 消息类型不同:ROS2的消息定义去掉了头文件中的
Header依赖,有些字段名也改了。 - 启动系统变了:ROS1用
roslaunch,ROS2用ros2 launch,语法完全不同。
我的建议:如果你是新项目,直接上ROS2。如果是老项目,先评估迁移成本。有些功能ROS2还没完全覆盖,比如rosbag的录制回放,ROS2的版本还在完善中。
1.6 小结
ROS2不是ROS1的简单升级,而是一次彻底的架构重构。它用DDS替代了自研通信,解决了实时性、安全性、跨平台等核心问题。
嗯,这一章咱们把ROS2的来龙去脉理清了。下一章,我会带你亲手搭建ROS2开发环境,咱们直接上手写代码。