FastDDS使用、原理和避坑
背景:
因ROS2引入了DDS,使其实时性能够更高并且可以通信模块解耦,本文以ROS2引入的FASTDDS为蓝本,讲述如何使用,以及原理和避坑
1、DDS
dds协议是以数据为中心的订阅-发布者模式的分布式节点的
dds 的模型.分为两层:
DCPS: 数据为中心的发布订阅层 Data-Centric Publish-Subscribe
数据分布的基础架构提供:
发布-订阅者模式 建立全局数据,将P/S 的数据类型经过中间件处理数据
DCPS 分为PIM (Platform Independent Model)和 PSM (Platform Special Model)的模型
DCPS资源可用都可以转化为 qos
可以使用三种进程间通信机制 TCP UDP SHM
DLRL:本地重构层 Data Local Reconstruction Layer
通过简化编程,服务整合到应用层,用户能够访问修改的数据,达到本地语言无缝连接的目的
具体实现是通过建立对DCPS的索引表
一般不使用,作为可选项
2、DCPS 模型
主要包含四部分
domain 域代表通信范围,只有同一个领域的发布者和订阅者才能交互
publisher
topic
subscriber
3、FastDDS
3.1 IDL
以一个helloworld 为例,编写一个idl
struct HelloWorld { unsigned long index; string message; };
使用fastddsgen 生成c 文件
指令为
fastddsgen -example CMake hello.idl
生成四个文件
HelloWorld.h
HelloWorld.cxx
HelloWorldPubSubTypes.h
HelloWorldPubSubTypes.cxx
IDL 和MSG 的区别:
原始文件:
msg 更加简洁,定义类型名称
idl 复杂一点 需要module和struct
编译生成的有点区别:
都是用name作为h 文件的名称,
msg使用的是struct 定义数据类型
idl 使用的是namespace+class ,将变量定义为m 和私有,生成set 和get 函数
4、避坑
多机通信问题:
解决办法:
domain:不同的域处理不同的消息,bug只有200个可以使用
initialPeersList 来设置本机模式
参考:
https://www.omg.org/spec/DDS-DLRL/1.4/PDF
https://fast-dds.docs.eprosima.com/en/latest/fastdds/getting_started/definitions.html
https://fast-dds.docs.eprosima.com/en/latest/
https://blog.csdn.net/JL_Gao/article/details/84029530