使用多个ROS 2中间件实现 [待校准@6619]

本页介绍默认RMW实现以及如何指定替代方案。 [待校准@6620]

指定RMW实现 [待校准@6622]

要使用多个RMW实现,您必须已安装ROS 2二进制文件以及特定RMW实现的任何其他依赖项,或者从工作区中具有多个RMW实现的源文件构建ROS 2 (如果满足RMW的编译时依赖关系,则默认情况下,RMW实现包含在构建中)。见 Install DDS implementations[待校准@6623]


C nodes和Python节点都支持环境变量 RMW_IMPLEMENTATION ,允许用户选择运行ROS 2应用程序时使用的RMW实现。 [待校准@6624]

用户可以将此变量设置为特定的实现标识符,例如 rmw_cyclonedds_cpprmw_fastrtps_cpprmw_connextddsrmw_gurumdds_cpp[待校准@6625]

例如,要使用ctaltalker和Python侦听器以及Connext RMW实现来运行talker例程: [待校准@6626]

RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker

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

将RMW实现添加到您的工作区 [待校准@6627]

假设您已经构建了ROS 2工作区,只安装了快速RTPS,因此只构建了快速RTPS RMW实现。上次构建工作区时,任何其他RMW实现包,例如 rmw_connext_cpp ,都可能找不到相关DDS实现的安装。如果随后安装其他DDS实现 (例如Connext),则需要重新触发对构建Connext RMW实现时发生的Connext安装的检查。您可以通过在下一个工作区构建中指定 --cmake-force-configure 标志来实现这一点,并且您应该看到RMW实现包随后为新安装的DDS实现构建。 [待校准@6628]

可能遇到问题 "rebuilding" 工作区额外RMW实现使用 --cmake-force-configure 选项生成抱怨默认RMW实施更换。要解决此问题,您可以使用 RMW_IMPLEMENTATION CMake参数将默认实现设置为以前的实现,也可以删除投诉包的构建文件夹,然后继续使用 --start-with <package name> 进行构建。 [待校准@6629]

故障排除

确保特定RMW实施的使用 [待校准@6631]

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

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

如果您支持安装多个RMW实现,并且请求使用未安装的实现,您将看到类似于以下内容: [待校准@6633]

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

如果这发生,double检查ROS安装包括支持RMW执行指定在 RMW_IMPLEMENTATION 环境变量。 [待校准@6634]

如果要在RMW实现之间切换,请验证ROS 2守护进程未与先前的RMW实现一起运行,以避免节点和命令行工具 (如 ros2 node ) 之间出现任何问题。例如,如果您运行: [待校准@6635]

RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker

[待校准@6636]

ros2 node list

它将生成具有快速RTPS实现的守护程序: [待校准@6637]

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

即使您使用正确的RMW实现再次运行命令行工具,守护程序的RMW实现也不会改变,ROS 2命令行工具也会失败。 [待校准@6638]

要解决此问题,只需停止守护进程: [待校准@6639]

ros2 daemon stop

并使用正确的RMW实现重新运行ROS 2命令行工具。 [待校准@6640]

OSX上的RTI Connext: 由于共享内存内核设置不足而导致故障 [待校准@6641]

如果在OSX上运行RTI Connext时收到类似以下的错误消息: [待校准@6642]

[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 无法分配足够的re源文件并计算其导致错误的参与者索引。 [待校准@6643]

您可以临时或永久增加计算机的共享内存源文件。 [待校准@6644]

要临时增加设置,您可以以用户根用户身份运行以下命令: [待校准@6645]

/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 。创建或编辑此文件将需要根权限。添加到您现有的 etc/sysctl.conf 文件或使用以下行创建 /etc/sysctl.conf : [待校准@6646]

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

修改此文件后,您需要重新启动计算机才能使更改生效。 [待校准@6647]

此解决方案由RTI Connext社区论坛编辑。更多详细解释见 original post[待校准@6648]