与多个 ROS 2 中间件实现合作
本页解释了默认的 RMW 实现以及如何指定替代方案。
先决条件
指定 RMW 实现
要使用多个 RMW 实现,您必须安装 ROS 2 二进制文件和特定 RMW 实现的任何其他依赖项,或者从源代码构建 ROS 2,并在工作区中使用多个 RMW 实现(如果满足编译时依赖项,则默认将 RMW 实现包含在构建中)。请参阅:doc:安装 DDS 实现。
C++ 和 Python 节点都支持环境变量 RMW_IMPLEMENTATION
,允许用户选择在运行 ROS 2 应用程序时要使用的 RMW 实现。
用户可以将此变量设置为特定的实现标识符,例如 rmw_cyclonedds_cpp
、rmw_fastrtps_cpp
、rmw_connextdds
或 rmw_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_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_cpp talker
# Run in another terminal
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_py listener
set RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_cpp talker
REM run in another terminal
set 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>`__。