FAST-DDS源码阅读笔记(二)-DDS层

news/2025/1/24 13:39:40/文章来源:https://www.cnblogs.com/collin-chen/p/18448991

eProsima Fast DDS 提供了两种不同的API,以在不同层面上与通信服务进行交互。 主要的API是数据分发服务(DDS)数据中心化发布/订阅(DCPS)平台无关模型(PIM)API,或者简称为DDS DCPS PIM,它是由DDS 1.4规范定义的,Fast DDS 遵循该规范,由Core,Domain,Publisher,Subscriber,Topic五个核心概念构成

Core

Core中定义了其他模块使用的基础类和类型,包括Entity类,Qos策略,与Status

Entity

所有DDS实体的抽象基类,实体的层次结构如下
alt text

通用Entity特性

下面的特征是所有的Entity都所有的

特征 描述
Entity Identifier ID标识,get_instance_handle()获取
Qos Policy 服务质量策略
Listener 包含Entity在响应事件时调用的函数,充当异步通知系统
Status 代表着Entity的通信状态
Status Condition Entity与等待集之间的桥梁

Listener继承关系

img

Policy

Qos指定服务的行为,使得用户能定义Entity的行为。Qos被分解成多个独立的Qos策略增加系统的灵活性。多个策略冲突时,可以通过函数返回的ReturnCodes通知用户。

每个Qos Policy都有一个唯一的ID(QosPolicyId_t类型),标识具体的Qos Policy。每个DDS Entity都有一套特定的Qos策略,主要是标准Qos,XTypes与Eprosima三种策略。

Policy和匹配规则详见参考资料

Status

每个Entity与一组Status相关联,Status值代表着Entity的通信状态,变化由Entity相关的通信事件引起(比如新数据到达,发现新的Paticipant与EndPoint下线)。Status分解成不同的Status对象,并且与通信的不同方面有关,维持了Status之间的独立性。
SatusD的变化触发Listener的相应事件回调,对于给定的Status对象,Listener定义了一个接口(example:fooStatus的状态对象与on_foo数据回调)Status会在相应的回调触发之后被重置。
条件和等待集为应用层提供了另一种机制,使得可以等待多个Entity的变化。并且能够在外部线程中处理回调。

Conditions与Wait-Sets

Conditions与Wait-sets一起使用,给应用层提供了接收通信状态变化的能力,具体的方式如下

graph TD;A[Start] --> B[wait];B --> C[Get Satus Change];C --> D{Use done?};D -- Yes --> E[detach_condition];E --> F[End];D -- No --> B;

GuardCondition

通过调用set_trigger_value()触发条件

StatusCondition

通信状态发生变化即触发

ReadCondition

存在一个Sample与ReadCondition匹配时触发

Domain

Domain是一个独立的通信平面,在共享同一基础设施的实体间创建逻辑分离,每个Domain都有一个DomainID,应用层如果需要添加到域中,需要创建一个感兴趣的DomainDomainParticipant实例,DomainParticipant由DomainParticipantFactory创建。img

DomainParticipant

应用层与Domain的入口点,创建时便与单个Domain关联并包含的Entities,并充当Puber,Suber与Topic的工厂,可以通过指定Qos来修改DomainParticipant的行为

每个DomainParticipant接受一个DomainParticipantListener并且Listener在Entity状态发生变化的时候收到通知

DomainParticipantListener

抽象基类,定义了DomainParticipant 状态发生变化时的行为,默认下情况下所有的行为都是空,用户可以继承并且实现这个类

DomainParticipantFactory

单列,主要用于创建DomainParticipant

Partitions

分区是在Domain的物理隔离之后引入的逻辑隔离概念,代表着域和主题之上的另一个隔离层,相比Domain的隔离方式,更加轻量,并且可修改可在endpoint的生命周期中动态的更改。相比于Endpoint与domain之间的一一对应关系,一个endpoint可以从属多个分区

Publisher

img

DataWriter

DataWriter从属于Publisher,绑定到单独的Topic上

DataWriterListener

抽象类,定义状态变化时应该触发的回调。
on_publication_matched() 发现DataReader 匹配Topic与Partition时触发
on_offered_deadline_missed() 在无法在超时时间内发送数据时触发
on_offered_incompatible_qos()顾名思义
on_liveliness_lost() Reader因为DataWriter不遵守DataWriterQos认为Writer掉线时触发。
on_unacknowledged_sample_removed() 未被ACK的样本被移除

Subscriber

img
Subscriber 扮演容器的角色,一个Subscriber可以包含多个DataReader,并且这些DataReader的 SubscriberQos一致

SubscriberListener

同PublisherListener

DataReader

归属于特定的Subscriber,绑定到单独的Topic上。

DataReaderListener

类似于DataWriterListener

SampleInfo

当sample被DataReader取出,SampleInfo同样返回,其中包含着例如Sample是否可用的信息。

Topic

img

Topic,Keys and instance

img

instance可以理解为Topic下面的再进行逻辑划分,根据不同的key获得不同的sample
instance的优势有不需要重新创建DataWriter,DataReader,以及与此相关的服务发现带来的开销。instance的生命周期如下
img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/823041.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CodeForces训练记录】Codeforces Global Round 27

训练情况赛后反思 guessforces?结论全靠猜?逆天C题构造+大力分类讨论,这谁想得到啊? A题 我们看 \((r,c)\) 所在的行,其右边的球左移,对答案的贡献为 \(m-c\),接下来再看下面的 \(n-r\) 行的最左边的球,每个球移动到右上角对答案的贡献为 \(m\),接下来就是剩下的球往左…

蚂蚁图团队GraphRAG支持社区摘要——Token相比微软直降50%

蚂蚁图团队在DB-GPT v0.6.0版本中改进了GraphRAG框架,引入图社区摘要和混合检索,大幅降低了图索引构建成本,相比微软方案token开销降低50%。今年5月份,我们在DB-GPT v0.5.6版本发布了蚂蚁首个开源GraphRAG框架,支持了多种知识库索引底座,并在文章《Vector | Graph:蚂蚁首…

通过终端控制屏幕亮度

Ubuntu通过终端控制音量和屏幕亮度 安装DWM界面后,无法通过快捷键和任务栏来控制音量、屏幕亮度以及wifi连接,因此,我们可以通过终端来完成这些任务。 连接Wifi netui会图形化wifi界面,连接后输入密码即可 调整音量 控制亮度 转载自:https://cn.linux-console.net/?p=296…

第六章课后习题6.1、6.3、6.4、6.5和6.7

习题6.1 a图点击查看代码 import networkx as nx import matplotlib.pyplot as plt G = nx.Graph() nodes = [v1, v2, v3, v4, v5, v6] G.add_nodes_from(nodes) edges = [ (v1, v2), (v1, v3), (v1, v4), (v2, v3), (v2, v6), (v3, v4), (v4, v5), (v5, v6) ] …

使用element ui 组件的时候,如果使用两个或多个按钮在同一个单元格内,按钮会竖着排列,但是不能够对齐怎么解决?

打开浏览器的开发者模式(f12打开) 我们发现这个按钮有一个自带的左边距10px<el-table-column width="100" label="操作"> <template #default="scope"> <el-button type="primary" plain style="width: 50…

USB设备远程唤醒RemoteWakeUp

USB设备的Remote Wakeup是可选的,其功能用于远程唤醒待机状态下的主机。USB设备通过配置描述符bmAttributes字段的D5标识其是否支持远程唤醒。支持远程唤醒的USB设备必须支持USB的标准请求CLEAR_FEATURE和SET_FEATURE。USB主机通过SET_FEATURE(DEVICE_REMOTE_WAKEUP)请求使用…

第五章课后习题5.4、5.5和5.7

习题5.4点击查看代码 import numpy as np import math from scipy.optimize import minimize,Bounds def func(x):return sum(math.sqrt(x[i]) for i in range(100)) def con(x):return 1000-np.sum(x[i]*(101-i+1) for i in range(100)) con1={type:ineq,fun: lambda x: 10-x[…

第四章课后习题4.3和4.4

习题4.3点击查看代码 import matplotlib.pyplot as plt import numpy as np import cvxpy as cpx=cp.Variable(6,pos=True) obj=cp.Minimize(x[5]) a1=np.array([0.025, 0.015, 0.055, 0.026]) a2=np.array([0.05, 0.27, 0.19, 0.185, 0.185]) a3=np.array([1, 1.01, 1.02, 1.0…

使用Github Action 进行CI-CD

原文地址:https://www.x1uc.top/blog/github-action-use 使用Github Action 进行CI-CD我的博客建立起来还没有多久,所以时不时的会加一些功能。但是每一次加完功能之后,部署的步骤总是非常非常的麻烦。 后端步骤:maven打包->jar包放到服务器上->停止java容器-> 删…

Codeforces Round 981 (Div. 3)

Codeforces Round 981 (Div. 3) 总结 A 手推一下,发现位置变化为 \(-1,2,-3,4, \dots\),所以只需要看 \(n\) 的奇偶性即可。 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <…

第三章课后习题3.2和3.3

习题3.2点击查看代码 def X(n): # 差分方程的解 return 2 * (-1)**(n + 1) n_values = [0, 1, 2, 3, 4, 5]#根据需要自行调整 for n in n_values: print(f"X({n}) = {X(n)}") print("学号:3001")习题3.3点击查看代码 import numpy as np from …

Python pyinstaller类库使用学习总结

实践环境 python3 .9.13 pyinstaller-6.10.0-py3-none-manylinux2014_x86_64.whl CentOS 7.9 win11 实践操作 生成Linux版可执行文件 安装Python # yum install -y gcc zlib* openssl-devel libffi-devel # wget https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz #…