不同的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_fastrtps_cpp

完全支持。默认RMW。与二进制发行版一起打包。

Eclipse Cyclone DDS

Eclipse公共许可证v2.0

rmw_cyclonedds_cpp

完全支持。与二进制发行版一起打包。

RTI *Connext DDS*(商业、研究)

commercial(商业)、research(研究)

rmw_connextdds

完全支持。支持已包含在二进制文件中,但Connext需单独安装。

GurumNetworks *GurumDDS*(商业)

商业

rmw_gurumdds_cpp

社区支持。支持包含在二进制文件中,但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 类型的发布/订阅通信

默认的RMW实现

如果一个ROS 2工作空间有多个RMW实现,如果可用的话会选择Fast DDS作为默认的RMW实现。如果未安装Fast DDS的RMW实现,将使用按字母顺序排列的第一个RMW实现标识符的RMW实现。实现标识符是提供RMW实现的ROS软件包的名称,例如 rmw_cyclonedds_cpp。例如,如果安装了 rmw_cyclonedds_cpprmw_connextdds 两个ROS软件包,rmw_connextdds 将成为默认的。如果以后安装了 rmw_fastrtps_cpp,它将成为默认的。

查看 指南 以了解在运行ROS 2示例时如何指定要使用的RMW实现。