不同的 ROS 2 中间件供应商

ROS 2 建立在 DDS/RTPS 之上作为中间件,提供发现、序列化和传输。 This article 详细解释了使用 DDS 实现和/或 DDS 的 RTPS 有线协议背后的动机。 总之,DDS 是一个端到端中间件,提供与 ROS 系统相关的功能,例如分布式发现(不像 ROS 1 中那样集中式)和对传输的不同“服务质量”选项的控制。 DDS 是一个行业标准,由一系列供应商实施,例如 RTI 的 Connext DDS, eProsima’s Fast DDS, Eclipse’s Cyclone DDS, or GurumNetworks’s GurumDDS. RTPS (a.k.a. DDSI-RTPS) 是 DDS 用于通过网络进行通信的有线协议。

ROS 2 支持多种 DDS/RTPS 实现,因为在选择供应商/实现时,它不一定是“一刀切”的。 在选择中间件实现时,您可能会考虑许多因素:后勤考虑因素(如许可证)或技术考虑因素(如平台可用性或计算占用空间)。 供应商可能会提供多种 DDS 或 RTPS 实现,以满足不同的需求。 例如,RTI 的 Connext 实现有几种不同的变体,其目的各不相同,例如一种专门针对微控制器,另一种针对需要特殊安全认证的应用程序(我们目前仅支持其标准桌面版本)。

为了将 DDS/RTPS 实现与 ROS 2 结合使用,需要创建一个“ROS Middleware interface”(又名 rmw 接口或简称 rmw)包,该包使用 DDS 或 RTPS 实现的 API 和工具实现抽象的 ROS 中间件接口。 实现和维护 RMW 包以支持 DDS 实现需要大量工作,但支持至少几个实现对于确保 ROS 2 代码库不依赖于任何特定实现非常重要,因为用户可能希望根据项目需求切换实现。

支持的 RMW 实现

Product name

License

RMW implementation

Status

eProsima Fast DDS

Apache 2

rmw_fastrtps_cpp

Full support. Default RMW. Packaged with binary releases.

Eclipse Cyclone DDS

Eclipse Public License v2.0

rmw_cyclonedds_cpp

Full support. Packaged with binary releases.

RTI Connext DDS

commercial, research

rmw_connextdds

Full support. Support included in binaries, but Connext installed separately.

GurumNetworks GurumDDS

commercial

rmw_gurumdds_cpp

Community support. Support included in binaries, but GurumDDS installed separately.

有关使用多个 RMW 实现的实用信息,请参阅 “Working with multiple RMW implementations” tutorial.

多种 RMW 实现

当前活跃发行版的 ROS 2 二进制版本内置了对多种 RMW 实现的支持(Fast DDS、RTI Connext Pro、Eclipse Cyclone DDS、GurumNetworks GurumDDS)。

默认为 Fast DDS,无需任何额外安装步骤即可使用,因为我们将其与二进制包一起分发。

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

从源代码构建的 ROS 2 工作区可以同时构建和安装多个 RMW 实现。 在编译核心 ROS 2 代码时,如果相关 DDS/RTPS 实现已正确安装且相关环境变量已配置,则将构建找到的任何 RMW 实现。 例如,如果 RMW package for RTI Connext DDS 在工作区中,如果还可以找到 RTI 的 Connext Pro 安装,它将被构建。

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

  • Fast DDS <-> Connext
    • WString published by Fast DDS can’t be received correctly by Connext on macOS

  • Connext <-> Cyclone DDS
    • does not support pub/sub communication for WString

默认 RMW 实现

如果 ROS 2 工作区有多个 RMW 实现,则选择 Fast DDS 作为默认 RMW 实现(如果可用)。

如果未安装 Fast DDS RMW 实现,则将使用按字母顺序排列的第一个 RMW 实现标识符的 RMW 实现。

实现标识符是提供 RMW 实现的 ROS 包的名称,例如“rmw_cyclonedds_cpp”。

例如,如果同时安装了“rmw_cyclonedds_cpp”和“rmw_connextdds”ROS 包,则“rmw_connextdds”将是默认值。

如果安装了“rmw_fastrtps_cpp”,它将是默认值。

参考 guide 有关如何指定在运行 ROS 2 示例时要使用哪个 RMW 实现的信息。

跨供应商通信

虽然不同的 RMW 实现在有限的情况下可能兼容,但这并不能保证。 因此,建议用户确保分布式系统的所有部分都使用相同的 ROS 版本和相同的 RMW 实现。