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

 

posted @ 2023-02-27 20:43  lung2022  阅读(2090)  评论(0编辑  收藏  举报