DDS(Data Distribution Service)————Publisher(3) DataWriterQos的DurabilityQos与DurabilityServiceQos详解
5.DataWriter
DataWriter
是 Fast DDS 中用于向一个特定 Topic
发布数据的实体。它负责将数据传输给网络上的其他参与者(例如 DataReader
),并确保数据按指定的质量服务(QoS)进行传输。
5.1创建DataWriter
DomainParticipant* participant = DomainParticipantFactory::get_instance()->create_participant(0,PARTICIPANT_QOS_DEFAULT);
Publisher* publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT);
Topic* topic = participant->create_topic("TopicName","DataName",TOPIC_QOS_DEFAULT,nullptr);
DataWriter* dataWriter= publisher->create_datawriter(topic,DATAWRITER_QOS_DEFAULT);
5.2 删除Publisher所创建的DataWriter
publisher->delete_datawriter(dataWriter);
5.3 DataWriterQos的属性以及使用
D a t a W r i t e r Q o s 的使用与创建是与 P u b l i s h e r Q o s 大体一致的,只不过多了一些可配置选项 {\color{red}DataWriterQos的使用与创建是与PublisherQos大体一致的,只不过多了一些可配置选项} DataWriterQos的使用与创建是与PublisherQos大体一致的,只不过多了一些可配置选项
5.3.1 创建与使用DataWriterQos
DomainParticipant* participant =
DomainParticipantFactory::get_instance()->create_participant(0,PARTICIPANT_QOS_DEFAULT);
Publisher* pub = participant->create_publisher(PUBLISHER_QOS_DEFAULT);
Topic* topic = participant->create_topic("TopicName","DataName",TOPIC_QOS_DEFAULT);
DataWriter* datawriter = pub->create_datawriter(topic,DATAWRITER_QOS_DEFAULT);
/* 设置DataWriterQos */
datawriter->set_qos(DATAWRITER_QOS_DEFAULT);
5.3.2 DataWriterQos各个配置项详解
以下为所有的配置项与使用函数,接下来我将逐个讲解 {\color{red}以下为所有的配置项与使用函数,接下来我将逐个讲解} 以下为所有的配置项与使用函数,接下来我将逐个讲解
5.3.2.1 DurabilityQosPolicy
DurabilityQosPolicy
是 DDS(Data Distribution Service)中的一种质量服务(QoS)策略,决定数据在数据发布者(DataWriter)和订阅者(DataReader)之间的持久性行为。它定义了当数据发布者不可用时,数据是否和如何被保存,以供后来的订阅者使用。
值得注意的几点: {\color{red} 值得注意的几点:} 值得注意的几点:
- DurabilityQosPolicy对于Topic、DataWriter、DataReader 都会有影响
- 这个策略不能修改已经使能的实例(就是已经调用过Enable()的实例)
- 如果设置DataReader能够接收Past数据,则需要将ReliabilityQosPolicy也设置为RELIABLE_RELIABILITY_QOS
5.3.2.1.1 DurabilityQosPolicyKind
定义了4种持久性的方式:VOLATILE_DURABILITY_QOS、TRANSIENT_LOCAL_DURABILITY_QOS、TRANSIENT_DURABILITY_QOS、PERSISTENT_DURABILITY_QOS
- VOLATILE:
- 描述:数据是易失性的,不会在发布者和订阅者的生命周期之外存在。
- 行为:发布的数据在传递给现有的订阅者后立即丢弃。新加入的订阅者不会收到之前发布的数据。
- 应用场景:适用于不需要持久化的数据,例如实时传感器数据流。
- TRANSIENT_LOCAL:
- 描述:数据在发布者的生命周期内是持久的,但在发布者终止后丢失。
- 行为:发布的数据保存在发布者的内存中,并且新加入的订阅者可以接收到发布者存储的最近数据。当发布者终止时,数据被丢弃。
- 应用场景:适用于需要在发布者存在期间保持数据的应用,例如在某个过程或任务期间需要保存数据状态。
- TRANSIENT:
- 描述:数据在发布者的生命周期内是持久的,并且在发布者终止后可以由中间节点(如持久存储器)保存。
- 行为:数据在发布者终止后仍然存在,由中间节点(如网络服务或持久存储器)保存。新加入的订阅者可以接收到这些持久化的数据。
- 应用场景:适用于需要在系统重启后恢复数据的应用,例如需要在重新启动后恢复状态的控制系统。
- PERSISTENT:
- 描述:数据是永久的,持久化存储,即使在系统重启后,数据也不会丢失。
- 行为:数据被保存到持久存储(如数据库、文件系统),并且新加入的订阅者可以接收到这些持久化的数据。
- 应用场景:适用于需要长期保存数据的应用,例如日志记录、历史数据存储等。
5.3.2.1.2 DataReader与DataWriter之间的兼容性规则
大致上分为两种分类:
- 以DataWriter与DataReader分类:要保证DataWriter的持久化策略高于或者等于DataReader的持久化的策略。
- 不同持久化策略的等级要符合以下顺序:VOLATILE_DURABILITY_QOS < TRANSIENT_LOCAL_DURABILITY_QOS < TRANSIENT_DURABILITY_QOS < PERSISTENT_DURABILITY_QOS
以下是可能存在的场景组合:
5.3.2.1.3 C++和XML的使用示例
C + + {\color{green}C++} C++
DurabilityQosPolicy durabilityQos = dataWriterQos.durability();
/* 设置不同持久化的策略模式 */
durabilityQos.kind = VOLATILE_DURABILITY_QOS;
durabilityQos.kind = TRANSIENT_LOCAL_DURABILITY_QOS;
durabilityQos.kind = TRANSIENT_DURABILITY_QOS;
durabilityQos.kind = PERSISTENT_DURABILITY_QOS;
/* 获取持久化策略模式的值 */
RTPS::DurabilityKind_t kind = durabilityQos.durabilityKind();
X M L {\color{green}XML} XML
<data_writer profile_name="writer_xml_conf_durability_profile">
<qos>
<durability>
<kind>TRANSIENT_LOCAL</kind>
</durability>
</qos>
</data_writer>
<data_reader profile_name="reader_xml_conf_durability_profile">
<qos>
<durability>
<kind>VOLATILE</kind>
</durability>
</qos>
</data_reader>
5.3.2.2 DurabilityServiceQosPolicy
DurabilityServiceQosPolicy
是 DDS(Data Distribution Service)中的一种质量服务(QoS)策略,配合 DurabilityQosPolicy
使用,用于控制数据在持久存储中的管理方式。它主要用于 TRANSIENT
和 PERSISTENT
的持久性级别,定义了数据在持久存储中保存的时间、清理机制、历史记录等策略
- service_cleanup_delay:
- 描述:指定服务清理的延迟时间。这是指数据在被标记为“无效”后,保留在持久存储中的时间。延迟时间结束后,数据将被清理。
要满足以下条件才可以去清除
{\color{red}要满足以下条件才可以去清除}
要满足以下条件才可以去清除:
- Instance 已经被Dispose处理,或者实例状态变为NOT_ALIVE_DISPOSED_INSTANCE_STATE。
- 不会有新的Instance写入DataWriter。
- 当前两项条件都满足时,开始进行计时,直到达到设定的Duration_t后清除Instance。
- 类型:Duration_t(DDS 中的时间表示法,包括秒和纳秒)。
- 默认值:无限(数据不会自动清理)。
- 描述:指定服务清理的延迟时间。这是指数据在被标记为“无效”后,保留在持久存储中的时间。延迟时间结束后,数据将被清理。
要满足以下条件才可以去清除
{\color{red}要满足以下条件才可以去清除}
要满足以下条件才可以去清除:
- history_kind:
- 描述:指定历史记录的类型,决定如何存储历史数据。
- 类型:HistoryQosPolicyKind(枚举类型)。
- KEEP_LAST_HISTORY_QOS:
只保留最近的
N
个样本。
{\color{blue}只保留最近的 N 个样本。}
只保留最近的N个样本。服务将仅尝试保留实例的最新值,并丢弃较旧的值。要保留和传递的最大样本数量由
HistoryQosPolicy
的深度定义,该设置需要与ResourceLimitsQosPolicy
的设置保持一致。如果达到深度定义的限制,系统将丢弃最旧的样本以腾出空间给新样本。 - KEEP_ALL_HISTORY_QOS:
保留所有的历史样本
{\color{blue}保留所有的历史样本}
保留所有的历史样本。服务将尝试保留实例的所有值,直到这些值能够传递给所有现有的订阅者。如果选择此选项,深度将不起作用,因此历史记录仅受
ResourceLimitsQosPolicy
中设置的值限制。如果达到限制,系统的行为取决于ReliabilityQosPolicy
的设置:如果其类型为BEST_EFFORT
,旧值将被丢弃;但如果其类型为RELIABLE
,服务将阻塞DataWriter
,直到旧值传递给所有现有的订阅者。
- KEEP_LAST_HISTORY_QOS:
只保留最近的
N
个样本。
{\color{blue}只保留最近的 N 个样本。}
只保留最近的N个样本。服务将仅尝试保留实例的最新值,并丢弃较旧的值。要保留和传递的最大样本数量由
- 默认值:KEEP_LAST_HISTORY_QOS。
- history_depth:
- 描述:指定历史记录的深度,当
history_kind
为 KEEP_LAST_HISTORY_QOS 时有效。它决定了保留的最新样本的数量。 - 类型:int32_t
- 默认值:1。
- 描述:指定历史记录的深度,当
- max_samples:
- 描述:指定可以保存的最大样本数量。即DataWriter与DataReader可以控制最大的Samles
- 类型:int32_t
- 默认值:-1 无限(数据的数量不受限制)。
- max_instances:
- 描述:指定可以保存的最大实例数量。
- 类型:int32_t
- 默认值:-1 无限(实例的数量不受限制)。
- max_samples_per_instance:
- 描述:指定每个实例可以保存的最大样本数量。
- 类型:int32_t
- 默认值:-1 无限(每个实例的数据数量不受限制)。
每个 D a t a W r i t e r 的 Q o s 都对应一个 D a t a W r i t e r I n s t a n c e ,所以修改一个 q o s 并不会互相影响 {\color{red}每个DataWriter的Qos都对应一个DataWriterInstance,所以修改一个qos并不会互相影响} 每个DataWriter的Qos都对应一个DataWriterInstance,所以修改一个qos并不会互相影响
C + + 示例 {\color{green}C++示例} C++示例
/* 创建延迟时间 */
RTPS::DurabilityKind_t kind = durabilityQos.durabilityKind();
Time_t delayTime = Time_t(5,0);
DurabilityServiceQosPolicy durabilityServiceQos = dataWriterQos.durability_service();
/* 确定历史保留类型 */
durabilityServiceQos.history_kind = KEEP_LAST_HISTORY_QOS;
durabilityServiceQos.history_kind = KEEP_ALL_HISTORY_QOS;
/* 确定历史保留长度 */
durabilityServiceQos.history_depth = 1U;
/* 设置样本最大数量,实例最大数量,没个实例最大的样本数量*/
durabilityServiceQos.max_samples = 300U;
durabilityServiceQos.max_instances = 10U;
durabilityServiceQos.max_samples_per_instance = 20U