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

DDS(Data Distribution Service)
什么是DDS
数据分发服务(DDS)是一种中间件协议和API标准,用于数据密集型实时系统的数据交换。DDS是由Object Management Group (OMG)定义的标准,主要用于系统间的实时、可靠的消息传输。其设计目标是提供高性能的数据交互,同时保持强大的数据传输质量选项和服务。在许多工业和技术环境中,如航空航天、国防、交通管理和汽车工业,DDS都有广泛应用。
DDS是以数据为中心的,采用了订阅发布模型,以中间件的形式提供通信服务,并提供多种QoS策略,保障数据进行实时、高效、灵活的分发。
通讯基于已经命名的数据流,数据流从发布者想订阅者传输已知类型的数据。

DDS在汽车行业的应用
DDS在汽车行业中的自动驾驶应用有着重要的作用。DDS能够实现实时和可靠的数据交换,满足了自动驾驶系统中海量数据的传输和处理需求。以下是DDS在汽车行业中的一些应用场景:
- 传感器数据交换:自动驾驶车辆依赖于诸如雷达、摄像头、激光雷达等各种传感器来感知周围环境。DDS可以用于传感器数据的高效传输和共享,确保各个部分的数据同步,以支持自动驾驶决策和操作。
- 分布式计算:自动驾驶系统通常由多个计算节点组成,每个节点负责不同的任务,如感知、决策和控制。DDS提供了一种可靠的机制来在不同节点之间进行数据交换,以便实现分布式的感知和协作。
- 控制指令传输:自动驾驶车辆需要通过执行控制指令来实现特定的动作和操作。DDS可以用于将控制指令从控制节点发送到执行节点,以实现高效的控制和操作。
- 车辆状态监控:通过DDS,各个部件和子系统可以共享车辆状态信息,如速度、加速度、定位等。这些信息可以用于监控车辆的实时状态,并作为决策和规划的基础。
总的来说,DDS在汽车行业的自动驾驶领域中扮演着关键的角色,它提供了一个高效、实时和可靠的数据交换机制,以支持自动驾驶系统中的数据交互和协调。通过DDS,不同的模块和子系统可以实现高效的通信,从而形成一个协同工作的整体,为自动驾驶车辆的开发和部署提供了技术支持。

DCPS
基础概念
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++
执行结果如下:

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

生成的文件
SimpleDDSImageMsg.hpp
首先定义了一个在DDS中表示和传输图像信息的消息类SimpleDDSImageMsg,提供了获取和修改成员变量的方法,并重载运算符,可以来比较两个图像是否相等
另外还定义了几个模板函数write,read,move等
SimpleDDSImageMsg.cpp
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。

需要注意的是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)
运行
以混合模式运行

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

sub模式
sub在等待pub

pub模式


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



