专栏算法工具链DDS简介

DDS简介

TROS.Assist2024-03-06
126
0

COM模块和DDS

Communication模块

简介

Communication作为通信总线,为应用屏蔽底层通信链路细节,提供统一的通信接口。支持多种通信模式、多个平台,使应用开发者能够快速搭建应用和解决方案。

Description
communication 本身具有可扩展性,可以集成不同的通信协议,目前支持如下通信协议:zmq tcpzmq ipczmq epgmintrabif-sdioshared memoryPCIeFast-DDShybridcomposite。这里简单讲一下DDS

DDS(Data Distribution Service)

什么是DDS

数据分发服务(DDS)是一种中间件协议和API标准,用于数据密集型实时系统的数据交换。DDS是由Object Management Group (OMG)定义的标准,主要用于系统间的实时、可靠的消息传输。其设计目标是提供高性能的数据交互,同时保持强大的数据传输质量选项和服务。在许多工业和技术环境中,如航空航天、国防、交通管理和汽车工业,DDS都有广泛应用。

DDS是以数据为中心的,采用了订阅发布模型,以中间件的形式提供通信服务,并提供多种QoS策略,保障数据进行实时、高效、灵活的分发。

通讯基于已经命名的数据流,数据流从发布者想订阅者传输已知类型的数据。

Description

DDS在汽车行业的应用

DDS在汽车行业中的自动驾驶应用有着重要的作用。DDS能够实现实时和可靠的数据交换,满足了自动驾驶系统中海量数据的传输和处理需求。以下是DDS在汽车行业中的一些应用场景:

  1. 传感器数据交换:自动驾驶车辆依赖于诸如雷达、摄像头、激光雷达等各种传感器来感知周围环境。DDS可以用于传感器数据的高效传输和共享,确保各个部分的数据同步,以支持自动驾驶决策和操作。
  2. 分布式计算:自动驾驶系统通常由多个计算节点组成,每个节点负责不同的任务,如感知、决策和控制。DDS提供了一种可靠的机制来在不同节点之间进行数据交换,以便实现分布式的感知和协作。
  3. 控制指令传输:自动驾驶车辆需要通过执行控制指令来实现特定的动作和操作。DDS可以用于将控制指令从控制节点发送到执行节点,以实现高效的控制和操作。
  4. 车辆状态监控:通过DDS,各个部件和子系统可以共享车辆状态信息,如速度、加速度、定位等。这些信息可以用于监控车辆的实时状态,并作为决策和规划的基础。

总的来说,DDS在汽车行业的自动驾驶领域中扮演着关键的角色,它提供了一个高效、实时和可靠的数据交换机制,以支持自动驾驶系统中的数据交互和协调。通过DDS,不同的模块和子系统可以实现高效的通信,从而形成一个协同工作的整体,为自动驾驶车辆的开发和部署提供了技术支持。

Description

DCPS

DCPS是DDS的核心编程模型,它是一种“数据为中心”的发布-订阅(Publish-Subscribe)模式。在DCPS模型中,数据被视为独立于应用程序进程的存在,并围绕数据进行通信和管理,而不是传统的基于端点的通信方式。
基础概念
Domain:代表一个通信平面,由Domain ID唯一标识,只有在同一个域内的通信实体才可以通信;如果考虑车内通信,可以只划分1个Domain,也可以按照交互规则或其他规则,定义多个Domain;域是DDS的基本组织单位,分隔了一个DDS网络中的不同数据空间。每个域内的参与者可以互相发现并通信,而不同域的参与者则彼此隔离,类似于局域网内的通信。
Domain Participant:域参与者是代表应用程序与DDS域通信的实体。它创建发布者(Publisher)和订阅者(Subscriber)以交换数据,并负责与其他域参与者建立通信和协调。代表域内通信的应用程序的本地成员身份,简单来说,就是说明同一数据域内的通信成员;
Topic:Topic是DDS中发布和订阅数据的逻辑通道。它描述了数据的类型(如结构),以及如何识别不同的数据项。应用程序可以发布某个主题的数据或订阅感兴趣的特定主题数据。是数据的抽象概念,由TopicName标识,关联相应数据的数据类型(DataType),如果把车内所涉及的所有Topic集合在一起,这样就形成一个虚拟的全局数据空间“Global Data Space”,进一步弱化了节点的概念,所以域参与者已经不是节点的概念了;
Publisher:发布者,发布主题数据,至少与1个DataWriter关联,通过调用DataWriter的相关函数将数据发出去;发布者由DomainParticipant创建,用于制定如何向特定主题发布数据。发布者持有一个或多个DataWriter对象,这些对象用来发送数据到指定主题。
Subscriber:订阅者,订阅主题数据,至少与1个DataReader关联。当数据到达时,应用程序可能忙于执行其他操作或应用程序只是等待该消息时,这样就会存在两种情况,同步访问和异步通知。订阅者也是由DomainParticipant创建,用于接收来自特定主题的数据。订阅者包含一个或多个DataReader对象,这些对象用于从主题中读取数据。
DataWriter:数据写入者,类似缓存,把需要发布的主题数据从应用层写入到DataWriter中;DataWriter与一个特定的主题关联,它是发布者用来发布该主题数据的接口。
DataReader:数据读取者,同样可以理解为一种缓存,从订阅者得到主题数据,随之传给应用层;DataReader也与一个特定的主题关联,它是订阅者用来读取该主题数据的接口。
Quality of Service (QoS):QoS是DDS中一个重要的概念,用来指定和控制数据通信的行为,包括数据可靠性、传输速度、持久性、资源限制等。

DDS是一个以数据为中心的中间件协议和API标准,意为用户只关心自己想要的数据,数据通过Topic进行标识,这样发布者根据主题发布数据,订阅者根据自己感兴趣的主题订阅数据。这便是DDS的核心,以数据为中心的发布-订阅模型DCPS(Data-Centric Publish-Subscribe)

IDL(Interface Definition Language)

IDL 是一种语言,主要以结构体的形式定义一串数据类型,用于定义与平台和语言无关的数据类型和接口,是一种描述接口的语言,它使得从一个编程语言中定义的数据类型能够以标准的方式被其他编程语言理解,从而支持跨平台和跨语言编程。

IDL在DDS中的作用是定义数据模型,即数据的结构和类型。这些数据模型被称为主题(Topic),发布者(Publisher)根据这些主题发布消息,而订阅者(Subscriber)订阅这些主题以接收相应的消息。

idlc(IDL编译器)会将其转换为不同语言:

示例

以TROS中COM模块自带的Cyclonedds的example为例

代码

首先是IDL文件

使用idlc生成对应的文件,这里使用c++

执行结果如下:

Description
在TROS的COM模块example中已经包含了生成的文件,这一步可以省略
Description
生成的文件

SimpleDDSImageMsg.hpp

首先定义了一个在DDS中表示和传输图像信息的消息类SimpleDDSImageMsg,提供了获取和修改成员变量的方法,并重载运算符,可以来比较两个图像是否相等

另外还定义了几个模板函数write,read,move等

SimpleDDSImageMsg.cpp

为例在首次调用时初始化 SimpleDDSImageMsg 类型的属性信息,并确保在多线程环境下的正确性和高效性。

cyclonedds_pub_sub_example.cpp

具体见注释

Cmakelist.txt

通过Cmake生成可执行文件cyclonedds_pub_sub

编译

和编译com模块一致:

communication目录下:

默认情况:communication 默认编译支持 sdio,不支持 dds。 如需要修改可以在 conan install 命令后还可以添加以下信息进行协议裁剪:

可以选的参数如下:

  • 添加-o communication:dds=True 设置为 True 时,该库支持 dds 协议。

  • 添加-o communication:build_shm=True 设置为 True 时,编译出基于 shm 的独立通信库 libshm.so。

编译后:
Description
需要注意的是com默认的是fastdds,需要调整dds_adaptor目录下面的dds.cmake,dds_adaptor_interface.h两个文件。
  • dds_adaptor_interface.h中调整#include “communication/dds_adaptor/xxxdds/dds_types_xxxdds.h”

  • dds.cmake中调整include(include/communication/dds_adaptor/xxxdds/dds.cmake)

运行

以混合模式运行
Description

上面已经知道代码中count默认是100

Description

sub模式

sub在等待pub

Description

pub模式

DescriptionDescription

sub成功接受并调用回调函数输出信息:

DescriptionDescription
算法工具链
杂谈
评论0
0/1000