警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

使用多个 ROS 2 中间件实施方案

本页解释了默认 RMW 实现以及如何指定替代方案。

先决条件

您应该已经阅读了 DDS 和 ROS 中间件实现页面.

指定 RMW 实施

要使用多个 RMW 实现,必须安装 ROS 2 二进制文件和特定 RMW 实现的任何其他依赖项,或者从源代码构建 ROS 2,并在工作区中包含多个 RMW 实现(如果满足编译时依赖项,RMW 实现将默认包含在构建中)。参见 安装 DDS 实施.


C++ 和 Python 节点都支持环境变量 rmw_implementation 允许用户在运行 ROS 2 应用程序时选择要使用的 RMW 实现。

用户可将该变量设置为特定的执行标识符,如 rmw_cyclonedds_cpp, rmw_fastrtps_cpp, rmw_connextddsrmw_gurumdds_cpp.

例如,使用 Connext RMW 实现的 C++ talker 和 Python 监听器运行 talker 演示:

rmw_implementation=rmw_connextdds 玫瑰2 运行 演示节点 话匣子

# 在另一个终端运行
rmw_implementation=rmw_connextdds 玫瑰2 运行 演示节点 听众

将 RMW 实施添加到工作区

假设您在构建 ROS 2 工作区时只安装了 Cyclone DDS,因此只构建了 Cyclone DDS RMW 实现。在上次构建工作区时,没有安装任何其他 RMW 实现包、 rmw_connextdds 例如,可能无法找到相关 DDS 实现的安装。如果您安装了其他 DDS 实现,例如 Connext,则需要重新触发 Connext RMW 实现构建时的 Connext 安装检查。您可以通过指定 --cmake-force-configure 标记,你就会发现 RMW 实现包会为新安装的 DDS 实现而构建。

在使用额外的 RMW 实现 "重建 "工作区时,有可能会遇到问题。 --cmake-force-configure 选项时,会抱怨默认 RMW 实现发生了变化。要解决这个问题,可以使用 rmw_implementation CMake 参数,或者删除有抱怨的软件包的构建文件夹,然后使用 --从 <package name>;.

故障排除

确保使用特定的 RMW 实施方案

如果 rmw_implementation 环境变量设置为未安装支持的 RMW 实现时,如果只安装了一种实现,则会看到类似下面的错误信息:

预期 RMW 执行 标识符  'rmw_connextdds'  而是 发现 'rmw_fastrtps_cpp', 离去  102.

如果安装了多个 RMW 实现的支持,而您请求使用未安装的实现,则会看到类似的内容:

错误 越来越 RMW 执行 标识符 / RMW 执行  安装 (预期 标识符  'rmw_connextdds'), 离去  1.

如果出现这种情况,请仔细检查您的 ROS 2 安装是否支持您在 rmw_implementation 环境变量。

如果您想在不同的 RMW 实现之间进行切换,请确认 ROS 2 守护进程没有与之前的 RMW 实现一起运行,以避免节点和命令行工具(例如:"......")之间出现任何问题。 玫瑰2 网站.例如,如果运行

rmw_implementation=rmw_connextdds 玫瑰2 运行 演示节点 话匣子

玫瑰2 网站 清单

它将生成一个具有 Cyclone DDS 实现的守护进程:

21318 22.0  0.6 535896 55044 pts/8    Sl   16:14   0:00 /usr/bin/python3 /opt/ros/galactic/bin/_ros2_daemon --rmw-implementation rmw_cyclonedds_cpp --ros-domain-id 22

即使使用正确的 RMW 实现再次运行命令行工具,守护进程的 RMW 实现也不会改变,ROS 2 命令行工具将失效。

要解决这个问题,只需停止守护进程即可:

玫瑰2 守护进程 停止

并使用正确的 RMW 实现重新运行 ROS 2 命令行工具。

OSX 上的 RTI Connext:共享内存内核设置不足导致故障

如果在 OSX 上运行 RTI Connext 时收到类似下面的错误信息:

[D0062|ENABLE]DDS_DomainParticipantPresentation_reserve_participant_index_entryports:!启用保留参与者索引
[D0062|ENABLE]DDS_DomainParticipant_reserve_participant_index_entryports:无法使用共享内存传输。有关可能问题和解决方案的更深入解释,请访问 https://community.rti.com/kb/osx510。

造成该错误的原因是操作系统允许的共享内存段数量或大小不足。因此 域名参与者 无法分配足够的资源并计算其参与者索引,从而导致错误。

您可以临时或永久增加机器的共享内存资源。

要临时增加设置,可以以用户 root 身份运行以下命令:

/usr/sbin/sysctl -w kern.sysv.shmmax=419430400
/usr/sbin/sysctl -w kern.sysv.shmmin=1
/usr/sbin/sysctl -w kern.sysv.shmmni=128
/usr/sbin/sysctl -w kern.sysv.shmseg=1024
/usr/sbin/sysctl -w kern.sysv.shmall=262144

要永久增加设置,您需要编辑或创建文件 /etc/sysctl.conf.创建或编辑此文件需要 root 权限。或者添加到现有的 etc/sysctl.conf 文件或创建 /etc/sysctl.conf 有以下几行

kern.sysv.shmmax=419430400
kern.sysv.shmmin=1
kern.sysv.shmmni=128
kern.sysv.shmseg=1024
kern.sysv.shmall=262144

修改该文件后,您需要重新启动机器,以使修改生效。

本解决方案由 RTI Connext 社区论坛编辑而成。参见 原文 以获得更详细的解释。