不同 DDS 厂商对比
ROS 2 支持多种中间件实现,它们提供发现(discovery)、序列化(serialisation)和传输通信功能。 之所以提供这种灵活性,是因为在中间件的选择上并不存在”一刀切”的方案。 虽然 ROS 2 最初主要基于 DDS/RTPS 构建其中间件层,但 ROS 2 生态系统已扩展到包括 Zenoh 等其他中间件架构。
DDS 中间件
Section titled “DDS 中间件”DDS 是一项行业标准,由多家厂商实现,例如 RTI 的 Connext DDS、eProsima 的 Fast DDS、Eclipse 的 Cyclone DDS,以及 GurumNetworks 的 GurumDDS。 RTPS(又称 DDSI-RTPS)是 DDS 用于通过网络进行通信的线路协议(wire protocol)。
这篇文章 详细解释了在 ROS 中使用 DDS 实现以及 DDS 的 RTPS 线路协议的动机。 总而言之,DDS 是一种端到端中间件,它提供了与 ROS 系统相关的功能,例如分布式发现(不同于 ROS 1 中的集中式发现),以及对传输的不同 QoS(服务质量)选项的控制。
Zenoh 中间件
Section titled “Zenoh 中间件”Zenoh 是一种将互联网规模的发布/订阅与分布式查询相集成的协议。 它专为在各种部署环境中进行高效通信而设计,从服务器级硬件和网络到资源受限的边缘设备均可适用。 Zenoh 将位置透明的优势延伸到存储数据,使查询无需关心数据存放位置即可寻址。
作为 ROS 2 的 RMW 实现,Zenoh 提供了一种比 DDS 更轻量级的替代方案,同时保留了服务质量功能(在 Zenoh 中,基本上不存在”不兼容”的 QoS 设置)。 其极小的线路开销和灵活的路由使 Zenoh 非常适合具有挑战性的网络条件。
支持的 RMW 实现
Section titled “支持的 RMW 实现”| 产品名称 | 许可证 | RMW 实现 | 状态 |
|---|---|---|---|
| eProsima Fast DDS | Apache 2 | rmw_fastrtps_cpp | 完全支持。默认 RMW。随二进制发布包一起打包。 |
| Eclipse Cyclone DDS | Eclipse Public License v2.0 | rmw_cyclonedds_cpp | 完全支持。随二进制发布包一起打包。 |
| RTI Connext DDS | 商业,研究 | rmw_connextdds | 完全支持。支持已包含在二进制包中,但 Connext 需单独安装。 |
| GurumNetworks GurumDDS | 商业 | rmw_gurumdds_cpp | 社区支持。支持已包含在二进制包中,但 GurumDDS 需单独安装。 |
| Eclipse Zenoh | Eclipse Public License v2.0 | rmw_zenoh_cpp | 完全支持。从 Kilted Kaiju 开始随二进制发布包一起打包。 |
有关使用多种 RMW 实现的实用信息,请参阅”使用多种 RMW 实现”教程。
选择中间件实现
Section titled “选择中间件实现”在选择中间件实现时,需要综合考虑多方面因素:许可证等运营层面的因素,以及平台可用性、资源利用率、计算占用等技术层面的因素。 厂商可能提供不止一种中间件实现,以满足不同的需求。
例如,RTI 提供了多个面向不同用途的 Connext 实现变体:一个专门针对微控制器,另一个面向需要特殊安全认证的应用(目前我们只支持其标准桌面版本)。 Eclipse 同时提供 Cyclone DDS 和 Zenoh。 Cyclone DDS 是较轻量的 DDS 实现之一,专为实时确定性通信进行了优化;而 Zenoh 则专为物联网和边缘计算场景设计,在这些场景中,高吞吐量、低延迟以及异构环境间的互操作性是首要关注点。
要让中间件实现与 ROS 2 配合使用,需要创建一个 “ROS Middleware interface”(又称 rmw 接口或简称 rmw)包,该包使用特定实现的 API 和工具来实现抽象的 ROS 中间件接口。
实现和维护 RMW 包以支持各种中间件实现需要大量工作,但这种多样性对于确保 ROS 2 代码库不被绑定到任何特定实现非常重要,因为用户可能希望根据项目需求切换实现。
多种 RMW 实现
Section titled “多种 RMW 实现”当前活跃发行版的 ROS 2 二进制发布包内置支持多种 RMW 实现(Fast DDS、RTI Connext Pro、Eclipse Cyclone DDS、GurumNetworks GurumDDS)。 从 ROS 2 Kilted Kaiju 开始,还包括 Eclipse Zenoh。 默认实现是 Fast DDS,它无需任何额外安装步骤即可工作,因为我们将其与二进制包一起分发。
除 Fast DDS 之外的 RMW,如 Cyclone DDS、Connext 或 GurumDDS,可以通过 安装额外的包 来启用,无需重新构建任何内容或替换任何现有包。
从源码构建的 ROS 2 工作空间可以同时构建和安装多种 RMW 实现。 在编译核心 ROS 2 代码时,如果相关中间件实现已正确安装且相关环境变量已配置,则找到的任何 RMW 实现都会被构建。 例如,如果 RTI Connext DDS 的 RMW 包代码位于工作空间中,并且可以找到 RTI 的 Connext Pro 安装,则它将被构建。
如果 ROS 2 工作空间有多种 RMW 实现,则在可用时 Fast DDS 会被选为默认 RMW 实现。
如果未安装 Fast DDS,则将根据包标识符的字母顺序选择默认中间件。
实现标识符是提供 RMW 实现的 ROS 包的名称,例如 rmw_cyclonedds_cpp。
例如,如果同时安装了 rmw_cyclonedds_cpp 和 rmw_connextdds ROS 包,则 rmw_connextdds 将成为默认实现。
如果安装了 rmw_fastrtps_cpp,它将成为默认实现。
有关在运行 ROS 2 示例时如何指定使用哪个 RMW 实现的信息,请参阅 指南。
DDS 中间件之间的跨厂商通信
Section titled “DDS 中间件之间的跨厂商通信”在许多情况下,使用不同 DDS 中间件实现的节点能够相互通信,但这并非在所有情况下都成立。 虽然不同的 DDS 实现可能在有限的情况下兼容,但这并不能保证。 因此建议用户确保分布式系统的所有部分使用相同的 ROS 版本和相同的 RMW 实现。