警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
使用多个 ROS 2 中间件实施方案
本页解释了默认 RMW 实现以及如何指定替代方案。
先决条件
您应该已经阅读了 DDS 和 ROS 中间件实现页面.
指定 RMW 实施
要使用多个 RMW 实现,必须安装 ROS 2 二进制文件和特定 RMW 实现的任何其他依赖项,或者从源代码构建 ROS 2,并在工作区中包含多个 RMW 实现(如果满足编译时依赖项,RMW 实现将默认包含在构建中)。参见 安装 DDS 实施.
C++ 和 Python 节点都支持环境变量 rmw_implementation
允许用户在运行 ROS 2 应用程序时选择要使用的 RMW 实现。
用户可将该变量设置为特定的执行标识符,如 rmw_cyclonedds_cpp
, rmw_fastrtps_cpp
, rmw_connext_cpp
或 rmw_gurumdds_cpp
.
例如,使用 Connext RMW 实现的 C++ talker 和 Python 监听器运行 talker 演示:
rmw_implementation=rmw_connext_cpp 玫瑰2 运行 演示节点 话匣子
# 在另一个终端运行
rmw_implementation=rmw_connext_cpp 玫瑰2 运行 演示节点 听众
rmw_implementation=rmw_connext_cpp 玫瑰2 运行 演示节点 话匣子
# 在另一个终端运行
rmw_implementation=rmw_connext_cpp 玫瑰2 运行 演示节点 听众
设置 rmw_implementation=rmw_connext_cpp ros2 run demo_nodes_cpp talker
REM 在另一个终端运行
设置 rmw_implementation=rmw_connext_cpp ros2 run demo_nodes_py 监听器
将 RMW 实施添加到工作区
假设您在构建 ROS 2 工作区时只安装了 Fast RTPS,因此只构建了 Fast RTPS RMW 实现。在上次构建工作区时,没有安装任何其他 RMW 实现包、 rmw_connext_cpp
例如,可能无法找到相关 DDS 实现的安装。如果您安装了其他 DDS 实现,例如 Connext,则需要重新触发 Connext RMW 实现构建时的 Connext 安装检查。您可以通过指定 --cmake-clean-cache
标记,你就会发现 RMW 实现包会为新安装的 DDS 实现而构建。
在使用额外的 RMW 实现 "重建 "工作区时,有可能会遇到问题。 --cmake-clean-cache
选项时,会抱怨默认 RMW 实现发生了变化。要解决这个问题,可以使用 rmw_implementation
CMake 参数,或者删除有抱怨的软件包的构建文件夹,然后使用 --packages-start <package name>;
.
故障排除
确保使用特定的 RMW 实施方案
如果 rmw_implementation
环境变量设置为未安装支持的 RMW 实现时,如果只安装了一种实现,则会看到类似下面的错误信息:
预期 RMW 执行 标识符 的 'rmw_connext_cpp' 但 而是 发现 'rmw_fastrtps_cpp', 离去 与 102.
如果安装了多个 RMW 实现的支持,而您请求使用未安装的实现,则会看到类似的内容:
错误 越来越 RMW 执行 标识符 / RMW 执行 不 安装 (预期 标识符 的 'rmw_connext_cpp'), 离去 与 1.
如果出现这种情况,请仔细检查您的 ROS 2 安装是否支持您在 rmw_implementation
环境变量。
如果您想在不同的 RMW 实现之间进行切换,请确认 ROS 2 守护进程没有与之前的 RMW 实现一起运行,以避免节点和命令行工具(例如:"......")之间出现任何问题。 玫瑰2 网站
.例如,如果运行
rmw_implementation=rmw_connext_cpp 玫瑰2 运行 演示节点 话匣子
和
玫瑰2 网站 清单
将生成一个执行快速 RTPS 的守护进程:
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 0
即使使用正确的 RMW 实现再次运行命令行工具,守护进程的 RMW 实现也不会改变,ROS 2 命令行工具将失效。
要解决这个问题,只需停止守护进程即可:
玫瑰2 守护进程 停止
并使用正确的 RMW 实现重新运行 ROS 2 命令行工具。