< >
Home » ROS2入门教程 » ROS2入门教程-使用多个RMW实现

ROS2入门教程-使用多个RMW实现

ROS2入门教程-使用多个RMW实现

说明:

  • 介绍默认的ROS2中间件实现和如何选择其他的中间件

多个RMW实现

  • 当前的ROS二进制包发布版本已经支持了一种RMW实现(FastRTPS)由于其他支持的RMW无法随意的发布。
  • 尽管ROS的二进制发布版本只支持一种RMW实现。
  • 一个从源码编译的工作空间,可以用来同时编译安装多个RMW实现。
  • 当ROS2的核心代码编译的时候,如果有任何的RMW已经在电脑上安装配置完成,那么对应的RMW也会被同时编译进去。
  • 例如如果Fast RTPS的RMW 软件包在工作空间中,当发现 已经安装过Fast RTPS时,这个软件包也会被同时编译。
  • 在很多情况下你会发现使用不同的RMW实现的节点是能够通信的。
  • 然而并不是在所有情况下都成立。
  • 将来会列出能够在不同RWM实现件通信的配置列表。

默认的RMW实现

  • 如果一个ROS2的工作空间有多个RMW实现,那么如果里面有Fast RTPS,那么它就会被作为默认实现。
  • 如果没有Fast RTPS,那就会按照字母顺序选择默认的RMW实现。
  • 这个字母顺序是按照提供RMW实现的ROS包的名字来的。
  • 比如如果同时安装有rmw_opensplice_cpp和rmw_connext_cpp ROS软件包。
  • rmw_connext_cpp会被选择为默认的RMW实现。
  • 如果同时安装有rmw_fastrtps_cpp,那么它就会被作为默认实现。
  • 下面会介绍在运行ROS2例子的时候如何选择RMW实现。
  • 注意:对于ROS2 alpha版本直到 alpha 8版本 在选择默认版本中,只考虑字母顺序原则。
  • Fast RTPS 相对于其他的实现并没有什么优先级。

指定RMW实现

  • 为了能够同时使用多种实现,你必须要从源码安装ROS

C++的实现

  • ROS 2 C++ 示例程序会编译生成一组可执行文件比如'talker' 默认情况下这些程序会使用默认的RMW实现。
  • 想要使用不同的RMW实现,可译设置环境变量RMW_IMPLEMENTATION。
  • 比如
RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker
  • 这样talker会使用Connext作为默认的RMW实现。

beta 1 和之前版本

  • beta1和之前版本并不支持RMW_IMPLEMENTATION环境变量。

  • ROS 2 C++ 例子程序会针对每一个安装好的RMW实现编译一个版本的可执行文件。

  • 比如会编译生成下面的可执行文件。

    • 一个叫做talker__rmw_fastrtps_cpp的可执行文件,此文件使用Fast RTPS作为RMW实现。
    • 一个叫做talker__rmw_connext_cpp的可执行文件,此文件使用Connext作为RMW实现。
    • 一个叫做talker的可执行文件,此文件使用默认的RMW实现。

Python的实现

  • ROS2的Python例子默认情况下使用默认的RMW实现。
  • 例如假设你已经安装配置完成你的ROS2工作空间。
  • 下面的命令会执行talker发布者,其使用默认的RMW实现。
ros2 run demo_nodes_py talker
  • 和C++一样,你也可以通过设置RMW_IMPLEMENTATION环境变量来更改RMW实现。
export RMW_IMPLEMENTATION=rmw_connext_cpp
ros2 run demo_nodes_py talker
  • beta 1和之前版本

    • 在beta1和之前版本,同样也不支持RMW_IMPLEMENTATION环境变量。
    • 然而你可以通过设置 RCLPY_IMPLEMENTATION环境变量来指定RMW实现。
    • 例如想要指定rmw_fastrtps_cpp作为RMW实现,在Linux上你可以执行:
RCLPY_IMPLEMENTATION=rmw_fastrtps_cpp talker_py

在你的工作空间添加RMW实现

  • 假设你在编译你的工作空间的时候只安装使用了Fast RTPS 作为中间件。

  • 那么其他的RMW实现的ROS包,比如rmw_connext_cpp,就很有可能无法找到相关的DDS实现的安装。

  • 即使你之后又安装了其他的DDS实现,比如说Connext,你必须在Connext RMW实现编译的时候重新触发再次检查Connext的安装位置。

  • 你可以在你下次编译时设置--force-cmake-configure标记来触发。

  • 然后你就能看到新的编译结果已经能够支持新的加入的DDS实现了。

  • 当你在使用--force-cmake-configure选项进行编译的时候,你很有可能会遇到问题说默认的RMW发生了改变。

  • 为了解决这个问题。你可以通过设置RMW_IMPLEMENTATION环境变量,把RMW设置成和原来的RMW一样。

  • 也可以直接删除报错这个错误的软件包的build文件夹,然后再添加上--start-with <软件包名称>参数后重新编译。

常见问题

  • 确保使用特定的RMW实现
  • ROS2 ardent 和之后版本
  • 如果RMW_IMPLEMENTATION环境变量设置为一个尚未支持或安装的RMW版本。
  • 你会看类似于下面的错误信息
Expected RMW implementation identifier of 'rmw_connext_cpp' but instead found 'rmw_fastrtps_cpp', exiting with 102.
  • 如果你安装了多个RMW实现,但是你设置了一个并未安装的实现,那么你会看到类似下面的错误信息。
Error getting RMW implementation identifier / RMW implementation not installed (expected identifier of 'rmw_connext_cpp'), exiting with 1.
  • 如果发生了以上的情况,请再次确认你时候已经安装了对应的RMW实现。

ROS 2 beta 2和之后版本

  • 在ROS 2 beta 2/ beta 3, 设置一个无效的RMW实现并不会产生任何错误。
  • 如果你想确认时候已经使用了否个版本RMW实现,你可以设置RCL_ASSERT_RMW_ID_MATCHES环境变量。
  • 这个环境变量会让节点只允许使用指定的RMW实现。
RCL_ASSERT_RMW_ID_MATCHES=rmw_connext_cpp RMW_IMPLEMENTATION=rmw_connext_cpp ros2 run demo_nodes_cpp talker

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2入门教程