ROS1的缺点
- roscore (或者说 master) 的问题:系统连续运行长了,master 莫名宕机,某个节点可能突然失效。单 master 结构不利于多个机器人组成的集群。
- ROS 有延迟:TCPROS+序列化的过程开销大,拷贝次数太多,
- 安装与运行体积较大:运行在配置较低的
arm上会占用过多资源,对嵌入式设备不够友好 - 参数服务器机制设计不好:程序退出但
roscore不退出时,参数没有更新,或者说还留在参数服务器里
a. ROS 2采用全新的架构,底层基于DDS(Data Distribution Service)通信机制,支持实时性、嵌入式、分布式、多操作系统,ROS2支持的系统包括Linux、windows、Mac、RTOS,甚至是单片机等没有操作系统的裸机。
b. ROS 2的通讯系统是基于DDS,取消了master,同时在内部提供了DDS的抽象层实现,有了这个抽象层,用户就可以不去关注底层的DDS使用了哪个商家的API。
c. ROS2基于DDS进行数据传输,而DDS基于RTPS的去中心化的通信框架,这就去除了对roscore的依赖,系统的稳定性强,对资源的消耗也得到了降低。
d. 由于ROS 缺少Qos机制,topic的稳定性与质量难以保证;ROS2则提供了Qos机制,对通信的实时性、完整性、历史追溯等功能有了支持,这便大幅加强了框架功能,避免了高速系统难以适用等问题。
e. ROS2中引入了节点生命周期管理的概念,各个节点的状态是可管理的。比如如果想从建图功能切到导航功能。在ROS1中,需要先将建图功能的程序杀干净,然后再启动导航程序。在这个场景里,大可让建图程序休眠,而不用杀掉。切换功能时只需要激活相应功能的节点即可。
ROS2的缺点
DDS 过于复杂(最大问题):ROS2 的底层是 DDS(如 Fast DDS、Cyclone DDS)。问题在于配置复杂(QoS、discovery、domain),不同实现行为不一致,debug 非常困难。实际表现是同一套代码换个 DDS 行为就变了,有时能通信但收不到数据,或延迟异常。很多人误解 ROS2 不等于高性能。实际上默认配置可能比 ROS1 更慢,QoS / DDS 配不好延迟更大,只有调优后才更强。结论:ROS2 最大门槛不是 API,而是 DDS。
分布式“太真实”,导致不稳定感:ROS1 中心化简单粗暴;ROS2 去中心化是分布式系统。这带来节点发现有延迟、比如
param list出结果太慢、node list 不一致、偶发通信异常等问题。本质上架构更先进,但行为不再“可预测”。QoS 很强,但很容易用错:QoS 是核心优势也是坑。常见问题如 publisher / subscriber QoS 不匹配会导致收不到数据,reliability / history 配错会让延迟飙升。在 ROS1 至少“能收到”,在 ROS2 可能“完全没数据”。
调试难度明显上升:ROS1 的 rostopic echo 和 rqt_graph 基本能看明白。ROS2 受 DDS 黑盒和 QoS 影响,很多问题表现为“看起来一切正常,但就是不工作”。
ROS2 引入 Python 格式的 launch 和 lifecycle node,学习成本高
