不同的 ROS 2 中间件供应商

ROS 2 以 DDS/RTPS 作为中间件,提供发现、序列化和传输功能。 本文 详细解释了使用 DDS 实现和/或 DDS 的 RTPS 线协议的动机。总之,DDS 是一种端到端中间件,可提供与 ROS 系统相关的功能,如分布式发现(而非 ROS 1 中的集中式发现)和对不同运输 "服务质量 "选项的控制。

DDS 是一个行业标准,由一系列供应商实施,如 RTI 的 Connext DDS,eProsima 的 快速 DDS,Eclipse 的 旋风 DDS或 GurumNetworks 的 GurumDDS.RTPS (又名 DDSI-RTPS)是 DDS 用于网络通信的有线协议。

ROS 2 支持多种 DDS/RTPS 实现,因为在选择供应商/实现时,并不一定要 "一刀切"。在选择中间件实现时,您可能会考虑许多因素:如许可证等后勤因素,或平台可用性或计算足迹等技术因素。供应商可能会针对不同需求提供多种 DDS 或 RTPS 实现。例如,RTI 的 Connext 实现就有多种不同的用途,如一种专门针对微控制器,另一种针对需要特殊安全认证的应用(目前我们只支持其标准桌面版本)。

为了在 ROS 2 中使用 DDS/RTPS 实现,需要一个"R操作系统 M中级w是界面"(又名 rmw 接口,或只是 rmw需要使用 DDS 或 RTPS 实现的应用程序接口和工具创建 RMW(ROS 中间件)包来实现抽象的 ROS 中间件接口。为支持 DDS 实现而实现和维护 RMW 包是一项繁重的工作,但至少支持几种实现对于确保 ROS 2 代码库不与任何特定实现绑定非常重要,因为用户可能希望根据自己项目的需要更换实现。

支持的 RMW 实现

产品名称

许可证

RMW 的实施

现状

eProsima 快速 DDS

阿帕奇 2

rmw_fastrtps_cpp

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

日蚀 旋风 DDS

日蚀公共许可证 v2.0

rmw_cyclonedds_cpp

全面支持。与二进制版本一起打包。

RTI Connext DDS

商业、研究

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,它无需任何额外的安装步骤即可运行,因为我们随二进制软件包一起分发。

其他 RMW(如 Cyclone DDS、Connext 或 GurumDDS)可通过以下方式启用 安装其他软件包但无需重建任何东西或替换任何现有软件包。

从源代码构建的 ROS 2 工作区可以同时构建和安装多个 RMW 实现。在编译 ROS 2 核心代码的过程中,如果相关的 DDS/RTPS 实现已正确安装并配置了相关的环境变量,找到的任何 RMW 实现都将被构建。例如,如果 用于 RTI Connext DDS 的 RMW 软件包 在工作区中,如果还能找到 RTI 的 Connext Pro 安装,则将构建该程序。

在许多情况下,您会发现使用不同 RMW 实现的节点都能进行通信,但并非在所有情况下都是如此。下面列出了不支持的供应商间通信配置:

  • 快速 DDS <-> Connext
    • WString MacOS 上的 Connext 无法正确接收 Fast DDS 发布的内容

  • Connext <-> 旋风 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 实现。