使用多个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_cpp
、rmw_fastrtps_cpp
、rmw_connextdds
或 rmw_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_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 实现添加到您的工作空间中
假设您已经构建了只安装了 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命令行工具。