通信中间件 Fast DDS 基础概念简述与通信示例

      最后更新:2022-07-30 03:49:53 手机定位技术交流文章

      从事汽车软件开发,通信中间件绕不开,目前最热门的两个是: Some/IP和DDS。DDS是分布式通信的标准.有许多商业和开放源代码的实现,快速DDS是其中之一。它用于ROS2,而 Apollo 中的 CyberRT 框架中也有它的身影。

      谈论快速DDS我先谈一下DDS是什么。

      什么是DDS

      DDS 是 OMG 组织发布的一种中间件协议和 API 标准,它将系统的组件集成在一起,提供业务和任务关键型物联网 (IoT) 应用程序所需的低延迟数据连接、极高的可靠性和可扩展架构。

      DDS(Data Distribution Service,数据分发服务)是一种以数据为中心的通信协议,用于分布式软件应用程序通信。

      它描述了支持数据提供者(Data Providers)和数据消费者(Data Consumers)之间通信的通信应用程序编程接口 (API) 和通信语义。

      要了解DDS,你不能忽略它的模型:DCPS(数据中心的出版订阅模型)。

      DCPS有三个关键实体:

      1. publication entities: 定义消息生成对象及相关属性
      2. subscription entities:定义消息消费对象及相关属性
      3. configuration entities:定义传输相关的属性如 Topic 类型,通信的 QoS(服务质量)。

      QoS 是一个非常重要的概念,DDS 使用 QoS 来定义 DDS 实体的行为特征。 QoS 由单独的 QoS 策略(源自 QoSPolicy 的类型的对象)组成。

      2.什么是快速DDS

      DDS是一个标准集, 它有许多实现, 商业和开放源代码.

      商业:RTI
      开源: Cyclone DDS、Fast-DDS

      因此,快速DDS是一个开放源代码的DDS标准实现,由ePromise发布和维护。

      3.什么是DCPS

      请参阅 Fast DDS的官方文件中的图片。

      在这里插入图片描述

      DDS是一个数据中心的通信模型,那么这个数据中心是什么?

      我个人的理解是,主题所代表的消息对象是DDS的数据中心。

      通过 Topic 的纽带关系,可以将数据生成为数据消费对象连接起来,并且可以通过 QoS 执行通信服务质量策略。

      DCPS模型有四个基本概念:

      1. Publisher:它是负责创建和配置其实现的 DataWriters 的 DCPS 实体。DataWriter是负责实际发布消息的实体。每个 DataWriter 都有一个分配的 Topic,在这个主题下发布消息。
      2. Subscriber:它负责接收在其订阅的 Topic下发布的数据。它为一个或多个 DataReader 对象提供服务,这些对象负责将新数据的可用性传达给应用程序。
      3. Topic(话题):它是绑定发布和订阅的实体。它在 DDS 域中是唯一的。通过TopicDescription,它允许发布和订阅数据类型的统一。
      4. 域名:这个概念用于连接所有出版商和订阅者,属于一个或多个应用程序,它们在不同的主题下交换数据。这些参与的域名的单个应用称为 DomainParticipant。DDS域由域ID识别。DomainParticipant定义一个域名ID来指定它所属的DDS域名。具有不同 ID 的两个 DomainParticipants 不知道彼此在网络中的存在。因此,可以创建多个通信渠道。这 适用于 涉及 多个 DDS 应用 的 场景,它们各自的 DomainParticipants 相互通信,但不能干预这些应用。DomainParticipant为其他DCPS实体提供容器,作为出版商、订阅商和专题实体的工厂,并在该地区提供管理服务。

      DDS是一种通过,DCPS是一个抽象模型的概念。具体代码维度的实际投影,则需要 DomainParticipants 作为容器去承载 Publisher、Subsriber、Topic 等等。

      可以这样理解:

      1. 域名是一个项目组
      2. 项目生产过程包括各种相关产出,如要求文档、概览设计、产品程序、测试例等。
      3. DomainParticipant代表项目中的不同参与组织,例如UI团队、产品团队、开发团队、测试团队等。
      4. Publisher 和 Subscriber 代表不同小组中对外输出文档和接受信息的窗口角色
      5. 当不同文件在不同组中流通时,QoS代表文件传输状态的质量要求

      在这里插入图片描述

      最后,如何理解 QoS?

      你可以联想到,假如你是写代码的,产品经理传递文件给你时的方法和需要你反馈的时效,以及测试人员传递文档给你要求的时效是不一样的。

      当然,这只是比较,为了帮助人们理解它,真正的DDS不需要这样。

      什么是RTPS

      RTPS 是 Real-Time Publish Subscribe 的缩写,它是 DDS 的通信中间件,是发布-订阅模式,通信能力强大,支持 UDP/IP、TCP 及共享内存。

      RTPS是DSS通信的基础,它包含相同的重要概念:

      • Domain
      • RTPSParticipant
      • Topic
      • Attributes
      • Change
      • History
      • RTPSWriter
      • RTPSReader

      RTPS 中定义了一个 Domain 的概念,它定义了一个单独的通信平面。几个域可以同时独立地共存。一个域包含任意数量的 RTPSParticipant,即能够发送和接收数据的元素。

      RTPSParticipants 使用 EndPoint 进行通信:

      • RTPSWriter:可以发送数据的终点点。
      • RTPSReader:可以接收数据的EndPoint端口。

      RTPSParticipant 可以有任意数量的写入器和读取器端点。

      在这里插入图片描述

      主题定义和标记正在交换的数据。主题不属于特定 DomainParticipant。DomainParticipant 通过 RTPSWriters 对 Topic 发布的数据进行更改,它还通过RTPSReaders接收与其订阅主题有关的数据。

      快速DDS的最基本的通信单元叫做“变换”,它显示在主题下写的数据的更新. RTPSReaders/RTPSWriters 在其 History 中注册这些 Change,历史是一个用于最近更改缓存的数据结构。

      在eProsima Fast DDS的默认配置中,在通过RTPSWriter终端发布更改时,执行下列步骤:

      1. 更改将添加到RTPSWriter's History。

      2. RTPSWriter将更改发送给它知道的任何RTPSReaders。

      3. 接收到数据后,RTPSReaders 用新的 Change 更新他们的 History。

      快速DDS支持多个配置,允许改变RTPSWriters/RTPSReaders的行为。修改RTPS实体的默认配置意味着RTPSWriters和RTPSReaders之间的数据交换流会发生变化。此外,通过选择服务质量(QoS)战略,你可以以多种方式影响这些历史缓存的管理方式,但通讯周期仍保持不变。

      5.快速DDS和RTPS关系?

      如上所述,RTPS是DDS的基础,事实上,完整的快速DDS架构分为四个层:

      • Application Layer
      • FAST DDS Layer
      • RTPS Layer
      • Tranport Layer

      在这里插入图片描述

      Application 指的是采用 Fast DDS API 的各类应用。

      DDS Layer 主要定义一个系统中不同的 Domain,在同一个 Domain 下 Topic 按规则通信。

      Fast RTPS 是通信协调层,是下层 Transport 的抽象。

      传输层处理底层UDP、TCP和SSHM(共享内存)。

      6.一个简单的快速DDS例子

      要使用快速DDS,您首先需要安装它,有 bin、Source、docker image 3 种方式,但 bin 和 docker image 需要到官网预留个人信息才能下载,所以,我们可以考虑下载源代码.

      下载3个源代码:

      • vendor
      • fast cdr
      • fast dds

      我选择在ubuntu下在cmake模式中编译.

      你可以参考这个地址:DDS安装

      当然,还要下载编译 Fast DDS Gen,它是一个工具,能够将 IDL 文件转换成 C++ 代码。

      现在考虑写一个最基本的DDS应用程序。

      我们首先需要知道最小的DSD应该包含什么.

      • 消息.IDL
      • 相应的数据发布者.cpp
      • 相应的数据接收器.cpp
      • CMakeLists.txt

      消息数据由IDL文件定义。

      IDL函数非常强大,定义基本数据类型、阵列、窗口、地图、列举、注释等。

      Fastddsgen可以将其转换为c++数据结构。

      在这里插入图片描述

      Fastddsgen可以转换为C++类。
      在这里插入图片描述

      现在我们可以写一个简单的IDL

      在这里插入图片描述

      然后你可以通过 fastddsgen快速生成代码。

      在这里插入图片描述

      最终, 几个代码文件将自动生成.

      在这里插入图片描述

      FrankTestDDS.idl 被转换成 FrankTestDDS.cxx 和它应对的 .h 文件。

      其他FrankTestDDSPubSubMain类由 fastddsgen自动生成,以实现发布和订阅示范代码。

      让我们先看看CMakeLists.txt。

      在这里插入图片描述

      我们可以发现,整个工程依赖于 fastcdr 和 fastrtps 两个库,之后,代表消息数据经 idl 转换后的 FrankTestDDS.cxx 被编译成库的形式。

      因此,逆编译的FrankTestDDS可执行文件可以链接到消息库,确保应用程序代码和消息的分离。
      现在我要试验 FastDDS 的发布-订阅功能。我在生成的 FrankTestDDSPublisher.cxx 中添加了一些代码。

      在这里插入图片描述

      这是我们的消息体,我把 msg 分配给它。

      同时我必须修改FrankTestSubscriber.cxx代码。

      在这里插入图片描述

      现在我们可以编译代码并尝试运行它。

      然后,分别在两个终端中运行 publisher 和 subscriber

      在这里插入图片描述

      我们可以看到通讯正常,这意味着我们可以通过快速的Dds开始工作。

      至于高阶内容,需要结合业务实际需求了,比如大量传输摄像头图片、点云数据、控制命令等等。我们得处理好相应的数据结构转换和 QOS 定义。这个在本文中就不展开了。

      参考

      1. https://www.dds-foundation.org/what-is-dds-3/
      2. https://fast-dds.docs.eprosima.com/en/latest/fastdds/getting_started/definitions.html
      3. https://www.omg.org/spec/IDL/4.2/PDF

      先自我介绍一下,他高中毕业了13年,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。了解大多数年轻的Java工程师,想要升技能,经常需要找到自己的成长或向班上汇报。但对于培训机构来说,学费大约是人民币,着实压力不小。当你不在系统时,自我学习的效率很低,而且很持久。也很容易停止天花板技术。所以我为你收集了一个"java开发工具"初衷也很简单,这是一个想帮助自己学习的朋友,却不知道该从哪里学习。同时减少每个人的负担.添加下方名片,你可以得到完整的学习信息

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/30874.html

          热门文章

          文章分类