与多个 ROS 2 中间件实现合作

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

先决条件

你应该已经读过 DDS and ROS middleware implementations page.

指定 RMW 实现

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


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

用户可以将此变量设置为特定的实现标识符,例如 rmw_cyclonedds_cpprmw_fastrtps_cpprmw_connextddsrmw_gurumdds_cpp

例如,要使用带有 Connext RMW 实现的 C++ talker 和 Python listener 运行 talker 演示:

RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_cpp talker

# Run in another terminal
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_py listener

将 RMW 实现添加到您的工作区

假设您构建的 ROS 2 工作区仅安装了 Fast DDS,因此仅构建了 Fast DDS RMW 实现。 上次构建您的工作区时,任何其他 RMW 实现包(例如 rmw_connextdds)可能都无法找到相关 DDS 实现的安装。 如果您随后安装了其他 DDS 实现(例如 Connext),则需要重新触发在构建 Connext RMW 实现时发生的 Connext 安装检查。 您可以通过在下一次构建工作区时指定 --cmake-clean-cache 标志来执行此操作,然后您应该会看到 RMW 实现包为新安装的 DDS 实现构建。

使用 --cmake-clean-cache 选项“重建”工作区并添加 RMW 实现时可能会遇到问题,即构建会抱怨默认 RMW 实现发生了变化。 要解决此问题,您可以使用 RMW_IMPLEMENTATION CMake 参数将默认实现设置为之前的状态,也可以删除抱怨的软件包的构建文件夹,然后使用 --packages-start <package name> 继续构建。

故障排除

检查当前 RMW

要检查当前正在使用的 RMW,只需检查 RMW_IMPLEMENTATION 环境变量。在 Linux 系统上,printenv 会打印完整的环境变量列表。 其他操作系统将有其他查看环境变量的程序。 如果环境中没有 RMW_IMPLEMENTATION,则可以安全地假设您正在使用 ROS 发行版的默认值,否则当前 RMW 就是列出的值。

每个 ROS 发行版的默认 RMW 可以在 REP-2000 中找到。

确保使用特定的 RMW 实现

如果将 RMW_IMPLEMENTATION 环境变量设置为未安装支持的 RMW 实现,如果您只安装了一个实现,您将看到类似于以下内容的错误消息:

Expected RMW implementation identifier of 'rmw_connextdds' but instead found 'rmw_fastrtps_cpp', exiting with 102.

如果您安装了对多个 RMW 实现的支持,并且请求使用未安装的实现,您将看到类似以下内容:

Error getting RMW implementation identifier / RMW implementation not installed (expected identifier of 'rmw_connextdds'), exiting with 1.

如果发生这种情况,请仔细检查您的 ROS 2 安装是否包含对您在“RMW_IMPLEMENTATION”环境变量中指定的 RMW 实现的支持。

如果您想在 RMW 实现之间切换,请验证 ROS 2 守护进程未与之前的 RMW 实现一起运行,以避免节点和命令行工具(如“ros2 node”)之间出现任何问题。

例如,如果您运行:

RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_cpp talker

ros2 node list

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

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

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

要解决此问题,只需停止守护进程:

ros2 daemon stop

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

OSX 上的 RTI Connext:由于共享内存内核设置不足而失败

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

[D0062|ENABLE]DDS_DomainParticipantPresentation_reserve_participant_index_entryports:!enable reserve participant index
[D0062|ENABLE]DDS_DomainParticipant_reserve_participant_index_entryports:Unusable shared memory transport. For a more in-   depth explanation of the possible problem and solution, please visit https://community.rti.com/kb/osx510.

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

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

要临时增加设置,您可以以 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 社区论坛编辑的。 有关更详细的解释,请参阅 `原始帖子<https://community.rti.com/kb/osx510>`__