ROS2 是重新设计的 Robot Operating System,无论从用户API接口到底层实现都进行了改进。这里主要关注ROS2 的中间件。
1. 通信模式
ROS2 使用DDS协议进行数据传输,并通过抽象的rmw,支持多个厂家的DDS实现(FastDDS,Cyclone DDS 等)。
DDS 允许通过Qos 策略进行自定义通信行为。
ROS 支持的基本的Qos策略:
- 历史记录(History)
- 保留近期记录:仅仅保存最大N个样本数据,通过配置队列深度选项来指定最大数据限制。
- 保留所有记录:存储所有的样本数据,但受限于底层中间件的配置资源限制。
- 深度(Depth)
- 队列深度:仅仅当历史记录选择为"保留最近记录"时,配合指定最大数据限制。
- 可靠性(Reliability)
- 尽力的(Best effort):尝试传输样本,但如果网络不稳定可能会丢失数据。
- 可靠的(Reliable):保证样本的可靠传输,可能会尝试多次重传。
- 持续性(Durability)
- 局部瞬态(Transient local):发布者负责对晚到连接(late-joining)的订阅者保留样本数据。
- 易变态(Volatile):不尝试保留样本数据。
另外可以使用DDS厂商提供的方式(例如XML配置文件),进行更多的Qos配置。
DDS可以帮助ROS2 解决Robot Operating System 中的许多问题。
1)本地通信效率问题
进程间共享内存通信。相比于ROS1在本机内的进程间也使用TCP/UDP进行通信,理论上ROS2 具有更好的性能表现和更低的通信延迟。
需要注意的是,DDS在大于1M的数据传输方面性能表现不佳,需要一些额外的操作或技术进行优化。
PS: 进程内通信,有的DDS未实现,一般由ROS实现。ROS1 使用 Nodelet 实现,ROS2 通过 Composition 实现。
2)非理想网络的跨机通信问题
在可靠的网络环境下,标准解决方案是 TCP/IP,因为它在大多数操作系统中都进行了优化。但是TCP/IP 难以在无线通信中传递数据,因为网络中断会导致回退、重传和延迟等。ROS 1 建立在 TCP/IP 之上,并在这些情况下受到影响。
DDS是基于UDP的,没有这个问题。DDS 可以通过 QoS 来决定何时以及如何在不可靠的条件下重新传输,从而优化可用带宽和延迟。
3)rosmaster的单点问题
相比ROS1,ROS2 移除了中心节点rosmaster。使用 peer-to-peer discovery 的方式建立"连接"。
ROS2 的 底层中间件会自动进行 Discovery node。主要有以下几个流程:
- 当node 启动时,它向相同ROS domain下的其他node 进行广播,说明它已经上线。其他node收到这个广播会回复自己的相关信息,从而建立"连接",并进行通信。
- node会定期的进行广播它的信息,这样即使它已经错过了最初的发现过程,它也可以和新上线的node进行"连接"。
- node 下线时,会广播其他节点自己要下线了。
4)安全性
ROS 2 不仅依赖于 DDS 安全标准,还提供了一套额外的工具 SROS2,以简化安全基础设施的管理
5)ReadTime 支持
为了满足安全和/或性能目标,系统的某些部分必须在确定的时间内执行。ROS 2为实时系统的开发人员提供 API,以强制执行特定于应用程序的约束
2. 架构设计
1)ROS 2提供了一种模式,用于管理通过状态机转换的节点的生命周期,这些节点的状态包括未配置、未激活、活动和最终完成等。这些状态允许系统集成商控制某些节点何时处于活动状态。这是协调分布式异步系统的各个部分的重要工具。
2)ROS 2的Node 可以利用Composition 动态配置它到任何进程。
3. 生态环境
1)更多的长期支持
ROS2 项目支持周期:
Humble 2022.5 - 2027.5
Foxy 2020.5 - 2023.5
ROS1 项目支持周期:
Noetic 2020.5 - 2025.5
Melodic 2018.5 - 2023.5
(备注:关于环宇能否支持 Xavier Jetpack 升级)
2)更多的硬件厂商开源支持:
Nvidia Isaac: High-performance computing for robotics built on ROS2
Nvidia ros2 开源工程:
https://github.com/orgs/NVIDIA-AI-IOT/repositories?language=&q=ros2&sort=&type=all
3)便于友商对接