FastDDS-3. DDS层

news2024/9/29 15:27:55


3. DDS层

eProsima Fast DDS公开了两个不同的API,以在不同级别与通信服务交互。主要API是数据分发服务(DDS)数据中心发布订阅(DCPS)平台独立模型(PIM)API,简称DDS DCPS PIM,由Fast DDS遵循的数据分发服务1.4版规范定义。本节旨在解释Fast DDS下此API的主要特性和使用模式,并对其分为五个模块进行深入解释:

  • Core: 它定义了由其他模块细化的抽象类和接口。它还提供了服务质量(QoS)定义,以及支持中间件的基于通知的交互。
  • Domain: 它包含充当服务入口点的DomainParticipant类,以及许多类的工厂。DomainParticipant还充当构成服务的其他对象的容器。
  • Publisher: 它描述了发布端使用的类,包括Publisher和DataWriter类,以及PublisherListener和DataWriterListener接口。
    -Subscriber: 它描述了订阅端使用的类,包括Subscriber和DataReader类,以及SubscriberListener和DataReaderListener接口。
  • Topic: 它描述了用于定义通信主题和数据类型的类,包括Topic和TopicDescription类,以及TypeSupport和TopicListener接口。


3.1 Core

此模块定义其他模块将使用的基础结构类和类型。它包含实体类、QoS策略和状态的定义。

  • Entity: 实体是具有状态的DDS通信对象,可以使用策略进行配置。
  • Policy: 控制实体行为的每个配置对象。
  • Status: 与实体关联的每个对象,其值表示该实体的通信状态。


3.1.1 Entity

实体是所有DDS实体的抽象基类,意味着支持QoS策略、侦听器和状态的对象。



3.1.1.1 Entity的类型

  • DomainParticipant: 此实体是服务的入口点,充当发布服务器、订阅服务器和主题的工厂。有关详细信息,请参阅DomainParticipant。
  • Publisher: 它充当一个工厂,可以创建任意数量的DataWriter。有关详细信息,请参阅Publisher。
  • Subscriber: 它充当一个工厂,可以创建任意数量的DataReader。有关详细信息,请参阅订阅服务器。
  • Topic: 此实体位于发布实体和订阅实体之间,充当通道。有关详细信息,请参阅主题。
  • DataWriter: 是负责数据分发的对象。有关详细信息,请参阅DataWriter。
  • DataReader: 用于访问接收数据的对象。有关详细信息,请参阅DataReader。

下图显示了所有DDS实体之间的层次结构:



3.1.1.2 通用实体特征

所有实体类型都具有实体概念所共有的一些特征。这些是:

3.1.1.2.1 Entity标识符

每个实体都由一个唯一的ID标识,该ID在DDS实体与其对应的RTPS实体(如果存在)之间共享。该ID存储在Entity基类上声明的Instance Handle对象上,可以使用getter函数get_Instance_Handle()访问该对象。

3.1.1.2.1 QoS策略

可以使用一组配置策略来配置每个实体的行为。对于每个实体类型,都有一个对应的服务质量(QoS)类,该类对影响所述实体类型的所有策略进行分组。用户可以创建这些QoS类的实例,根据自己的需要修改包含的策略,并在创建过程中或稍后使用每个实体公开的set_QoS()函数来配置实体(DomainParticipant::set_qos(),Publisher::set_qos(),Subscriber::set.qos(),Topic::set.qos(),DataWriter::set_qos(),DataReader::set.qos())。有关可用策略及其说明的列表,请参阅策略。QoS类及其包含的策略在每个实体类型的文档中进行了解释。

3.1.1.2.3 Listener监听器

侦听器包含一些函数,实体使用这些函数来响应事件。因此,侦听器充当异步通知系统,允许实体向应用程序通知实体中的状态更改。因此,侦听器就像一个异步通知系统,允许实体向应用程序通知实体中的状态更改。

所有实体类型都定义一个抽象侦听器接口,该接口包含实体将触发的回调函数,以将状态更改传递给应用程序。用户可以实现自己的侦听器,从这些接口继承并实现应用程序所需的回调。然后,他们可以在创建过程中或稍后使用每个实体公开的set_listener()函数将这些侦听器链接到每个实体(DomainParticipant::set_listenr(),Publisher::set_litener(),Subscriber::set-listener((),Topic::set-liistener()),DataWriter::set _listener。每个实体类型的侦听器接口及其回调在每个实体类型文档中进行了解释。当事件发生时,它由具有非空侦听器的最低级别实体处理,并且在其StatusTask中启用了相应的回调。高级侦听器继承自低级侦听器,如下图所示:


注意:
on_data_on_readers()回调在on_data_available()之前拦截消息。这意味着如果启用了DomainParticipantListener,用户应该考虑默认情况下侦听器使用StatusMask::all()。由于保留了回调实体层次结构,在这种情况下将调用on_data_on_readers()。如果应用程序希望改用on_data_available(),则应禁用Statusask的相应位。


重要:
在创建实体时使用StatusMask::none()仅禁用DDS标准回调:

  • on_sample_rejected()
  • on_liveliness_changed()
  • on_requested_deadline_missed()
  • on_requested_incompatible_qos()
  • on_data_available()
  • on_subscription_matched()
  • on_sample_lost()
  • on_offered_incompatible_qos()
  • on_offered_deadline_missed()
  • on_liveliness_lost()
  • on_publication_matched()
  • on_inconsistent_topic()
  • on_data_on_readers()

始终启用特定于Fast DDS的任何回调:

  • on_participant_discovery()
  • on_ParticipantAuthentication()
  • on_subscriber_discovery()
  • on_publisher_discovery()
  • on_type_discovery()
  • on_type_dependencies_reply()
  • on_type_information_received()
  • on_unacknowledged_sample_removed()

警告: 只创建一个线程来侦听每个实现的侦听器,因此建议保持侦听器函数的简单性,将此类信息的处理留给适当的类。

警告:
不要在侦听器成员函数的范围内创建或删除任何实体,因为这可能会导致未定义的行为。相反,建议使用Listener类作为信息通道,并使用上层Entity类来封装此类行为。



3.1.1.2.4 Status

每个实体都与一组状态对象相关联,这些状态对象的值表示该实体的通信状态。这些状态值的更改会触发调用相应的Listener回调以异步通知应用程序。有关所有状态对象的列表及其内容的描述,请参见状态。在那里,您还可以找到哪个状态适用于哪个实体类型。



3.1.1.2.5 StatusCondition

每个实体都有一个StatusCondition,每当其启用状态更改时,都会通知它。StatusCondition提供实体和等待集之间的链接。有关详细信息,请参阅“条件和等待集”一节。



3.1.1.2.6 启用实体

所有实体都可以创建为已启用或未启用。默认情况下,工厂被配置为创建已启用的实体,但可以对已启用的工厂使用EntityFactoryQosPolicy进行更改。禁用的工厂创建禁用的实体,而不管其QoS如何。禁用实体的操作仅限于以下操作:

  • Set/Get 实体的QoS策略
  • Set/Get 实体监听器
  • Create/Delete 子实体
  • 得到实体的状态,即使他们没有改变
  • 查找操作

在这种状态下调用的其他函数都会返回NOT_ENABLED.




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nacos集群模式+keepalived搭建高可用服务

实际工作中如果nacos这样的核心服务停掉了或者整个服务器宕机了,那整个系统也就gg了,所以像这样的核心服务我们必须要搞个3个或者3个以上的nacos集群部署,实现高可用; 部署高可用版本之前,首先你要会部署单机版的naco…

[2]MyBatis+Spring+SpringMVC+SSM整合一套通关

二、Spring 1、Spring简介 1.1、Spring概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

激活函数入门学习

本篇文章从外行工科的角度尽量详细剖析激活函数,希望不吝指教! 学习过程如下,先知道这个东西是什么,有什么用处,以及怎么使用它: 1. 为什么使用激活函数 2. 激活函数总类及优缺点 3. 如何选择激活函数 …

一篇了解模块打包工具之 ——webpack(1)

本篇采用问题引导的方式来学习webpack,借此梳理一下自己对webpack的理解,将所有的知识点连成一条线,形成对webpack的记忆导图。 最终目标,手动构建一个vue项目,目录结构参考vue-cli创建出来的项目 一、问问题 1. 第…

Echarts 仪表盘倾斜一定角度显示,非中间对称

第024个点击查看专栏目录大多数的情况下,制作的仪表盘都是中规中矩,横向中间对称,但是生活中的汽车,摩托车等仪表盘确是要倾斜一定角度的,Echarts中我们就模拟一个带有倾斜角度的仪表盘。核心代码见示例源代码 文章目录…

搞明白redis的这些问题,你就是redis高手

什么是redis? Redis 本质上是一个 Key-Value 类型的内存数据库, 整个数据库加载在内存当中进行操作, 定期通过异步操作把数据库数据 flush 到硬盘上进行保存。 因为是纯内存操作, Redis 的性能非常出色, 每秒可以处理超过 10 万…

JS 快速创建二维数组 fill方法的坑点

JS 快速创建二维数组 坑 在算法中,创建二维数组遇到的一个坑 const arr new Array(5).fill(new Array(2).fill(1))我们如果想要修改其中一个元素的值 arr[0][1] 5我们可以发现所有数组中的第二个元素都发生了改变 查看MDN,我们会发现,当…

2023前端二面经典手写面试题

实现一个call call做了什么: 将函数设为对象的属性执行&删除这个函数指定this到函数并传入给定参数执行函数如果不传入参数,默认指向为 window // 模拟 call bar.mycall(null); //实现一个call方法: Function.prototype.myCall function(context…

一篇搞懂springboot多数据源

好文推荐 https://zhuanlan.zhihu.com/p/563949762 mybatis 配置多数据源 参考文章 https://blog.csdn.net/qq_38353700/article/details/118583828 使用mybatis配置多数据源我接触过的有两种方式,一种是通过java config的方式手动配置两个数据源,…

01、SVN 概述

SVN 概述1 概述2 功能3 工作原理4 基本操作1 概述 Apache下的一个开源的项目Subversion,通常缩写为 SVN,是一个版本控制系统版本控制系统是一个软件,它可以伴随我们软件开发人员一起工作,让编写代码的完整的历史保存下来目前它的…

数仓基础与hive入门

目录1、数仓数据仓库主流开发语言--SQL2、Apache Hive入门2.1 hive定义2.2 为什么使用Hive2.3 Hive和Hadoop关系2.4 场景设计:如何模拟实现Hive功能2.5 Apache Hive架构、组件3、Apache Hive安装部署3.1 metastore配置方式4、Hive SQL语言:DDL建库、建表…

内存保护_2:RTA-OS内存保护逻辑及配置说明

上一篇 | 返回主目录 | 下一篇 内存保护_2:RTA-OS内存保护逻辑及配置说明3 OS配置说明3.1 OS一些基本概念及相互关系3.1.1 基本概念3.1.2 相互关系3.2 内存保护基本逻辑(RTA-OS)3.2.1 应用集的基本分类3.2.2 内存保护与应用集的关系3.3 OS等级…

七大排序(Java)

目录 一、插入排序 1. 直接插入排序 2. 希尔排序 二、选择排序 1. 直接选择排序 2. 堆排序 三、交换排序 1. 冒泡排序 2. 快速排序 四、归并排序 五、总结 一、插入排序 1. 直接插入排序 抓一张牌,在有序的牌中,找到合适的位置并且插入。 时间…

三战阿里测试岗,成功上岸,面试才是测试员涨薪真正的拦路虎...

第一次面试阿里记得是挂在技术面上,当时也是技术不扎实,准备的不充分,面试官出的面试题确实把我问的一头雾水,还没结束我就已经知道我挂了这次面试。 第二次面试,我准备的特别充分,提前刷了半个月的面试题…

防止jar被反编译 不安装jdk运行jar

防止jar被反编译1.pom.xml<repositories><repository><id>jitpack</id><url>https://jitpack.io</url></repository> </repositories><dependencies><dependency><groupId>org.openjfx</groupId><…

RabbitMQ死信队列

目录 一、概念 二、出现死信的原因 三、实战 &#xff08;一&#xff09;代码架构图 &#xff08;二&#xff09;消息被拒 &#xff08;三&#xff09;消息TTL过期 &#xff08;四&#xff09;队列达到最大长度 一、概念 先从概念解释上搞清楚这个定义&#xff0c;死信&…

Spark 3.3.x 读取 HBase 2.x 异常(无法正常连接或读取数据)

无法连接 1. 先检查集群中的 HBase 服务、ZooKeeper 服务是否正常启动&#xff0c;有没有挂掉。 2. Spark 中的 HBase 版本是否与集群一致&#xff0c;代码中的相关包是否导入正确。 3. 连接参数&#xff08;地址、端口&#xff09;是否设置正确&#xff0c;如下所示&#x…

pyqt 制作exe步骤

之前的博客记录 使用pycharmpyqt 编写一个桌面端&#xff08;mac&#xff09;_python开发桌面工具mac_Y_Hungry的博客-CSDN博客 python开发exe程序界面及打包环境配置_Y_Hungry的博客-CSDN博客 1.编写代码 2.打包 pyinstaller -w --add-data "logo.ico;." --add…

Redis常见的数据类型命令

文章目录Redis 常见的数据类型及命令一、常见的NoSQL二、Redis 简介三、key 键的一些操作命令四、Redis的五种基本数据结构1、String&#xff08;字符串&#xff09;介绍常用命令1.1 set/get1.2 append1.3 strlen1.4 setex1.5 mset/mget1.6 setrange/getrange1.7 setnx1.8 incr…

数据库管理工具的使用

目录 摘要 一、Navicat是什么&#xff1f; 二、使用步骤 1.如何下载与安装 2.如何连接远程数据库 总结 摘要 本文主要介绍数据库管理工具的使用 一、Navicat是什么&#xff1f; 它是一款数据库管理工具&#xff0c;将此工具连接数据库,你可以从中看到各种数据库的详细…