DDS(Data Distribution Service)————Publisher(3) DataWriterQos的DurabilityQos与DurabilityServiceQos详解

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

  1. VOLATILE
    • 描述:数据是易失性的,不会在发布者和订阅者的生命周期之外存在。
    • 行为:发布的数据在传递给现有的订阅者后立即丢弃。新加入的订阅者不会收到之前发布的数据。
    • 应用场景:适用于不需要持久化的数据,例如实时传感器数据流。
  2. TRANSIENT_LOCAL
    • 描述:数据在发布者的生命周期内是持久的,但在发布者终止后丢失。
    • 行为:发布的数据保存在发布者的内存中,并且新加入的订阅者可以接收到发布者存储的最近数据。当发布者终止时,数据被丢弃。
    • 应用场景:适用于需要在发布者存在期间保持数据的应用,例如在某个过程或任务期间需要保存数据状态。
  3. TRANSIENT
    • 描述:数据在发布者的生命周期内是持久的,并且在发布者终止后可以由中间节点(如持久存储器)保存。
    • 行为:数据在发布者终止后仍然存在,由中间节点(如网络服务或持久存储器)保存。新加入的订阅者可以接收到这些持久化的数据。
    • 应用场景:适用于需要在系统重启后恢复数据的应用,例如需要在重新启动后恢复状态的控制系统。
  4. 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 使用,用于控制数据在持久存储中的管理方式。它主要用于 TRANSIENTPERSISTENT 的持久性级别,定义了数据在持久存储中保存的时间、清理机制、历史记录等策略

  1. service_cleanup_delay
    • 描述:指定服务清理的延迟时间。这是指数据在被标记为“无效”后,保留在持久存储中的时间。延迟时间结束后,数据将被清理。 要满足以下条件才可以去清除 {\color{red}要满足以下条件才可以去清除} 要满足以下条件才可以去清除
      1. Instance 已经被Dispose处理,或者实例状态变为NOT_ALIVE_DISPOSED_INSTANCE_STATE。
      2. 不会有新的Instance写入DataWriter。
      3. 当前两项条件都满足时,开始进行计时,直到达到设定的Duration_t后清除Instance。
    • 类型:Duration_t(DDS 中的时间表示法,包括秒和纳秒)。
    • 默认值:无限(数据不会自动清理)。
  2. 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
  3. history_depth
    • 描述:指定历史记录的深度,当 history_kindKEEP_LAST_HISTORY_QOS 时有效。它决定了保留的最新样本的数量。
    • 类型:int32_t
    • 默认值:1。
  4. max_samples
    • 描述:指定可以保存的最大样本数量。即DataWriter与DataReader可以控制最大的Samles
    • 类型:int32_t
    • 默认值:-1 无限(数据的数量不受限制)。
  5. max_instances
    • 描述:指定可以保存的最大实例数量。
    • 类型:int32_t
    • 默认值:-1 无限(实例的数量不受限制)。
  6. 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并不会互相影响} 每个DataWriterQos都对应一个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



  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值