不同的 ROS 2 中间件供应商
ROS 2 以 DDS/RTPS 为基础构建中间件,提供发现、序列化和传输。 本文 详细解释了使用 DDS 实现和/或 DDS 的 RTPS 有线协议背后的动机。 总之,DDS 是一个端到端中间件,提供与 ROS 系统相关的功能,例如分布式发现(不像 ROS 1 中那样集中式)和对传输的不同“服务质量”选项的控制。
DDS 是一项行业标准,由一系列供应商实施,例如 RTI 的 Connext DDS、eProsima 的 Fast DDS、Eclipse 的 Cyclone DDS 或 GurumNetworks 的 GurumDDS。 RTPS(又名 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 实现的实用信息,请参阅 “使用多个 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 实现的节点能够进行通信,但这并非在所有情况下都是如此。 以下是不支持的供应商间通信配置列表:
Fast DDS <-> Connext
Fast DDS 发布的
WString
无法被 macOS 上的 Connext 正确接收Connext <-> Cyclone DDS
不支持
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 实现。