目录
支持的 RMW 实现
多种 RMW 实现
默认 RMW 实现
ROS 2 构建在 DDS/RTPS 之上,作为其中间件,提供发现、序列化和传输。本文( https://design.ros2.org/articles/ros_on_dds.html )详细解释了使用 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 实现变体,如一个专门针对微控制器,另一个针对需要特殊安全认证的应用程序(我们目前仅支持其标准桌面版本)。
为了在 ROS 2 中使用 DDS/RTPS 实现,需要创建一个“ROS 中间件接口”(也称为 rmw
接口或 rmw
)包,该包使用 DDS 或 RTPS 实现的 API 和工具实现抽象的 ROS 中间件接口。实现和维护支持 DDS 实现的 RMW 包需要大量工作,但支持至少几个实现对于确保 ROS 2 代码库不依赖于任何特定实现非常重要,因为用户可能希望根据项目需求更换实现。
支持的 RMW 实现
产品名称 | 许可证 | RMW 实现 | 状态 |
---|---|---|---|
eProsima Fast DDS | Apache 2 阿帕奇 2 | rmw_fastrtps_cpp | 完全支持。默认 RMW。与二进制版本一起打包。 |
Eclipse Cyclone DDS | Eclipse 公共许可证 v2.0 | rmw_cyclonedds_cpp | 完全支持。随二进制版本一起打包。 |
RTI Connext DDS | 商业, 研究commercial, research | rmw_connextdds | 完全支持。支持包含在二进制文件中,但 Connext 单独安装。 |
GurumNetworks GurumDDS | 商业commercial | rmw_gurumdds_cpp | 社区支持。支持包含在二进制文件中,但 GurumDDS 单独安装。 |
有关使用多个 RMW 实现的实用信息,请参阅“使用多个 RMW 实现”教程。https://docs.ros.org/en/jazzy/How-To-Guides/Working-with-multiple-RMW-implementations.html
多种 RMW 实现
ROS 2 的二进制发行版对当前活跃的发行版提供了开箱即用的多个 RMW 实现支持(Fast DDS、RTI Connext Pro、Eclipse Cyclone DDS、GurumNetworks GurumDDS)。默认是 Fast DDS,因为我们将其与我们的二进制包一起分发,所以无需任何额外的安装步骤。
其他 RMWs 如 Cyclone DDS、Connext 或 GurumDDS 可以通过安装额外的软件包来启用,但无需重建任何东西或替换任何现有的软件包。
从源代码构建的 ROS 2 工作区可以同时构建和安装多个 RMW 实现。在编译核心 ROS 2 代码时,如果找到任何 RMW 实现,并且相关的 DDS/RTPS 实现已正确安装并配置了相关的环境变量,则将构建该 RMW 实现。例如,如果工作区中有 RTI Connext DDS 的 RMW 包代码https://github.com/ros2/rmw_connextdds ,并且还找到了 RTI 的 Connext Pro 安装,则将构建该代码。
在许多情况下,您会发现使用不同 RMW 实现的节点能够进行通信,但这并不适用于所有情况。以下是不支持的跨供应商通信配置列表:
Fast DDS <-> Connext
由 Fast DDS 发布的
WString
无法在 macOS 上被 Connext 正确接收
Connext <-> Cyclone DDS
不支持
WString
的发布/订阅通信
默认 RMW 实现
如果一个 ROS 2 工作区有多个 RMW 实现,并且 Fast DDS 可用,则选择 Fast DDS 作为默认的 RMW 实现。如果未安装 Fast DDS RMW 实现,则将使用按字母顺序排列的第一个 RMW 实现标识符的 RMW 实现。实现标识符是提供 RMW 实现的 ROS 包的名称,例如 rmw_cyclonedds_cpp
。例如,如果同时安装了 rmw_cyclonedds_cpp
和 rmw_connextdds
ROS 包,则 rmw_connextdds
将是默认值。如果安装了 rmw_fastrtps_cpp
,它将是默认值。
请参阅指南,了解在运行 ROS 2 示例时如何指定要使用的 RMW 实现。
附录
基于 DDS 的 ROS
本文写于决定使用 DDS 和 RTPS 作为 ROS 2 的基础通信标准之前。有关 ROS 2 如何实现的详细信息,请参见核心文档。