ROS2 + DDS:互操作性现场指南
尽管 ROS 2 旨在使用 DDS 作为其连接框架(请参阅我之前的博客文章 - ROS 2 + DDS:当生态系统合并时以获取更多信息),但为了获得纯 DDS 系统,集成过程有一些必须适应的怪癖与 ROS 2 系统无缝互操作。该博客是互操作性的实用现场指南,涵盖了 ROS 2 的“Bouncy Bolson”(2018 年 7 月)版本中的一些已知问题以及如何缓解这些问题。
ROS 2 的更新
ROS 2 是一个不断发展的项目。未来的 ROS 2 版本可能会有进一步影响互操作性的变化。话虽如此,请始终记住使用 rmw_connext_cpp
ROS 2 下的层——它仍然是 Connext DDS。 Connext 库固有的功能和灵活性仍然可用,使用与非 ROS 实现相同的方法。您可以控制自己的系统。
以下是可能影响纯 DDS 和 ROS 2 系统(除非另有说明,否则为 ROS 2“Bouncy Bolson”)之间互操作性的一些设置:
主题名称和分区
ROS 2 通过在主题的名称或 DDS 分区中对其进行编码来识别主题数据的命名空间。用户数据主题将在“rt”(ROS 主题)命名空间中,在 DDS 中编码为:
主题数据类型
在使用 ROS2 下的 Connext RMW 层时,您可能已经注意到,发现时报告的所有 ROS2 “rt/*”主题都具有相同的数据类型:
这种类型的定义由 ROS2 rmw_connext_cpp 层插入以表示主题数据的序列化,即使主题数据没有改变。当尝试与使用原始数据类型的 DDS 主题进行连接时 -- 将发生 QoS 不匹配,从而阻止连接。
最简单的解决方案是禁止来自 ROS2 参与者的此类型代码公告。这可以通过将 USER_QOS_PROFILES.xml 文件添加到用于启动 ROS2 参与者的目录来完成。该文件包含用于抑制类型代码和类型对象共享的 QoS 设置,例如:
请注意,此文件还将可靠性设置为“Best Effort”——这只是一个示例起点。
另请注意,此 QoS 文件仅影响在与 QoS 文件相同的目录下启动的 ROS2 参与者。如果需要,每个 ROS2 参与者都可以在单独的目录中拥有自己的自定义 QoS 文件。
交通工具选择
将 DDS 系统连接到 ROS2 系统可能会导致有关未安装不可寻址定位器/传输的警告。这是参与者拥有不同可用传输列表的结果,例如参与者 A(udpv4) 发现参与者 B(udpv4, udpv6);将发出警告,参与者 A 将无法使用 udpv6 进行连接。
ROS2下Connext RMW的传输选择使用与Connext-only系统相同的方法:
- 通过添加到
部分,在 USER_QOS_PROFILES.xml 文件中设置允许的传输,如:
<掩码>UDPV4|SHMEM掩码>
- 通过将“NDDS_DISCOVERY_PEERS”文件添加到用于启动应用程序的目录来设置初始对等点(并启用/禁用多播)。纯文本文件应包含以逗号分隔的用于发现的对等点列表,例如:
localhost,192.168.1.12,shmem://
(此示例禁用多播发现)
ROS2中的RMW选择
ROS2下一定要设置环境变量选择Connext作为RMW层:
RMW_IMPLEMENTATION=rmw_connext_cpp
这也可以在启动 ROS2 应用程序时在命令行上传递,如:
RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker
无限支持
一些 ROS2 主题使用无界序列和字符串。寻求使用这些主题进行互操作的 DDS 应用程序需要在 DDS 代码生成器中启用“无限支持”。
展望RTI
请继续关注本系列的下一篇文章,该文章涵盖了 ROS2 阵容中的一个关键(尽管是暂时的)差距:主题数据的记录和重放。
如果您准备开始与 RTI 团队合作并改进您的通信系统,请立即联系我们。我们的专家随时准备为您提供帮助。
物联网技术