目录

一、前言

二、ROS2 支持的 RMW 实施

三、有关 worMultiple RMW 实施的实用信息

四、默认 RMW 实施

五、使用多个 ROS 2 中间件实现

5.1 指定 RMW 实现

5.2 将 RMW 实现添加到您的工作区

5.3 故障排除

5.4 OSX 上的 RTI Connext:由于共享内存内核设置不足而导致失败


一、前言

ROS 2 构建在 DDS/RTPS 之上,DDS/RTPS作为ROS的中间件,提供发现、序列化和传输。本文详细解释了使用 DDS 实现和/或 DDS 的 RTPS 有线协议背后的机理。总而言之,DDS 是一个端到端的中间件,它提供与 ROS 系统相关的功能,例如分布式发现(不像 ROS 1 中那样集中)和控制运输的不同“服务质量”选项。

DDS 是由一系列供应商实施的行业标准,例如 RTI 的 Connext DDS、eProsima 的 Fast DDS、Eclipse 的 Cyclone DDS 或 GurumNetworks 的 GurumDDS。 RTPS(又名 DDSI-RTPS)是 DDS 用于通过网络进行通信的有线协议。

ROS 2 支持多种 DDS/RTPS 实现,因为在选择供应商/实现时它不一定是“一刀切”。在选择中间件实现时,您可能会考虑许多因素:许可证等后勤考虑因素,或平台可用性或计算占用空间等技术考虑因素。供应商可能会提供不止一种 DDS 或 RTPS 实施,以满足不同的需求。例如,RTI 的 Connext 实现有一些变体,其目的各不相同,比如一个专门针对微控制器,另一个针对需要特殊安全认证的应用程序(我们目前只支持他们的标准桌面版本)。

二、ROS2 支持的 RMW 实施

为了在 ROS 2 中使用 DDS/RTPS 实现,需要创建一个“ROS 中间件接口”(ROS Middleware interface;又名 rmw 接口或只是 rmw)包,使用 DDS 或 RTPS 实现的 API 和工具来实现抽象 ROS 中间件接口。实现和维护 RMW 包以支持 DDS 实现需要大量工作,但支持至少几个实现对于确保 ROS 2 代码库不与任何特定实现绑定非常重要,因为用户可能希望根据具体情况切换实现根据他们项目的需要。

ROS支持模块(RMW)含多个DDS产品

        ROS2 支持的DDS中间件(RMW)间表:

Product name

License

RMW implementation

Status

eProsima Fast DDS

Apache 2

rmw_fastrtps_cpp

Full support. Default RMW. Packaged with binary releases.

Eclipse Cyclone DDS

Eclipse Public License v2.0

rmw_cyclonedds_cpp

Full support. Packaged with binary releases.

RTI Connext DDS

commercial, research

rmw_connextdds

Full support. Support included in binaries, but Connext installed separately.

GurumNetworks GurumDDS

commercial

rmw_gurumdds_cpp

Community support. Support included in binaries, but GurumDDS installed separately.

有关使用多个 RMW 实现的实用信息,请参阅“使用多个 RMW 实现”教程。

三、有关 worMultiple RMW 实施的实用信息

当前活跃发行版的 ROS 2 二进制版本内置了对几个开箱即用的 RMW 实现的支持(Fast DDS、RTI Connext Pro、Eclipse Cyclone DDS、GurumNetworks GurumDDS)。默认是 Fast DDS,它不需要任何额外的安装步骤,因为我们将它与我们的二进制包一起分发。

其他 RMW,如 Cyclone DDS、Connext 或 GurumDDS 可以通过安装额外的包来启用,而无需重建任何东西或替换任何现有的包。

从源代码构建的 ROS 2 工作空间可以同时构建和安装多个 RMW 实现。在编译核心 ROS 2 代码时,如果相关 DDS/RTPS 实现已正确安装并且相关环境变量已配置,则将构建找到的任何 RMW 实现。例如,如果 RTI Connext DDS 的 RMW 包的代码在工作区中,如果还可以找到 RTI 的 Connext Pro 安装,它将被构建。使用多个 RMW 实现,请参阅“使用多个 RMW 实现”教程。

在许多情况下,您会发现使用不同 RMW 实现的节点能够进行通信,但并非在所有情况下都是如此。以下是不受支持的供应商间通信配置列表:

  • fast  DDS <-> Connext

macOS 上的 Connext 无法正确接收 Fast DDS 发布的 WString

  • Connext <-> Cyclone DDS

不支持 WString 的 pub/sub 通信

四、默认 RMW 实施

如果 ROS 2 工作区有多个 RMW 实现,则选择 Fast DDS 作为默认 RMW 实现(如果可用)。如果未安装 Fast DDS RMW 实现,则将使用按字母顺序排列第一个 RMW 实现标识符的 RMW 实现。实现标识符是提供 RMW 实现的 ROS 包的名称,例如rmw_cyclonedds_cpp。例如,如果同时安装了 rmw_cyclonedds_cpp 和 rmw_connextdds ROS 软件包,则 rmw_connextdds 将是默认值。如果 rmw_fastrtps_cpp 曾经安装过,它将是优先默认设置。

五、使用多个 ROS 2 中间件实现

5.1 指定 RMW 实现

要使用多个 RMW 实现,您必须安装 ROS 2 二进制文件和特定 RMW 实现的任何其他依赖项,或者从源代码构建 ROS 2,在工作区中使用多个 RMW 实现(如果默认情况下 RMW 实现包含在构建中,则它们的编译时依赖性得到满足)。请参阅安装 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 demo:

# ubuntu下执行RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_cpp talker# Run in another terminal
RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_py listener
# 在window 10 执行:
set RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_cpp talkerREM run in another terminal
set RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_py listener

5.2 将 RMW 实现添加到您的工作区

假设您已经构建了只安装了 Fast DDS 的 ROS 2 工作区,因此只构建了 Fast DDS RMW 实现。上次构建工作区时,任何其他 RMW 实现包(例如 rmw_connextdds)可能无法找到相关 DDS 实现的安装。如果您随后安装了额外的 DDS 实现,例如 Connext,您将需要在构建 Connext RMW 实现时重新触发对 Connext 安装的检查。您可以通过在下一个工作区构建中指定 --cmake-force-configure 标志来执行此操作,并且您应该看到 RMW 实现包随后为新安装的 DDS 实现构建。

使用 --cmake-force-configure 选项“重建”工作区时可能会遇到问题,其中构建抱怨默认 RMW 实现发生更改。要解决此问题,您可以使用 RMW_IMPLEMENTATION CMake 参数将默认实现设置为之前的实现,或者您可以删除抱怨包的构建文件夹并使用 --start-with <package name> 继续构建。

5.3 故障排除

1)检查当前 RMW

要检查当前使用的 RMW,您只需检查 RMW_IMPLEMENTATION 环境变量。在 Linux 系统上 printenv 打印环境变量的完整列表。其他操作系统会有其他查看环境变量的过程。如果 RMW_IMPLEMENTATION 不在环境中,可以安全地假设您使用的是 ROS 发行版的默认值,否则当前 RMW 是列出的值。每个 ROS Distro 的默认 RMW 可以在 REP-2000 中找到。

2)确保使用特定的 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 22

即使您使用正确的 RMW 实现再次运行命令行工具,守护程序的 RMW 实现也不会改变,并且 ROS 2 命令行工具将失败。

要解决这个问题,只需停止守护进程:

ros2 daemon stop

并使用正确的 RMW 实现重新运行 ROS 2 命令行工具。

5.4 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

修改此文件后,您需要重新启动计算机才能使更改生效。

参考技术资料:

ROS on DDS (ros2.org)

【ROS 2知识】关于通信中间件RMW相关推荐

  1. 集群多机ROS通信中间件:swarm_ros_bridge

    最近写了一个无线网络环境下(比如WIFI)多机ROS通信的ROS包"swarm_ros_bridge": https://gitee.com/shu-peixuan/swarm_r ...

  2. 自动驾驶中间件之二:通信中间件,DDS与SOME/IP 谁主沉浮?

    本文是自动驾驶中间件科普系列第二篇,上一篇为自动驾驶中间件之一:AUTOSAR正在被"边缘化"? 随着传感器的数量越来越多,数据来源越来越多.规模也会越来越大,那这些多源异构数据如 ...

  3. ROS与移动底盘通信

    作者丨白鸟无言 来源丨https://blog.csdn.net/qq_42688495/article/details/118568021 编辑丨一点人工一点智能 点击进入->3D视觉工坊学习 ...

  4. ROS与Android的通信

    通过ROS-Bridge,建立起ROS与Android的通信. 代码为: sudo apt-get install ros-<rosdistro>-rosbridge-suite//下载R ...

  5. ROS分布式多机通信

    背景 今天在测试时需要配置两台计算机通过ROS进行通信,在此记录下来. 以下内容为胡春旭编撰的<ROS机器人开发实践>中的内容,个人认为写得非常简洁实用. ROS分布式多机通信 ROS是一 ...

  6. 机器人自主导航 | ROS与移动底盘通信

    本实验是实现机器人自主导航的重要步骤,对于轮式机器人,可以通过在底盘加装轮式里程计的方式来获得机器人的速度数据,这些数据可以用来辅助机器人实现自主定位,同时机器人还需要将控制指令发送给移动底盘,实现自 ...

  7. 汽车软件通信中间件SOME/IP简述

    文章目录 1.SOME/IP 是中间件吗? 2. SOME/IP 能干嘛? 3. SOME/IP 与 CAN 的不同? 通信速度 通信负荷 4. SOME/IP 和车载以太网.IP有什么关系? 4. ...

  8. ros与下位机通信常用的c++ boost串口应用

    一.首先移植c++ boost 库: 1. 先去 Boost官网 下载最新的Boost版本, 我下载的是boost_1_6_0版本, 解压. 2. 进入解压后目录: cd boost_1_6_0, 执 ...

  9. ROS Kinetic 与STM32通信,控制一盏LED灯

    1.首先.新建一个工作空间. mkdir - p stm32_project/src    编译 catkin_make   进入src cd stm32_project/src   添加stm32f ...

最新文章

  1. linux 命令 —-— vi编辑器
  2. jdk紧急漏洞,XMLDecoder反序列化攻击
  3. 06 矩阵计算【动手学深度学习v2】
  4. 北邮-上机-提交错误解决及一些经验
  5. zeros什么意思_ma=zeros(n);是什么意思'
  6. 获取0~100之间的随机数
  7. js页面传值php页面,php实现跳转传值有什么方法,js页面跳转传值
  8. nginx上传目录配置,禁止执行权限
  9. html5 video.js 使用及兼容所有浏览器
  10. Android移动应用基础教程【服务】
  11. 50套3dmax家具建模详细教程 3dmax床建模教程丨3Dmax基础教程3dmax教学3dmax室内设计教程
  12. matlab 冒泡排序函数,MATLAB实现冒泡排序算法
  13. 简单阐述标准盒模型和怪异盒模型的差别和区别
  14. Linux系统管理、系统安全命令概述
  15. 【教程】通过lothelper实现短信接收测试
  16. Python之九宫格输入
  17. 魔方(10)金字塔魔方、金字塔二重奏魔方
  18. もし私はあなたの恋人(1)作者xuanyang
  19. 基于Visio的二次开发
  20. 标签分发协议(LDP)

热门文章

  1. 第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)
  2. 微信小程序为什么使用双线程模型
  3. Python实现最大熵模型
  4. Odoo产品分析 (二) -- 商业板块(1) -- 销售(1)
  5. Virtual Box虚拟机安装win7
  6. 2022年高考普通高等数学第五题流程图答案,用少儿编程的方式怎么实现?其实很简单
  7. python|Flaskbootstrapecharts简单应用
  8. Hummer TimeSeries DB (蜂鸟时序数据库)技术介绍
  9. 微信公众平台两个推广小技巧
  10. 中国国际广播电视网络台(CIBN)成立