当前位置: 首页 > news >正文

OpenDDS的Qos策略

目录

  • 1、前言
  • 2、QoS策略
    • 2.1、LIVELINESS
    • 2.2、RELIABILITY
    • 2.3、HISTORY
    • 2.4、DURABILITY
    • 2.5、DURABILITY_SERVICE
    • 2.6 、RESOURCE_LIMITS
    • 2.7、PARTITION
    • 2.8、DEADLINE
    • 2.9、LIFESPAN
    • 2.10、USER_DATA
    • 2.11、TOPIC_DATA
    • 2.12、GROUP_DATA
    • 2.13、TRANSPORT_PRIORITY
    • 2.14、LATENCY_BUDGET
    • 2.15、ENTITY_FACTORY
    • 2.16、PRESENTATION
    • 2.17、DESTINATION_ORDER
    • 2.18、WRITER_DATA_LIFECYCLE
    • 2.19、READER_DATA_LIFECYCLE
    • 2.20、TIME_BASED_FILTER
    • 2.21、OWNERSHIP
    • 2.22、OWNERSHIP_STRENGTH

1、前言

OpenDDS(Open Source Data Distribution Service)是一个功能强大的开源数据传输系统,广泛应用于分布式应用程序中。其中的 QoS(Quality of Service)策略在实现高效、可靠的数据通信方面起着关键作用。本文将深入探讨 OpenDDS 的 QoS 策略,包括其作用、常用策略类型以及如何配置和定制 QoS 策略。

2、QoS策略

在配置 OpenDDS 的 QoS 策略时,需要根据具体应用场景和需求选择合适的策略类型和参数。可以通过 XML 配置文件或代码中直接设置 QoS 策略,对各种数据发布器(DataWriter)和数据订阅器(DataReader)进行个性化的配置。

2.1、LIVELINESS

判断参与者是否存活。

心跳发送周期(Liveliness Lease Duration) : 指定数据发布者发送心跳信号的时间间隔。数据订阅者(DataReader)通过接收心跳信号来判断数据发布者是否仍然活跃。如果在指定的时间间隔内没有收到心跳信号,订阅者将认为数据发布者已经失活。
心跳超时时间(Liveliness Lease Duration): 指定数据订阅者等待心跳信号的超时时间,如果在超时时间内没有收到心跳信号,订阅者将认为数据发布者已经失活,并采取相应的措施,如清除相关数据。

enum LivelinessQosPolicyKind {AUTOMATIC_LIVELINESS_QOS,MANUAL_BY_PARTICIPANT_LIVELINESS_QOS,MANUAL_BY_TOPIC_LIVELINESS_QOS
};
struct LivelinessQosPolicy {LivelinessQosPolicyKind kind;Duration_t lease_duration;
};

2.2、RELIABILITY

为DataWriter设置RELIABILITY属性,可以使数据实现“可靠”的传输,当出现通信错误导致数据采样没有被接收到时,DataWriter会持续重传,直到所有数据被正确接收。

enum ReliabilityQosPolicyKind {BEST_EFFORT_RELIABILITY_QOS, //可靠送达 (传输层如果不可靠,应用层实现,比较消耗资源,容易堵塞)RELIABLE_RELIABILITY_QOS //尽力送达
};
struct ReliabilityQosPolicy {ReliabilityQosPolicyKind kind;Duration_t max_blocking_time;
};

2.3、HISTORY

可以选择仅保存最新sample,或最近的N个sample,或全部sample
设置HISTORY属性可以让DataWriter保存并发送旧的采样数据,新的DDS节点如果订阅了相关的Topic,它不仅能够接收到数据的当前值,也能收到一部分历史值,从而了解数据近期的变化趋势

enum HistoryQosPolicyKind {KEEP_LAST_HISTORY_QOS, // 保留最近一部分数据   新数据来临时丢掉最老的数据KEEP_ALL_HISTORY_QOS  // 全部保留  到达资源限制字段后将不再接收
};
struct HistoryQosPolicy {HistoryQosPolicyKind kind;long depth;  //保存数量  默认:1
};

2.4、DURABILITY

VOLATILE: 数据仅提供给现有的订阅者,后加入的Subscriber无法获得数据,这是DDS的默认行为
TRANSIENT_LOCAL: Publisher在本地保存数据,后加入的Subscriber能够获得数据TRANSIENT: GDS (Global Data Space) 保存数据,后加入的Subscriber能够获得数据PERSISTENT: GDS永久保存数据,后加入的Subscriber能够获得数据,即使整个系统发生了重启。

比如: 一个dds系统,里面有多个Subscriber,我们有些节点先启动,有些后启动,启动慢的节点可能错够一些数据。可以配置durabity进行解决。
在这里插入图片描述

enum DurabilityQosPolicyKind {VOLATILE_DURABILITY_QOS, // Least DurabilityTRANSIENT_LOCAL_DURABILITY_QOS,TRANSIENT_DURABILITY_QOS,PERSISTENT_DURABILITY_QOS // Greatest Durability
struct DurabilityQosPolicy {DurabilityQosPolicyKind kind;
};

2.5、DURABILITY_SERVICE

持久性缓冲区

struct DurabilityServiceQosPolicy {Duration_t service_cleanup_delay;HistoryQosPolicyKind history_kind;long history_depth;long max_samples;long max_instances;long max_samples_per_instance;
};

2.6 、RESOURCE_LIMITS

用于限制DDS可以分配的系统内存。
max_samples成员指定单个数据写程序或数据读取器可以跨其所有实例管理的最大样本数。 max_instances成员指定数据写入程序或数据读取器可以管理的最大实例数。 max_samples_per_instance成员指定可以在单个数据写程序或数据读取器中为单个实例管理的最大样本数。 所有这些成员的值默认为无限制(DDS :: LENGTH_UNLIMITED)。

struct ResourceLimitsQosPolicy {long max_samples;long max_instances;
long max_samples_per_instance;
};

2.7、PARTITION

允许在同一Domain下创建逻辑分区,处于同一分区内的DataWriter和DataReader才可以建立通信

struct PartitionQosPolicy {StringSeq name;
};

2.8、DEADLINE

如果希望某个Topic能够周期更新,可以设置DEADLINE属性。在数据的发布方设置DEADLINE,这意味着应用程序必须以小于DEADLINE的周期去更新Topic,而在数据的订阅方设置DEADLINE,这意味着数据的发布方必须以小于DEADLINE的周期去发布Topic。

struct DeadlineQosPolicy {Duration_t period;
};

2.9、LIFESPAN

通过设置LIFESPAN,可以使DataWriter写入的每个数据样本都有一个关联的“到期时间”,超过该时间后,该数据样本不再传送给任何应用程序,并且这些数据将从DataReader缓存中清除。
比如:类似雷达等数据是随着时间快速变化的,如果出现故境一直是旧的数据,我们可以设置LIFESPAN来设置数据有效时间.

struct LifespanQosPolicy {Duration_t duration;  // 有效时间,默认为永久
}

2.10、USER_DATA

允许应用程序将一个字节序列与DomainParticipant、DataReader或DataWiter进行关联,该字节序列通过内建Topic进行分发,常用于分发安全凭证,应用程序可通过此凭证验证数据的有效性。

struct UserDataQosPolicy {sequence<octet> value;
};

2.11、TOPIC_DATA

允许应用程序将一个字节序列与Topic相关联,该字节序列通过内建Topic进行分发常用于为Topic添加附加信息

struct TopicDataQosPolicy {sequence<octet> value;
};

2.12、GROUP_DATA

允许应用程序将一个字节序列与Publisher或Subscriber相关联,该字节序列通过内建Topic进行分发。
可以携带用户定义的信息,在服务发现的过程中就可以交换一些用户数据,从而做一些想做的事,比如安全凭证啥的。

struct GroupDataQosPolicy {sequence<octet> value;
};

2.13、TRANSPORT_PRIORITY

控制传输数据的优先级,由一个整数表示,值越大优先级越高

struct TransportPriorityQosPolicy {long value;
};

2.14、LATENCY_BUDGET

用于控制数据传输的延迟。
它定义了数据从发送端到接收端的最大允许延迟时间。当数据的延迟超过设定的延迟预算时,DDS可以采取一些策略,如丢弃数据或调整传输优先级,以确保数据传输的实时性。

struct LatencyBudgetQosPolicy {Duration_t duration;
};

2.15、ENTITY_FACTORY

指定充当工厂的实体是否自动启用它创建的实例。

struct EntityFactoryQosPolicy {
Boolean autoenable_created_entities;
};

2.16、PRESENTATION

Coherent Access:在一组DDS data sample的更新都到达接收端后,应用程序才能够访问这一组data sample,适用于不同数据实例之间存在关联关系的场景
比如:坐标数据,x,y,z都获取到才能访问这组数据.

enum PresentationQosPolicyAccessScopeKind {INSTANCE_PRESENTATION_QOS, // (默认值)表示实例独立发生更改。TOPIC_PRESENTATION_QOS, // 接受的更改仅限于同一数据读取器或数据写入器中的所有实例。GROUP_PRESENTATION_QOS // 接受的更改仅限于同一发布者或订阅者中的所有实例。
};
struct PresentationQosPolicy {PresentationQosPolicyAccessScopeKind access_scope;boolean coherent_access;boolean ordered_access;
}

2.17、DESTINATION_ORDER

控制给定实例中的样本可供数据读取器使用的顺序。 如果指定了历史深度1(缺省值),则实例将反映所有数据写入程序写入该实例的最新值。

enum DestinationOrderQosPolicyKind {BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, // 实例中的样本按数据读取器接收它们的顺序排序BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS // 实例中的样本是根据数据写入程序提供的时间戳排序的
};
struct DestinationOrderQosPolicy {DestinationOrderQosPolicyKind kind;
};

2.18、WRITER_DATA_LIFECYCLE

该策略控制由数据写入程序管理的数据实例的生命周期。
当autodispose_unregistered_instances设置为true(缺省值)时,数据写入器在删除时时会释放实例。

struct WriterDataLifecycleQosPolicy {boolean autodispose_unregistered_instances;
};

2.19、READER_DATA_LIFECYCLE

策略控制数据读取器管理的数据实例的生命周期.
当autodispose_unregistered_instances设置为true(缺省值)时,数据读取器在删除时时会释放实例。

struct ReaderDataLifecycleQosPolicy {
Duration_t autopurge_nowriter_samples_delay; Duration_t autopurge_disposed_samples_delay;
};

2.20、TIME_BASED_FILTER

按照指定频率经过数据过滤。
设置该参数意味着在指定时间周期内只期望收到一个data sample,过多的data sample将被DataReader丢弃
该参数有助于优化网络负载及节点的计算资源。
比如:默认情况发送方能发送得很快(1秒100个),接受方只要求1秒5个,就可以设置这个参数控制发送速度,减小本地系统资源。

struct TimeBasedFilterQosPolicy { 
Duration_t minimum_separation; 
}; 

2.21、OWNERSHIP

当系统中存在针对同一个数据实例的多人DataWriter时,可以通过设置每DataWrter的"强度"来控制DataWiter的写入权限(“强度”最高的DataWiter拥有写入权限)。
比如: 有两套传感器(冗余)只使用一个,一个发生故障(高强度),切换到另一个传感器(次强度)。

enum OwnershipQosPolicyKind { 
SHARED_OWNERSHIP_QOS,  // 共享
EXCLUSIVE_OWNERSHIP_QOS  // 独占
}; 
struct OwnershipQosPolicy { 
OwnershipQosPolicyKind kind; 
}; 

2.22、OWNERSHIP_STRENGTH

当OWNERSHIP类型设置为EXCLUSIVE时,OWNERSHIP_STRENGTH策略与OWNERSHIP策略一起使用。

struct OwnershipStrengthQosPolicy { 
long value;  // 独占的强度
}; 

相关文章:

OpenDDS的Qos策略

目录 1、前言2、QoS策略2.1、LIVELINESS2.2、RELIABILITY2.3、HISTORY2.4、DURABILITY2.5、DURABILITY_SERVICE2.6 、RESOURCE_LIMITS2.7、PARTITION2.8、DEADLINE2.9、LIFESPAN2.10、USER_DATA2.11、TOPIC_DATA2.12、GROUP_DATA2.13、TRANSPORT_PRIORITY2.14、LATENCY_BUDGET2…...

string基本操作(C++)

增 1.1 “” str str ss;cout << str << endl; //234561提取字串 2.1 substr substr(pos): 提取从位置pos开始到末尾的子串。 #include <iostream> #include <string> using namespace std;int main(){string str "123456";//substr(pos…...

【网站项目】123网上书城系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

LeetCode148.排序链表

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 输入&#xff1a;head [] 输出&#xff1a;[] 思路…...

qt学习:网络调试助手客户端+服务端

目录 客户端 步骤 ui界面配置​编辑 添加头函数&#xff0c;类成员数据&#xff0c;类成员函数 添加模块 构造函数 连接按钮 收到来自服务器的数据触发 发送按钮 断开按钮 向textEditRev文本编辑器中插入指定颜色的文本 服务端 步骤 ui界面配置 添加头函数&…...

C语言拾遗

函数的地址传递&#xff1a; 函数体内部想要修改函数体外部变量值的时候&#xff0c;使用地址传递 int set(int *pa) {//功能 } int main(void) {int a0;set(&a);//此时a的值经过set函数的修改&#xff0c;且传递到了main函数 } 函数体内想修改函数体外部指针的值的时候…...

大唐杯学习笔记:Day4

1.1NR帧结构 5G NR中,依然采用一帧10ms,并将一帧分为10子帧,每个子帧为1ms。每个子帧包含几个时隙(slot),每个时隙由14个OFDM符号构成(在常规CP下)。 μ \mu μ Δ f 2 μ ∗ 15 [ K H Z ] \Delta f2^{\mu}*15[KHZ] Δf2μ∗15[KHZ]Cyclic prefix015Normal130Normal260Normal…...

docker基线安全修复和容器逃逸修复

一、docker安全基线存在的问题和修复建议 1、将容器的根文件系统挂载为只读 修复建议&#xff1a; 添加“ --read-only”标志&#xff0c;以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用&#xff0c;以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…...

ZooKeeper概述

ZooKeeper是一个开源的分布式协调服务&#xff0c;由Apache Software Foundation维护。它主要用于解决分布式应用中遇到的一些最常见问题&#xff0c;如命名服务、状态同步、配置管理和群集管理等。通过提供一套简单但强大的API&#xff0c;ZooKeeper使得从简单的锁服务到复杂的…...

【sgCollapseBtn】自定义组件:底部折叠/展开按钮

特性&#xff1a; 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…...

如何根据玩家数量和游戏需求选择最合适的服务器配置?

根据玩家数量和游戏需求选择最合适的服务器配置&#xff0c;首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏&#xff0c;如MMORPG或MOBA等&#xff0c;由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…...

问题解决:各版本的vc_redist下载地址 缺少msvcr100.dll、msvcr120.dll、msvcr140.dll

Visual C Redistributable for Visual Studio各版本的官方链接。解决缺少msvcr100.dll、msvcr120.dll、msvcr140.dll的问题。 下面全部为官方链接&#xff1a; Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://ak…...

182基于matlab的半监督极限学习机进行聚类

基于matlab的半监督极限学习机进行聚类&#xff0c;基于流形正则化将 ELM 扩展用于半监督&#xff0c;三聚类结果可视化输出。程序已调通&#xff0c;可直接运行。 182matlab ELM 半监督学习 聚类 模式识别 (xiaohongshu.com)...

C语言数组案例编程

1. 编写一个程序实现&#xff1a;从键盘输入15个整数存入数组&#xff0c;然后统计其中正整数的个数。 【要求】采用函数编程 #include<stdio.h> void input(int a[],int n) {int i; for(i0;i<n;i)scanf("%d",&a[i]); }int positiveNum(int a[],int n…...

NLP - 依存句法分析、句子歧义

1. 语言结构的两种观点 Constituency phrase struct grammar context-free grammars(CFGs)Dependency structure 对于context-free grammars(CFGs) 短语结构&#xff08;Constituency&#xff09;&#xff1a;短语结构语法是一种描述语言结构的方法&#xff0c;它将句子划…...

vue实现图片上传至oss,返回url插入数据库,最后在前端页面上回显图片

vue前端上传图像 上传图片 使用上传图片的upload组件 <el-form-item label"设备图像"><el-upload//设置class样式class"avatar-uploader"//绑定上传路径:action"uploadUrl"//携带token值:headers"tokenInfo":show-file-lis…...

C++学习笔记:set和map

set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…...

990-28产品经理:Different types of IT risk 不同类型的IT风险

Your IT systems and the information that you hold on them face a wide range of risks. If your business relies on technology for key operations and activities, you need to be aware of the range and nature of those threats. 您的IT系统和您在其中持有的信息面临…...

wpa_supplicant与用户态程序的交互分析

1 wpa_supplicant与用户态程序wpa_cli的交互过程 1.1 交互接口类型 wpa_supplicant与用户态程序交互的主要接口包括以下几种&#xff1a; 1&#xff09;命令行界面&#xff1a;通过命令行工具 wpa_cli 可以与 wpa_supplicant 进行交互。wpa_cli 允许用户执行各种 wpa_suppli…...

JavaScript继承 寄生组合式继承 extends

JavaScript继承 1、JS 的继承到底有多少种实现方式呢? 2、ES6 的 extends 关键字是用哪种继承方式实现的呢? 继承种类 原型链继承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...