不同的ROS 2中间件供应商
ROS 2构建在DDS/RTPS之上作为其中间件,它提供了发现、序列化和传输功能。`本文 <https://design.ros2.org/articles/ros_on_dds.html>`__详细解释了使用DDS实现或DDS的RTPS传输协议的动机。简而言之,DDS是一种端到端中间件,提供了与ROS系统相关的功能,例如分布式发现(不像ROS 1那样集中化)以及对传输的不同“服务质量”选项的控制。
DDS <https://www.omg.org/omg-dds-portal>`__是一个行业标准,由许多供应商实现,例如RTI的`Connext DDS,eProsima的`Fast DDS <https://fast-dds.docs.eprosima.com/>`__,Eclipse的`Cyclone DDS <https://projects.eclipse.org/projects/iot.cyclonedds>`__或GurumNetworks的`GurumDDS <https://gurum.cc/index_eng>`__。RTPS(也称为`DDSI-RTPS <https://www.omg.org/spec/DDSI-RTPS/About-DDSI-RTPS/>`__)是DDS在网络上通信的传输协议。
ROS 2支持多个DDS/RTPS实现,因为在选择供应商/实现时,并不一定是“一刀切”。在选择中间件实现时,可能会考虑多个因素:例如许可证等物流考虑因素,平台可用性或计算资源占用等技术考虑因素。供应商可能会提供多个针对满足不同需求的DDS或RTPS实现。例如,RTI有几个Connext实现的变体,用途不同,比如专门针对微控制器的一种,以及针对需要特殊安全认证的应用程序的另一种(目前我们仅支持其标准桌面版本)。
为了在ROS 2中使用DDS/RTPS实现,需要创建一个“ROS中间件接口”(也称为``rmw``接口或仅称为``rmw``)包,该包使用DDS或RTPS实现的API和工具来实现抽象的ROS中间件接口。为了支持DDS实现而实现和维护RMW包是一项繁重的工作,但至少支持几个实现对于确保ROS 2代码库不与任何特定实现绑定是重要的,因为用户可能希望根据项目需求切换实现。
支持的RMW实现
产品名称 |
许可证 |
RMW实现 |
状态 |
---|---|---|---|
eProsima Fast DDS |
Apache 2 |
|
完全支持。默认RMW。与二进制发行版一起打包。 |
Eclipse Cyclone DDS |
Eclipse公共许可证v2.0 |
|
完全支持。与二进制发行版一起打包。 |
RTI *Connext DDS*(商业、研究) |
commercial(商业)、research(研究) |
|
完全支持。支持已包含在二进制文件中,但Connext需单独安装。 |
GurumNetworks *GurumDDS*(商业) |
商业 |
|
社区支持。支持包含在二进制文件中,但GurumDDS需要单独安装。 |
有关使用多个RMW实现的实际信息,请参阅 "使用多个RMW实现" 教程。
多个RMW实现
当前活跃的ROS 2二进制发布版本已经内置了对多个RMW实现的支持(Fast DDS、RTI Connext Pro、Eclipse Cyclone DDS、GurumNetworks GurumDDS)。默认使用的是Fast DDS,因为我们将其与二进制包一起分发,所以无需进行任何额外的安装步骤。
其他像Cyclone DDS、Connext或GurumDDS等RMW可以通过 安装附加软件包 启用,但无需重新构建或替换任何现有软件包。
从源代码构建的ROS 2工作空间可以同时构建和安装多个RMW实现。在编译核心ROS 2代码时,如果发现了任何RMW实现,并且相关的DDS/RTPS实现已经正确安装并配置了相关的环境变量,那么这些RMW实现将会被构建。例如,如果工作空间中存在`RMW package for RTI Connext DDS <https://github.com/ros2/rmw_connextdds>`__的代码,那么如果还可以找到RTI的Connext Pro的安装,它也将被构建。
在许多情况下,使用不同RMW实现的节点可以进行通信,但并非在所有情况下都成立。以下是不支持的跨厂商通信配置列表:
- Fast DDS <-> Connext
在macOS上,Fast DDS发布的``WString``无法被Connext正确接收
- Connext <-> Cyclone DDS
不支持
WString
类型的发布/订阅通信