DDS(Data Distribution Service) 数据分发服务-05 Fast DDS框架-3(Subscriber)



前言

本章介绍Subscriber。


一、Subscriber

订阅是通过DataReader与Subscriber实体来实现的。DataReader由Subscriber创建,DataReader将绑定到将要接收的数据类型的Topic。然后,DataReader将开始接收来自与此主题匹配的远程Publisher发布的消息。
当Subscriber接收到数据时,它通知用户应用程序有新数据可用,应用程序可以使用DataReader来获取接收到的数据。
在这里插入图片描述

Subscriber

Subscriber作为一个容器,可创建多个DataReader,通过SubscriberQos对其进行管理。各个DataReader会SubscriberQos的统一影响,除此之外是相互独立的。Subscriber可以为不同的主题数据托管不同的DataReader。

  • SubscriberQos类包含了适用于Subscriber的策略:
QosPolicy class Accessor/Mutator
PresentationQosPolicy presentation()
PartitionQosPolicy partition()
GroupDataQosPolicy group_data()
EntityFactoryQosPolicy entity_factory()
  • SubscriberListener监听器类:
    SubscriberListener继承于DataReaderListener,默认情况下会优先调用DataReaderListener的回调,除非DataReaderListener没有匹配的回调或者被StatusMask屏蔽了相应状态,此类情况下会调用SubscriberListener的回调。
    SubscriberListener另外新增了on_data_on_reader的回调:这个回调是对所有包含的DataReader有效,只有任意一个DataReader有数据达到,则触发回调。当同时有几个DataReader有数据到达时,只会触发一次回调,必须在回调函数中把所有DataReader数据读完。

  • 创建Subscriber
    由DomainParticipant调用create_subscriber创建,必须传入参数SubscriberQos,可选参数SubscriberListener和StatusMask。

二、DataReader

DataReader由Subscriber创建,必须与一个Topic绑定。Topic必须在DataReader创建前存在。DataReader创建之后,在接受到Publisher的发布后,应用程序可以调用DataReader的DataReader::read_next_sample()或DataReader::take_next_sample()成员函数获取数据。

  • DataReaderQos类包含了适用于DataReader的Qos策略:
QosPolicy class Accessor/Mutator
DurabilityQosPolicy durability()
DurabilityServiceQosPolicy durability_service()
DeadlineQosPolicy deadline()
LatencyBudgetQosPolicy latency_budget()
LivelinessQosPolicy latency_budget()
ReliabilityQosPolicy reliability()
DestinationOrderQosPolicy destination_order()
HistoryQosPolicy history()
ResourceLimitsQosPolicy resource_limits()
LifespanQosPolicy lifespan()
UserDataQosPolicy user_data()
OwnershipQosPolicy ownership()
PropertyPolicyQos properties()
RTPSEndpointQos endpoint()
ReaderResourceLimitsQos reader_resource_limits()
RTPSEndpointTimeBasedFilterQosPolicy time_based_filter()
ReaderDataLifecycleQosPolicy reader_data_lifecycle()
RTPSReliableReaderQos reliable_reader_qos()
TypeConsistencyQos type_consistency()
DataSharingQosPolicy data_sharing()
  • DataReaderListener监听器类,包含以下回调函数:
    on_data_available():在DataReader上有应用程序可用的新数据更新时,触发回调。如果一次接收到几个新的数据更改,则只能为所有这些更改发出一个回调调用,而不是每个更改发出一个回调调用。如果应用程序在此回调中检索接收到的数据,则必须继续读取数据,直到没有留下新的更改。
    on_subscription_matched():DataReader匹配到DataWriter,或者与之前已匹配的DataWriter停止连接,会触发回调。
    on_requestd_deadline_missed ():DataReader没有在DataReaderQos上配置的截止时间内接收数据。
    on_requested_incompatible_qos(): DataReader已经找到了一个与Topic匹配的DataWriter,并且具有公共分区,但是QoS与DataReader上定义的QoS不兼容。
    on_liveliness_changed():匹配的DataWriter的活跃状态发生了变化。非活动的DataWriter变成活动的,或者反过来。
    on_sample_rejected():DataReader拒绝接受数据样本时,触发回调。拒绝的原因参考SampleRejectedStatusKind。
    on_sample_lost():数据样本丢失时触发回调。

  • 创建DataReader:
    由Subscriber调用create_datareader,创建时必须绑定topic和DataReaderQos,DataReaderListener和StatusMask可选。

SampleInfo

DataReader返回读取到的数据时,同时会返回一个SampleInfo实例。SampleInfo包含了数据的其他附加信息。比如valid_data字段为false,则DataReader不会通知应用程序更新实例中的新值,而是只通知状态更改,并且必须丢弃返回的数据值。SampleInfo包含以下字段:

sample_state

表示之前是否已经读取了相应的数据样本。可以取以下值之一:

  • READ:这是第一次检索该数据样本
  • NOT_READ:数据样本之前已经被读取或获取过
view_state

表示这是否是DataReader检索的这个数据实例的第一个样本。它可以取以下值之一:

  • NEW:这是第一次检索这个实例的样本
  • NOT_NEW:已被检索过
instance_state

表示instance是还存在还是已被销毁。在后一种情况下,它还提供有关处置原因的信息。它可以取以下值之一:

  • ALIVE:instance当前存在
  • not_alive_handled:远程DataWriter处理了这个instance
  • NOT_ALIVE_NO_WRITERS:由于发布该实例的远程DataWriter不在活动状态,DataReader已经处理了该instance
disposed_generation_count

指示实例在被处置后变为活动状态的次数

no_writers_generation_count

表示该instance被处理为NOT_ALIVE_NO_WRITERS状态后,变成活跃状态的次数

sample_rank

表示本次回调里面,该instance总共有多少次数据样本更新。比如为5,表示该DataReader有5个数据更新。
当前Fast DDS v2.14.1不支持。

generation_rank

表示在处理instance期间,又有新的更新到该instance的次数。
当前Fast DDS v2.14.1不支持。

absolute_generation_rank

当前Fast DDS v2.14.1不支持。

source_timestamp

DataWriter发布该样本数据时打上的时间戳。

instance_handle

本地instance的handle

publication_handle

发布该数据的DataWriter的句柄

Fast-DDS-Python 是由 eProsima 提供的 Fast DDS(即 Fast Data Distribution Service)的 Python 绑定,它实现了 OMG(对象管理组织)定义的数据分发服务DDS)标准。Fast DDS 是一个高性能、可扩展且符合行业标准的中间件,专为实时系统设计[^1]。 ### 联邦连接支持 Fast-DDS-Python 支持联邦连接的概念,这主要通过其对 DDS-XRCE(DDS eXternal discovery and communication for constrained environments)标准的支持实现。在资源受限设备或异构网络环境中,可以使用 Fast-DDS-Python 创建客户端-代理(client-agent)架构,其中代理作为联邦协调者,管理多个参与节点之间的通信。这种联邦连接方式使得多个独立的 DDS 域可以通过代理实现互连互通,从而形成一个更大的分布式系统[^1]。 ### 数据分发服务功能 Fast-DDS-Python 完整实现了 DDS 规范中定义的数据分发服务功能。它支持发布-订阅通信模型,允许应用程序声明数据主题(topics),并通过数据写入器(DataWriter)和数据读取器(DataReader)进行数据交换。此外,Fast-DDS-Python 提供了丰富的 QoS(服务质量)策略,如可靠性(Reliability)、持久性(Durability)、传输优先级(Transport Priority)等,这些策略可以满足不同应用场景下对数据分发的高性能和可预测性需求。 例如,创建一个简单的发布-订阅示例可以如下所示: ```python import fastdds import time # 创建参与者 participant = fastdds.DomainParticipant(0) # 定义主题 topic_data_type = fastdds.TypedReaderListener() topic_data_type.set_name("std_msgs::msg::dds_::String_") # 创建发布者 publisher = participant.create_publisher(fastdds.PUBLISHER_QOS_DEFAULT) # 创建数据写入器 datawriter_qos = fastdds.DataWriterQos() datawriter_qos.reliability().kind = fastdds.RELIABLE_RELIABILITY_QOS datawriter = publisher.create_datawriter(topic_data_type, datawriter_qos) # 创建订阅者 subscriber = participant.create_subscriber(fastdds.SUBSCRIBER_QOS_DEFAULT) # 创建数据读取器 datareader_qos = fastdds.DataReaderQos() datareader_qos.reliability().kind = fastdds.RELIABLE_RELIABILITY_QOS datareader = subscriber.create_datareader(topic_data_type, datareader_qos) # 发送数据 data = fastdds.String_() data.data("Hello World") datawriter.write(data) time.sleep(1) # 等待数据传输 # 清理资源 participant.delete_contained_entities() fastdds.DomainParticipantFactory.get_instance().delete_participant(participant) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值