author : WGD
目录
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具体实现过程:
-
DomainParticipant QoS:DomainParticipant是FastDDS中的顶层对象,表示一个运行实例。DomainParticipant QoS定义了与该实例相关的全局配置,例如网络传输协议、消息大小限制、资源使用等级等。这些设置可以在创建DomainParticipant时指定,也可以通过XML文件进行配置。
-
Publisher/Subscriber QoS:Publisher和Subscriber是用于发布和订阅数据的对象,它们的QoS设置定义了数据传输的特性,例如传输速度、可靠性、持久性等。这些设置可以通过创建Publisher/Subscriber时指定,也可以在XML文件中进行配置。
-
DataWriter/DataReader QoS:DataWriter和DataReader是Publisher和Subscriber的底层实现,用于实际发送和接收数据。它们的QoS设置定义了数据传输的细节,例如数据缓冲区大小、数据丢失策略等。这些设置可以通过创建DataWriter/DataReader时指定,也可以在XML文件中进行配置。
-
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的类:
-
DataWriterQos:用于设置DataWriter的QoS,包括消息可靠性、传输延迟、带宽限制等参数。
-
PublisherQos:用于设置Publisher的QoS,包括Publisher的ID、持久性、资源限制等参数。
-
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中,有两个应用程序:一个发布者和一个订阅者。发布者会发送包含数据和生命周期相关信息的消息,订阅者则接收这些消息并计算其生命周期是否已经结束。如果生命周期结束,则订阅者将不再处理该消息。这种生命周期控制技术可以帮助减少网络流量和内存使用,并确保及时释放资源。
具体的编译运行步骤如下:
-
下载安装安装CMake:在Download | CMake 下载并安装最新版本的CMake。
-
下载FastDDS源码:在GitHub - eProsima/Fast-DDS: The most complete DDS - Proven: Plenty of success cases. 下载FastDDS源码。
-
打开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的生命周期内全部发送和接收处理完成。如果生命周期结束,则订阅者将不再处理该消息。这种生命周期控制技术可以帮助减少网络流量和内存使用,并确保及时释放资源。