ZBLOG

15.4.3. Flow Controllers eProsima Fast DDS provides a mechanism to limit the rate at which the data is sent by a DataWriter. These controllers should be registered on the creation of the DomainParticipant using FlowControllersQos, and then refere...

15.4.3. Flow Controllers

eProsima Fast DDS 提供了一种机制来限制 DataWriter 发送数据的速率。这些控制器应在创建 DomainParticipant 时使用 FlowControllersQos 注册,然后在创建 DataWriter 时通过 PublishModeQosPolicy 引用。

首次通过异步 DataWriter 引用流控制器时,将生成一个新线程。该线程将负责调节所有引用相同流控制器的 DataWriters 的网络输出样本。

流控制器应该有一个名称,以便稍后可以被 DataWriters 引用。始终可用的默认无限制 FIFO 流控制器名称为 FASTDDS_FLOW_CONTROLLER_DEFAULT

15.4.3.1. Scheduling policy

根据使用的调度策略,有不同类型的流控制器。它们都将限制在指定的时间段内发送到网络的最大字节数,即每个周期不超过 max_bytes_per_period 字节,在 period_ms 毫秒内。它们之间唯一的区别在于决定样本发送顺序的方法。

  • FIFO:按先到先服务的顺序输出样本。

  • ROUND_ROBIN:以循环顺序从每个 DataWriter 中输出一个样本。

  • HIGH_PRIORITY:优先输出具有最高优先级的数据写入器(DataWriters)的样本。DataWriter 的优先级通过属性 fastdds.sfc.priority 配置,允许值范围是 -10(最高优先级)到 10(最低优先级)。如果属性不存在,则会设置为最低优先级。同一优先级的数据写入器样本按照 FIFO 顺序处理。

  • PRIORITY_WITH_RESERVATION:与上面的方法类似,但允许 DataWriters 保留部分输出带宽。通过属性 fastdds.sfc.bandwidth_reservation 来实现,允许值范围是 0 到 100,表示总流控制器限制的一定百分比。如果属性不存在,则默认为 0(不为 DataWriter 保留带宽)。在保留带宽消耗后,其余样本将按照 HIGH_PRIORITY 的规则处理。

15.4.3.2. Example configuration

以下是一个 C++ 示例配置:

// Limit to 300kb per second.
static const char* flow_controller_name = "example_flow_controller";
auto flow_control_300k_per_sec = std::make_shared<eprosima::fastdds::rtps::FlowControllerDescriptor>();
flow_control_300k_per_sec->name = flow_controller_name;
flow_control_300k_per_sec->scheduler = eprosima::fastdds::rtps::FlowControllerSchedulerPolicy::FIFO;
flow_control_300k_per_sec->max_bytes_per_period = 300 * 1000; // 每秒限制300KB
flow_control_300k_per_sec->period_ms = 1000; // 周期为1000毫秒

// [OPTIONAL] Configure sender thread settings
flow_control_300k_per_sec->sender_thread = eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1};

// Register flow controller on participant
DomainParticipantQos participant_qos;
participant_qos.flow_controllers().push_back(flow_control_300k_per_sec);

// .... create participant and publisher

// Link writer to the registered flow controller.
// Note that ASYNCHRONOUS_PUBLISH_MODE must be used
DataWriterQos qos;
qos.publish_mode().kind = ASYNCHRONOUS_PUBLISH_MODE;
qos.publish_mode().flow_controller_name = flow_controller_name;

警告

指定流控制器的大小小于传输缓冲区大小可能导致消息永远不会被发送。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7532

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?