使用多个ROS 2中间件实现

本页面介绍了默认的RMW实现以及如何指定替代实现。

先决条件

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

指定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

例如,要使用C++ talker 和 Python listener 以 Connext RMW 实现运行 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 实现添加到您的工作空间中

假设您已经构建了只安装了 Fast DDS 的 ROS 2 工作空间,因此只有 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 <https://www.ros.org/reps/rep-2000.html#platforms-by-distribution>`_中找到。

确保使用特定的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

将生成一个使用Fast DDS实现的守护进程:

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

即使您再次使用正确的RMW实现运行命令行工具,守护进程的RMW实现也不会更改,从而导致ROS 2命令行工具失败。

为解决此问题,请简单地停止守护进程:

ros2 daemon stop

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

RTI Connext在OSX上的故障是由于内核设置的共享内存不足引起的。

如果在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>`__。