关于不同的ROS 2 DDS/RTPS供应商

ROS 2建立在DDS/RTPS之上,DDS/RTPS 作为ROS2中间件,提供了发现、序列化和传输功能。 这篇文章 详细解释使用DDS或RTPS总线协议的动机。总之,DDS是一种端到端中间件,它提供与ROS系统类似的功能,例如分布式发现 (不像ROS 1那样集中) 以及对不同的 "Quality of Service(服务质量)"传输选择的控制。 [小鱼@9730]

DDS 是一系列供应商实施的行业标准,如RTI的 Connext DDS, eProsima的 Fast DDS, Eclipse的 Cyclone DDS ,或GurumNetworks的 GurumDDS. RTPS (a.k.a. DDSI-RTPS ) 是DDS通过网络进行通信的有线协议。 [小鱼@9731]

ROS 2支持多个DDS/RTPS实现,因为在选择供应商/实现时,它不一定是一刀切的 ("one size fits all") 。在选择中间件实现时,您可能会考虑许多因素: 诸如许可证之类的后续考虑,或诸如平台可用性或计算占用的技术考虑。供应商可以提供针对满足不同需求的多个DDS或RTPS实现。例如,RTI的Connext实现有一些不同的目的,就像一个专门调用目标微控制器,另一个目标应用需要特殊的安全认证 (我们目前只支持他们的标准桌面版本)。 [小鱼@9732]

为了将DDS/RTPS实现与ROS 2一起使用,需要创建一个 "ROS Middlew 是接口” (亦称作 rmw 接口或只是 rmw) 包,使用DDS或RTPS实现的API和工具实现抽象的ROS中间件接口。这是很多工作去实施和维护支持DDS实现的RMW包,但支持至少几种(DDS)实现是很重要的,以确保ROS 2代码库不依赖于任何一个特定实现,因为用户可能希望根据项目的需要切换(不同的DDS)实现。 [Alyssa@9733]

支持的RMW实现 [待校准@9734]

产品名称

许可证

RMW实现

状态

eProsima Fast DDS

Apache 2

rmw_fastrtps_cpp

全力支持。默认RMW。打包成二进制发行版本。

Eclipse Cyclone DDS

Eclipse Public License v2.0

rmw_cyclonedds_cpp

全力支持。打包成二进制发行版本。

RTI Connext

商业,研究

rmw_connext_cpp

全力支持。支持包含在二进制文件中,但Connext可以单独安装。 [小鱼@9750]

GurumNetworks GurumDDS

商业

rmw_gurumdds_cpp

社区支持。支持包含在二进制文件中,但GurumDDS可以单独安装。 [小鱼@9754]

有关使用多个RMW实现的实用信息,请参见 "使用多个RMW实现" 教程。 [小鱼@9755]

多个RMW实现

ROS 2二进制发行版本目前有源发行版有内置支持几个RMW实现开箱即用 (Fast DDSRTI Connext Pro,EclipseCycloneDDS,GurumNetworks GurumDDS)。自从Galactic以来,默认值为CycloneDDS,无需任何额外的安装步骤即可工作,因为我们将其与二进制包一起分发。在Galactic之前,默认值为Fast DDS,无需任何额外安装步骤即可工作。 [小鱼@9757]

文档 安装额外的包 可以启用其他RMWs,如Fast DDS、Connext或GurumDDS,但无需重建任何东西或替换任何现有的包。 [小鱼@9758]

从源文件构建的ROS 2工作区可以同时构建和安装多个RMW实现。在编译核心ROS 2代码时,如果正确安装了相关的DDS/RTPS实施并且配置了相关的环境变量,则将构建找到的任何RMW实施。例如,如果 RMW 包 RTI Connext 的代码在工作区中,如果也可以找到RTI的Connext Pro的安装,它将被构建。 [小鱼@9759]

在许多情况下,您会发现使用不同RMW实现的节点也能够互相通信,但是并非在所有情况下都是如此。以下是不支持的供应商间通讯配置列表: [小鱼@9760]

  • Fast DDS <-> Connext
    • 在macOS上使用Fast DDS发布的 WString 不能被Connext正确接收 。 [Alyssa@9762]

  • Connext <-> Cyclone DDS
  • Connext Dynamic <-> Connext Dynamic
    • 不支持C服务

默认RMW实现

如果一个ROS 2工作区有多个RMW实现,默认的RMW实现,因为Galactic被选为CycloneDDS (如果可用)。如果未安装CycloneDDS RMW实现,则将使用具有按字母顺序排列的第一个RMW实现标识符的RMW实现。实现标识符是提供RMW实现的ROS包的名称,例如 rmw_cyclonedds_cpp 。例如,如果同时安装了 rmw_fastrtps_cpprmw_connext_cpp 的ROS包,则 rmw_connext_cpp 将是默认值。如果安装了 rmw_cyclonedds_cpp ,这将是默认设置。 [小鱼@9768]

有关如何指定在运行ROS 2示例时使用哪个RMW实现,请参见 教程[小鱼@9769]