DDS和Qos

DDS 基于 Topic 来实现发布-订阅模式,而且没有中心节点。是一种很好的端到端分布式通信中间件

DDS 本身并没有定义应该如何发现各节点,而是在 RTPS 中定义该行为。RTPS是 DDS 底层使用的协议,用来保证各种 DDS 的实现之间可以互操作。在 RTPS 中定义了两个独立的发现协议,分别是 PDP(Participant Discovery Protocol) 和 EDP(Endpoint Discovery Protocol),PDP 用于发现各参与节点,EDP 用于发现每个节点提供的所有端点(Endpoints)

ROS2的发布订阅代码里,要指定QoS的历史深度

1
2
rclcpp::QoS::QoS(size_t  history_depth)
QoS(KeepLast(history_depth))

DDS 的发布者和订阅者是解耦的,即发布者不知道谁订阅它发布的数据,反之亦然。DDS 支持动态发现,即节点可以在不需要手动配置的情况下动态发现其他节点及其发布的主题。

QoS策略

无人机传图像到电脑端,可以用best effort模式,可以接受丢帧,但注重实时性。如果用手柄操作无人机,用reliable模式,不能丢失传送数据

DDS 的核心特性之一,它允许用户配置数据传输的行为。常见的 QoS 策略包括:

  1. 可靠性 (Reliability)

RELIABLE:确保每条消息都被成功传输。如果消息未成功传输,会尝试重发。
BEST_EFFORT:没有重发机制,传输失败时不会重试,适用于对数据丢失容忍较高的场景。

  1. 历史 (History)

KEEP_LAST:只保留最新的 N 条消息,队列满时会丢弃最旧的消息。
KEEP_ALL:保持所有历史消息,直到订阅者处理完所有消息。

  1. 队列大小 (Depth)

设置消息队列的长度。如果队列满了,新的消息将根据历史策略被丢弃或覆盖。一般来说,depth 越大,存储的消息越多,可能增加延迟。

  1. 截止时间 (Deadline)

设置消息传输的最大延迟时间。可以用于确保消息的时效性。

  1. 寿命 (Lifespan)

设置消息的有效时间,超时后消息会被丢弃。

  1. 可靠度(Reliability)和发送频率

控制消息的传输方式及频率,常用来减少带宽消耗。

  • 优先级:为不同类型的数据设置不同的优先级。
  • 持久性:确定数据是否会在订阅者连接之前持久保存。

  • 数据过滤和选择(Content-Filtered Topics)

DDS 支持对订阅数据的 内容过滤,即订阅者只接收满足某些条件的数据。这对于减少不必要的数据传输和提高系统效率非常重要。

  • 动态发现

DDS 节点能够自动发现网络中的其他节点和它们所发布的主题。这种机制使得在一个动态变化的系统中,节点可以不依赖静态配置而自动连接和通信。

==注意Fast RTPSFast DDS是同一个东西,不同的叫法

rmw的意思是ROS Middleware Interface

共享内存

ROS的底层通信都是基于XML-RPC协议实现的,以XML-RPC的方式传输数据存在一定的延时和阻塞。在数据量小、频率低的情况下,传输耗费的时间可以忽略不计。但当传输图像和点云等数据量较大的消息,或者执行有一定的实时性要求的任务时,因传输而耗费的时间就不得不考虑。Nodelet包就是为改善这一状况设计的,它提供一种方法,可以让多个算法程序在一个进程中用shared_ptr实现零拷贝通信,以降低因为传输大数据而损耗的时间。将多个node捆绑在一起,使用pluginlib管理,使得同一个manager里面的topic的数据传输更快。

ROS2提供借用消息,允许用户的程序从RMW实现借用消息内存,以消除ROS2应用程序和RMW实现之间的数据复制。此外,rmw_fastrtps通过Fast DDS提供共享内存传输和数据共享传递机制,以加快主机内通信。结合这两个功能(消息借用和数据共享),可以实现零拷贝消息传递管道,从而显著提高ROS2应用程序的性能。

在 rclcpp 中,loaned_message 是一种用于高效消息传递的机制。它允许节点直接从订阅者队列中借用一个消息,而不是复制它。这种机制在处理大型数据或需要高性能的场景中非常有用,因为它可以减少内存拷贝和相关的开销。使用完毕后,应该尽快归还消息,以便订阅者队列可以继续处理其他消息。

默认情况下,rmw_fastrtps_cpp和rmw_fastrts_dynamics_cpp都使用共享内存传输进行主机内通信,同时使用基于网络的传输 (UDPv4)进行主机间消息传递。

为了实现零复制消息传递,应用程序需要启用快速DDS数据共享机制,并使用Loaned Messages API:

要在Iron Irwini或更高版本中启用借用消息,唯一的要求是数据类型为纯旧数据。对于Humble,除了POD类型外,还需要启用快速DDS数据共享。

要启用快速DDS数据共享传递机制,需要加载以下XML配置文件,并且需要将环境变量RMW_FASTPS_USEQOSFROM.XML设置为1

但是FASTDDS需要配置完成零拷贝通讯

参考: # ROS2 DDS中间件