最后更新:2022-07-30 03:49:53 手机定位技术交流文章
从事汽车软件开发,通信中间件绕不开,目前最热门的两个是: Some/IP和DDS。DDS是分布式通信的标准.有许多商业和开放源代码的实现,快速DDS是其中之一。它用于ROS2,而 Apollo 中的 CyberRT 框架中也有它的身影。
谈论快速DDS我先谈一下DDS是什么。
DDS 是 OMG 组织发布的一种中间件协议和 API 标准,它将系统的组件集成在一起,提供业务和任务关键型物联网 (IoT) 应用程序所需的低延迟数据连接、极高的可靠性和可扩展架构。
DDS(Data Distribution Service,数据分发服务)是一种以数据为中心的通信协议,用于分布式软件应用程序通信。
它描述了支持数据提供者(Data Providers)和数据消费者(Data Consumers)之间通信的通信应用程序编程接口 (API) 和通信语义。
要了解DDS,你不能忽略它的模型:DCPS(数据中心的出版订阅模型)。
DCPS有三个关键实体:
QoS 是一个非常重要的概念,DDS 使用 QoS 来定义 DDS 实体的行为特征。 QoS 由单独的 QoS 策略(源自 QoSPolicy 的类型的对象)组成。
DDS是一个标准集, 它有许多实现, 商业和开放源代码.
商业:RTI
开源: Cyclone DDS、Fast-DDS
因此,快速DDS是一个开放源代码的DDS标准实现,由ePromise发布和维护。
请参阅 Fast DDS的官方文件中的图片。

DDS是一个数据中心的通信模型,那么这个数据中心是什么?
我个人的理解是,主题所代表的消息对象是DDS的数据中心。
通过 Topic 的纽带关系,可以将数据生成为数据消费对象连接起来,并且可以通过 QoS 执行通信服务质量策略。
DCPS模型有四个基本概念:
DDS是一种通过,DCPS是一个抽象模型的概念。具体代码维度的实际投影,则需要 DomainParticipants 作为容器去承载 Publisher、Subsriber、Topic 等等。
可以这样理解:

最后,如何理解 QoS?
你可以联想到,假如你是写代码的,产品经理传递文件给你时的方法和需要你反馈的时效,以及测试人员传递文档给你要求的时效是不一样的。
当然,这只是比较,为了帮助人们理解它,真正的DDS不需要这样。
RTPS 是 Real-Time Publish Subscribe 的缩写,它是 DDS 的通信中间件,是发布-订阅模式,通信能力强大,支持 UDP/IP、TCP 及共享内存。
RTPS是DSS通信的基础,它包含相同的重要概念:
RTPS 中定义了一个 Domain 的概念,它定义了一个单独的通信平面。几个域可以同时独立地共存。一个域包含任意数量的 RTPSParticipant,即能够发送和接收数据的元素。
RTPSParticipants 使用 EndPoint 进行通信:
RTPSParticipant 可以有任意数量的写入器和读取器端点。

主题定义和标记正在交换的数据。主题不属于特定 DomainParticipant。DomainParticipant 通过 RTPSWriters 对 Topic 发布的数据进行更改,它还通过RTPSReaders接收与其订阅主题有关的数据。
快速DDS的最基本的通信单元叫做“变换”,它显示在主题下写的数据的更新. RTPSReaders/RTPSWriters 在其 History 中注册这些 Change,历史是一个用于最近更改缓存的数据结构。
在eProsima Fast DDS的默认配置中,在通过RTPSWriter终端发布更改时,执行下列步骤:
更改将添加到RTPSWriter's History。
RTPSWriter将更改发送给它知道的任何RTPSReaders。
接收到数据后,RTPSReaders 用新的 Change 更新他们的 History。
快速DDS支持多个配置,允许改变RTPSWriters/RTPSReaders的行为。修改RTPS实体的默认配置意味着RTPSWriters和RTPSReaders之间的数据交换流会发生变化。此外,通过选择服务质量(QoS)战略,你可以以多种方式影响这些历史缓存的管理方式,但通讯周期仍保持不变。
如上所述,RTPS是DDS的基础,事实上,完整的快速DDS架构分为四个层:

Application 指的是采用 Fast DDS API 的各类应用。
DDS Layer 主要定义一个系统中不同的 Domain,在同一个 Domain 下 Topic 按规则通信。
Fast RTPS 是通信协调层,是下层 Transport 的抽象。
传输层处理底层UDP、TCP和SSHM(共享内存)。
要使用快速DDS,您首先需要安装它,有 bin、Source、docker image 3 种方式,但 bin 和 docker image 需要到官网预留个人信息才能下载,所以,我们可以考虑下载源代码.
下载3个源代码:
我选择在ubuntu下在cmake模式中编译.
你可以参考这个地址:DDS安装
当然,还要下载编译 Fast DDS Gen,它是一个工具,能够将 IDL 文件转换成 C++ 代码。
现在考虑写一个最基本的DDS应用程序。
我们首先需要知道最小的DSD应该包含什么.
消息数据由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 定义。这个在本文中就不展开了。
先自我介绍一下,他高中毕业了13年,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。了解大多数年轻的Java工程师,想要升技能,经常需要找到自己的成长或向班上汇报。但对于培训机构来说,学费大约是人民币,着实压力不小。当你不在系统时,自我学习的效率很低,而且很持久。也很容易停止天花板技术。所以我为你收集了一个"java开发工具"初衷也很简单,这是一个想帮助自己学习的朋友,却不知道该从哪里学习。同时减少每个人的负担.添加下方名片,你可以得到完整的学习信息
本文由 在线网速测试 整理编辑,转载请注明出处。