警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
使用多个 ROS 2 中间件实施方案
本页解释了默认 RMW 实现以及如何指定替代方案。
先决条件
您应该已经阅读了 DDS 和 ROS 中间件实现页面.
多个 RMW 实施方案
目前使用的发行版的 ROS 2 二进制版本开箱即支持多种 RMW 实现(Fast RTPS、RTI Connext Pro、ADLINK OpenSplice 和 Eclipse Cyclone DDS)。默认的是 Fast RTPS,无需任何额外的安装步骤即可运行,因为我们随二进制软件包一起发布。从 Eloquent 开始,Cyclone DDS 也与二进制软件包一起发布。
其他如 OpenSplice 或 Connext 可通过以下方式启用 安装其他软件包但无需重建任何东西或替换任何现有软件包。
从源代码构建的 ROS 2 工作区可以同时构建和安装多个 RMW 实现。在编译 ROS 2 核心代码的过程中,如果相关的 DDS/RTPS 实现已正确安装并配置了相关的环境变量,找到的任何 RMW 实现都将被构建。例如,如果 用于 RTI Connext 的 RMW 软件包 在工作区中,如果还能找到 RTI 的 Connext Pro 安装,则将构建该程序。
在许多情况下,您会发现使用不同 RMW 实现的节点都能进行通信,但并非在所有情况下都是如此。下面列出了不支持的供应商间通信配置:
- Fast-DDS <-> Connext
不支持通过发布/分站通信
WString
MacOS 上的 Connext 无法正确接收 Fast-DDS 发布的内容
- OpenSplice <-> OpenSplice
不支持
WString
WString
映射到字符串
它有不同的导线表示
- Connext <-> CycloneDDS
不支持
WString
- Connext Dynamic <-> Connext Dynamic
不支持 C 服务
默认 RMW 实施
如果 ROS 2 工作区有多个 RMW 实现,当前默认的 RMW 实现是 Fast RTPS(如果可用)。如果未安装 Fast RTPS RMW 实现,则将使用按字母顺序排列的第一个 RMW 实现标识符的 RMW 实现。实现标识符是提供 RMW 实现的 ROS 软件包名称,例如 rmw_fastrtps_cpp
.例如,如果两个 rmw_opensplice_cpp
和 rmw_connext_cpp
已安装 ROS 软件包、 rmw_connext_cpp
将是默认值。如果 rmw_fastrtps_cpp
将成为默认设置。运行 ROS 2 示例时,如何指定使用哪种 RMW 实现,请参阅下文。
指定 RMW 实施
要使用多个 RMW 实现,您必须安装我们的二进制文件和特定 RMW 实现的任何其他依赖项,或者从源代码构建 ROS 2,并在工作区中包含多个 RMW 实现(默认情况下包含这些实现,并且满足其依赖项)。请参见 安装 DDS 实施.
从 Beta 2 及以上版本开始,C++ 和 Python 节点都支持环境变量 rmw_implementation
.要选择不同的 RMW 实现方式,可以设置环境变量 rmw_implementation
到特定的实施标识符。
使用 Connext 的 RMW 实现,使用 C++ 运行 talker 演示,使用 Python 运行监听器:
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-force-configure
标记,你就会发现 RMW 实现包会为新安装的 DDS 实现而构建。
在使用额外的 RMW 实现 "重建 "工作区时,有可能会遇到问题。 --cmake-force-configure
选项时,会抱怨默认 RMW 实现发生了变化。要解决这个问题,可以使用 rmw_implementation
CMake 参数,或者删除有抱怨的软件包的构建文件夹,然后使用 --从 <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/dashing/bin/_ros2_daemon --rmw-implementation rmw_fastrtps_cpp --ros-domain-id 22
即使使用正确的 RMW 实现再次运行命令行工具,守护进程的 RMW 实现也不会改变,ROS 2 命令行工具将失效。
要解决这个问题,只需停止守护进程即可:
玫瑰2 守护进程 停止
并使用正确的 RMW 实现重新运行 ROS 2 命令行工具。