机器人中常用的DDS
在mqtt和ROS1中发现是没有DDS 服务的。
MQTT与DDS是两种不同的消息传递协议,它们各自特有的设计理念和应用场景。
1、MQTT简洁轻量,适用于带宽有限且网络不稳定的场合;
2、DDS面向实时系统,提供更为丰富的服务品质(QoS)选项。在这两者间的明显区别中,DDS的QoS支持被认为是最关键的差异,因为它允许开发者细粒度控制数据交互过程,从而适应多样的实时系统需求。
消息队列遥测传输(MQTT) 是一种轻量级的发布/订阅网络协议,它支持设备间高效且可靠的信息交换,特别是在物联网(IoT)应用中。由于MQTT设计注重简洁性和网络带宽利用,它能优雅地运行在资源受限的设备上,并且在不稳定的网络环境中仍能保持通信的稳健性。
数据分发服务(DDS) 则是一个面向实时系统设计的中间件,它定义了一套复杂的服务品质(QoS)选项,如数据可靠性、传输速度和延迟的界限等,适合对数据分发具有复杂需求的系统,如军事指挥控制、航空航天、车辆系统等场合。
上图中可以看到,topic就像是云里的活动对象,reader需要哪个直接读取就行不需要轮询排队。
在我之前设计的EASYMQos中 用于对图像数据的分发和订阅是存在一定延迟的。
例如我想设计这样的一个架构。
多个节点订阅image 然后分析处理得到处理结果,然后由导航结果处理找到优先级高的下发指令。
在ROS2中我了解到 加入了dds 中间件,就可以实现这个功能。
ROS2生态中用到的DDS有 fast dds ,eclipse cyclone dds. rti dds等
fastdds 是介绍的比较多的,也通常用在智驾中,
这就是自动驾驶中间件的由来:如果说有这样一类软件能够实现上层应用与操作系统甚至是硬件资源的解耦,开发者不用担心自己开发的程序在不同操作系统甚至是硬件平台上兼容性,那么自动驾驶软件的移植效率无疑将会大大提高!!!
到目前为止,它是 最常用和ROS 2中的默认中间件选择。它用于传输命令, 传感器数据,甚至组件之间的视频和点云。
OMG DDS 规范涵盖了构建系统所需的一切 发布-订阅消息传递。他们定义了一个结构类型系统,允许 读取器和写入器之间的自动字节序转换和类型检查。这 类型系统还支持类型演进。可互操作的网络协议和 标准的 C++ API 可以轻松构建集成多个 DDS 的系统 实现。零配置发现也包含在标准中,并且 所有实现都支持。
一 Fast DDS即FastDDS是DDS规范的 C++ 实现,是ROS2的LTS版本和大多数非 LTS 版本中支持的默认中间件。FastDDS主要有以下优点:
· 高性能:即便在网络状况差的情况下也能实现低延迟通信。
· 方便移植到各种平台:Windows,Linux,Mac OS,QNX,VxWorks,iOS,Android,Raspbian/Debian Buster
二 、Eclipse Cyclone DDS 的核心是用 C 语言实现的,并为应用程序提供 C-API。 其他语言绑定包括:
C++
此 API 封装了 Eclipse Cyclone DDS C 核心,使其易于创建可移植 以及 C++ 中可互操作的分布式系统。有关更多信息,请参阅 到 Eclipse Cyclone DDS:C++ API 文档
python
轻松简单地构建可移植且可互操作的分布式系统 现代惯用的 Python。有关详细信息,请参阅 Eclipse Cyclone DDS:Python API 文档.
git clone https://github.com/eclipse-cyclonedds/cyclonedds.git
cd cyclonedds
cd build
cmake -DCMAKE_INSTALL_PREFIX=<install-location> -DENABLE\_SSL=NO -DBUILD_EXAMPLES=ON ..
cmake --build . --parallel
要在成功构建后安装 Cyclone DDS,请执行以下操作:
cmake --build . --target install
更多参考这里
https://cyclonedds.io/docs/cyclonedds/latest/getting_started/helloworld/helloworld_building.html
在古月居的eorinbot中,使用的就是ROS2,ROS2 Foxy默认使用的是fastdds,在图像传输的场景下,会受到限制,此时我们可以切换为cyclonedds。
ros2中 安装
DDS的安装
cyclonedds在OriginBot的镜像中已经配置好,如果想在电脑端配置的话,可以使用如下命令安装:
$ sudo apt install ros-${ROS_DISTRO}-rmw-cyclonedds-cpp
在运行指令的终端中,使用如下指令设置DDS的环境变量,即可切换当前终端所使用的DDS:
$ export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
参考连接 https://www.originbot.org/manual/camera_visualization/#DDS%E7%9A%84%E9%85%8D%E7%BD%AE