不同的 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 |
|
Full support. Default RMW. Packaged with binary releases. |
Eclipse Cyclone DDS |
Eclipse Public License v2.0 |
|
Full support. Packaged with binary releases. |
RTI Connext DDS |
commercial, research |
|
Full support. Support included in binaries, but Connext installed separately. |
GurumNetworks GurumDDS |
commercial |
|
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 实现。