参考链接: ROS2官方教程:ROS2中不同的DDS/RTPS vendors link.
ROS2中不同的DDS/RTPS vendors
ROS2是建立在以DDS/RTPS为中间件的基础之上的,DDS/RTPS提供了发现(discovery)、序列化(serialization)以及数据传递(transportation)的功能。DDS是一种端对端的中间件,它可以提供ROS系统中的一些相关特性,比如说分布式发现(distributed discovery),非ROS1中的集中式发现方法,以及在不同的质量服务选项(“Quality of Service” options)中控制数据传输。
DDS(Data Distribution Service) 是一种工业标准,它由各种不同的vendors实现,比如RTI公司实现的Connext或者是ADLink公司的OpenSplice。
RTPS(Real Time Publish Subscribe protocol) 是一种使用DDS作为网络通信的协议,没有完全实现全部的DDS API,但已经可以为ROS2提供充足的功能性,比如eProsima实现的Fast RTPS。
ROS2支持多种不同的DDS/RTPS实现, 这是由于当它选择一个vendor(供应商)来使用时,并不是完全一致的(one size fits all)。当选择一个中间件实现时,有多种因素需要考虑,比如说后备考虑如license,或者技术考虑如平台兼容性或计算规模。vendors可能专注于不同的需求而提供多于一种的DDS或RTPS实现,比如说,RTI就有多种不同的Connext实现,它们的目的各不相同,比如有些是针对特定处理器平台的,有些是满足不同应用的安全性验证的(当前阶段,ROS2仅支持标准桌面版本)。
为了在ROS2中使用一个DDS/RTPS实现,我们设计了ROS Middleware interface(或简称RMW) 的软件包,它可以实现在使用DDS/RTPS API或工具时对ROS中间件接口的抽象。使用RMW来支持DDS的过程需要做很多实现和维护性工作,但是首先实现对一部分DDS的支持可以保证ROS2的框架代码不再需要尝试其他特殊的实现方法,同时用户也希望能将DDS与他们的应用工程分离开来。
支持的RMW实现
产品名称 | 协议 | RMW实现 | 当前状态 |
---|---|---|---|
eProsima Fast RTPS | Apache 2 | rmw_fastrtps_cpp | 完全支持,默认RMW |
Eclipse Cyclone DDS | Eclipse公共许可证v2.0 | rmw_cyclonedds_cpp | 完全支持,包括二进制包,与Eloquent的二进制发行版打包在一起。 |
RTI Connext | 商业授权、研究授权 | rmw_connext_cpp | 完全支持,包括二进制包,但Connext需要单独安装 |
RTI Connext(dynamic implementation) | 商业授权、研究授权 | rmw_connext_dynamic_cpp | 支持暂停,alpha 8版之前完全支持 |
PrismTech Opensplice | LGPL(only v6.4)、商业授权 | rmw_opensplice_cpp | 部分支持,包括二进制包,但是OpenSplice需要单独安装 |
OSRF FreeRTPS | Apache 2 | - | 部分支持,开发暂停 |
QoS策略
- 历史记录(History)
- 保留近期记录:仅仅保存最大N个样本数据,通过配置队列深度选项来指定最大数据限制。
- 保留所有记录:存储所有的样本数据,但受限于底层中间件的配置资源限制。
- 深度(Depth)
- 队列深度:仅仅当历史记录选择为"保留最近记录"时,配合指定最大数据限制。
- 可靠性(Reliability)
- 尽力的(Best effort):尝试传输样本,但如果网络不稳定可能会丢失数据。
- 可靠的(Reliable):保证样本的可靠传输,可能会尝试多次重传。
- 持续性(Durability)
- 局部瞬态(Transient local):发布者负责对晚到连接(late-joining)的订阅者保留样本数据。
- 易变态(Volatile):不尝试保留样本数据。