FastDDS中的QoS

author : WGD

目录

1. fastDDS模型概述

2. fastDDS之QOS(质量服务)概述

3.fastDDS之QOS的一个具体实现

4.fastDDS中各个模块Qos的具体实现

5.windows环境下编译并运行fastDDS中的Qos案例


1. fastDDS模型概述

在数据分发中,Publisher(发布者)可将数据发送到Topic(主题)Subscriber(订阅者)则可以从Topic中接收数据。其中,DataWriter(数据写入器)和DataReader(数据读取器)是Publisher和Subscriber的API接口,用于实际进行数据的读写操作,Participant(参与者)则负责管理和协调Publishers和Subscribers之间的连接和通信。QoS(服务质量)是一组参数,它们定义了Publisher和Subscriber在交换数据时所遵循的规则和保证,它们可以定义消息传递的可靠性,延迟和带宽要求等。具体过程如图所示。

2. fastDDS之QOS(质量服务)概述

FastDDS中的QoS(Quality of Service)是通过一系列的配置项来实现的,配置项可以在代码中或者XML配置文件中进行设置。具体而言,FastDDS中的QoS包括三个层次:数据写入者(DataWriter)、数据读取者(DataReader)和域(Domain),每个层次都有特定的QoS配置项,如可靠性、持久性、延迟等。根据应用需求,用户可以对这些配置项进行调整,以获得最优的通信效果。

FastDDS是一种快速数据分发系统,用于实现实时通信和数据传输。它有多个组成部分,每个部分都有自己的QoS设置。

以下是FastDDS中各个部分的QoS具体实现过程:

  1. DomainParticipant QoS:DomainParticipant是FastDDS中的顶层对象,表示一个运行实例。DomainParticipant QoS定义了与该实例相关的全局配置,例如网络传输协议、消息大小限制、资源使用等级等。这些设置可以在创建DomainParticipant时指定,也可以通过XML文件进行配置。

  2. Publisher/Subscriber QoS:Publisher和Subscriber是用于发布和订阅数据的对象,它们的QoS设置定义了数据传输的特性,例如传输速度、可靠性、持久性等。这些设置可以通过创建Publisher/Subscriber时指定,也可以在XML文件中进行配置。

  3. DataWriter/DataReader QoS:DataWriter和DataReader是Publisher和Subscriber的底层实现,用于实际发送和接收数据。它们的QoS设置定义了数据传输的细节,例如数据缓冲区大小、数据丢失策略等。这些设置可以通过创建DataWriter/DataReader时指定,也可以在XML文件中进行配置。

  4. Topic QoS:Topic是数据发布和订阅的主题,它的QoS设置定义了数据类型、命名空间、数据序列化方式等。这些设置可以通过创建Topic时指定,也可以在XML文件中进行配置。

总之,FastDDS中的各个组成部分都有自己的QoS设置,这些设置定义了系统的行为和性能。这些设置可以通过编程方式指定,也可以在XML文件中进行配置。

3.fastDDS之QOS的一个具体实现

在FastDDS的代码中,可以通过创建一个QoS对象并设置相应的属性来配置QoS,下面代码创建了Qos对象并设置属性,使用publisher创建DataWriter对象并使用上述QoS对象进行配置。

eprosima::fastdds::dds::DataWriterQos writer_qos;
writer_qos.history().depth = 10; // 设置历史记录深度为10
writer_qos.reliability().kind = eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS; // 设置可靠性

// 创建DataWriter对象并使用上述QoS对象进行配置
auto writer = publisher->create_datawriter(topic, writer_qos);

在fastDDS中,每个数据写入者和数据读取者都可以指定自己的QoS参数。当一个数据写入者发布一个消息时,fastDDS会检查与该主题相关的所有数据读取者的QoS参数,以确定如何将该消息路由到每个订阅者。类似地,当一个数据读取者订阅了一个主题时,fastDDS会检查与该主题相关的所有数据写入者的QoS参数,以确定如何接收消息并确认其接收情况。

要使用fastDDS的QoS功能,需要指定正确的QoS参数。这可以通过编程方式或使用XML文件进行配置。比如,可以通过以下代码片段来指定DataWriter的QoS,下方代码将DataWriter的Qos参数的history.depth设置为1000,将resource_limits.max_samples_per_instance设置为500,并将reliability.kind设置为DDS::RELIABLE_RELIABILITY_QOS。这些参数将控制消息的送达和可靠性。

总之,fastDDS的QoS功能可以控制消息传输的行为和性能,并提供高度灵活的配置选项来满足各种应用程序需求。

DDS::DataWriterQos qos;
publisher->get_default_datawriter_qos(qos);
qos.history.depth = 1000;
qos.resource_limits.max_samples_per_instance = 500;
qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS;
writer = publisher->create_datawriter(topic, qos);

4.fastDDS中各个模块Qos的具体实现

(1)先看一下publisher包下定义的三个Qos,然后在具体的写入消息中使用定义和配置的Qos,具体如下:

在Publisher端,DDS提供了三个实现QoS的类:

  1. DataWriterQos:用于设置DataWriter的QoS,包括消息可靠性、传输延迟、带宽限制等参数。

  2. PublisherQos:用于设置Publisher的QoS,包括Publisher的ID、持久性、资源限制等参数。

  3. WriterQos:是DataWriterQos的基础类,用于设置DataWriter的通用参数,如历史数据缓存大小、keep-alive时间等。

这些QoS参数的具体细节包括:

  • 消息可靠性(Reliability):在DDS中,消息分为可靠消息和不可靠消息。可靠消息会在确保数据到达接收方之前进行重传,而不可靠消息则没有此保证。
  • 传输延迟(Deadline):在DDS中,可以设置最大传输延迟时间,如果超过这个时间,就会认为该消息已经无效,将其从DataWriter中删除。
  • 带宽限制(Bandwidth):在DDS中,可以设置最大带宽限制,以避免数据发送过程中对网络造成过大负载。
  • 持久性(Durability):在DDS中,可以指定数据的持久性,以确保即使在DataWriter离线时也能保留数据。
  • 历史数据缓存大小(History):在DDS中,可以设置历史数据的缓存大小,以确保订阅者能够获取到之前发送的所有数据。
  • keep-alive时间:在DDS中,可以设置keep-alive时间来避免数据写入者和读取者因为网络问题而失去连接。

(2)同样地,在subsciber端、topic端、domain端都定义了具体的Qos,通过创建一个QoS对象并设置相应的属性来配置QoS,然后根据应用的具体性能需求,具体的函数中调用配置的Qos对象。

5.windows环境下编译并运行fastDDS中的Qos案例

fastDDS中提供了很对Qos实现的案例,这里我们在windows环境下编译运行其中的LifespanQoSExample案例。

LifespanQoSExample是FastDDS中的一个示例,演示了如何使用FastDDS中的Lifespan QoS特性。在LifespanQoSExample中,有两个应用程序:一个发布者和一个订阅者。发布者会发送包含数据和生命周期相关信息的消息,订阅者则接收这些消息并计算其生命周期是否已经结束。如果生命周期结束,则订阅者将不再处理该消息。这种生命周期控制技术可以帮助减少网络流量和内存使用,并确保及时释放资源。

具体的编译运行步骤如下:

  1. 下载安装安装CMake:在Download | CMake 下载并安装最新版本的CMake。

  2. 下载FastDDS源码:在GitHub - eProsima/Fast-DDS: The most complete DDS - Proven: Plenty of success cases. 下载FastDDS源码。

  3. 打开LifespanQoSExample所在目录,可以看到并没有.sln的解决方案文件。

          4.以管理员身份运行 powershell,并执行如下指令进行编译:

cmake -Bbuildexample

      5.安装Visual Studio,打开buildexample文件夹下的.可执行的.sln文件,然后编译项目:在Visual Studio中选择“生成”->“全部生成”。

     6.完成编译并生成可执行的.exe文件,如下所示,代表编译成功。可以在下图的给出的/Debug文件夹下找到编译成功生成的.exe文件。

      7. 官网给的运行该Qos案例的方法,此示例说明如何在Fast DDS应用程序中使用生命周期QoS。要启动这个测试,打开两个不同的控制台:

./DDSLifespanQoSExample publisher  
./DDSLifespanQoSExample subscriber

准确地说就是以管理员身份打开两个powershell,然后启动发布订阅实现该Qos策略。

      8.我们看一下最后运行的结果,publisher成功运行并发布了10条消息,采用LifespanQoS策略读取消息,在2000ms的生命周期内全部发送和接收处理完成。如果生命周期结束,则订阅者将不再处理该消息。这种生命周期控制技术可以帮助减少网络流量和内存使用,并确保及时释放资源。

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/129745123
QOS