服务质量(QoS)策略选项允许改变ros2网络内通信的行为。针对特定的通信对象(如发布者和订阅者)修改QoS策略,并更改在对象中处理消息以及在它们之间传输消息的方式。对于在两个通信对象之间传递的任何消息,它们的QoS策略必须是兼容的。
ROS 2中可用的服务质量政策包括:
历史
-消息队列模式
深度
-消息队列大小
可靠性
-消息的传递保证
耐久性
-消息的持久性
有关详细信息,请参阅关于服务质量设置.
的历史和深度QoS策略确定消息可用速度快于处理速度时通信对象的行为。这主要是在处理前一条消息的同时接收消息的订阅者所关心的问题。消息被放入处理队列,这也会影响发布者。历史记录具有选择:
“keeplast”
—消息处理队列的最大大小等于深度
值。如果队列已满,则删除最旧的消息以为新消息腾出空间。
“keepall”
—消息处理队列尝试将接收到的所有消息保留在队列中,直到处理完毕。
在任一历史记录设置下,队列大小受硬件资源限制。如果订户在收到新消息时调用回调,则队列大小也受最大递归限制的限制。
在处理所有消息非常重要的情况下,增加深度
价值或使用历史,“基帕尔”
建议。
此示例显示如何设置发布者和订阅者以发送和接收点云消息。出版商深度
为20,并且订户历史记录设置为“keepall”
.订阅者使用回调来绘制每个消息的时间戳,以显示处理每个消息的时间。初始消息的处理时间较长,但所有消息最终都是从队列处理的。
%创建一个发布者来提供传感器数据robotNode=ros2node(“/simple\u robot”);lidarPub = ros2publisher (robotNode,“/激光扫描”,“sensor_msgs / PointCloud2”,...“历史”,“keeplast”,“深度”, 20);%创建表示本地化的订阅服务器,需要所有扫描数据hFig =图;hAxesLidar =轴(“父”, hFig);标题(“邮件时间线(保留全部)”)localizationSub=ros2subscriber(机器人节点,“/激光扫描”,...@(msg)示例HelpErrors2PlotTimestaps(msg,haxeslider),...“历史”,“keepall”);%发送消息,模拟极快的传感器负载robotPoseLidarData.mat利达斯卡纳人为iMsg=1:numel(lidarScans)发送(lidarPub,lidarScans(iMsg))结束允许消息到达,然后删除本地化订户暂停(3)
清晰的localizationSub
在一些情况下,被丢弃的消息不太重要,只有最新的信息才是真正重要的,建议使用较小的队列来提高性能,并确保使用最新的信息。这个示例显示了对第一个消息的更快处理,并且仍然获取所有消息。然而,根据您的资源,您可能会看到消息被删除。
创建一个表示用户界面显示的订阅者hFig =图;hAxesLidar2 =轴(“父”, hFig);标题(“消息时间线(保留最后1)”) scanDisplaySub = ros2subscriber(robotNode,“/激光扫描”,...@(msg)示例HelpErrors2plotTimestamps(msg,haxeslidear2),...“历史”,“keeplast”,“深度”1);为iMsg=1:numel(lidarScans)发送(lidarPub,lidarScans(iMsg))结束允许消息到达,然后删除订阅者和发布者暂停(3)
清晰的利达卜scanDisplaySub
的可靠性QoS策略决定是否保证消息的传递,有以下选项:
“可靠”
-发布者持续向订阅者发送消息,直到订阅者确认收到消息为止。
“最佳努力”
-发布者只发送一次消息,不确认订阅者是否收到消息。
一个“可靠”
当必须处理所有数据时,连接非常有用,任何丢弃的消息都可能影响结果。这个例子中发布测程法
消息并使用订阅者回调来绘制位置。因为“可靠”
设置后,所有位置都将绘制在图中。
为里程计数据创建一个发布者odomPub = ros2publisher (robotNode,“/奥多姆”,“nav_msgs /测程法”,...“可靠性”,“可靠”);为本地化创建订阅者hFig =图;hAxesReliable =轴(“父”, hFig);标题(“机器人位置(可靠连接)”)包含(“X”(m)) ylabel (“Y(m)”)odomPlotSub=ros2subscriber(机器人节点,“/奥多姆”,...@(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“ok”),...“可靠性”,“可靠”);%发送消息,模拟极快的传感器负载robotPoseLidarData.matodomData为iMsg=1:numel(odomData)发送(odomPub,odomData(iMsg))结束暂停(5)允许消息到达并绘制
%暂时阻止可靠订户对新消息作出反应odomPlotSub。NewMessageFcn = [];
一个“最佳努力”
如果丢弃的消息是可接受的,则连接有助于避免影响性能。如果发布服务器设置为“可靠”
,并将订阅者设置为“最佳努力”
而发行商则认为这种联系是必须的“最佳努力”
,并且不确认交付。与的连接“可靠”
同一主题上的订阅者保证来自同一发布者。
这个例子使用了“最佳努力”
订户,但由于对网络的影响较小,因此仍接收所有消息。
hFig=图形;hAxesBestEffort=轴(“父”, hFig);标题(“消息时间线(最大努力连接)”) odomTimingSub = ros2subscriber(robotNode,“/奥多姆”,...@(msg)示例HelpErrors2plotTimestamps(msg,haxesbestefort),...“可靠性”,“最佳努力”);为iMsg=1:numel(odomData)发送(odomPub,odomData(iMsg))结束暂停(3)允许消息到达并绘制
在设置可靠性时,确保兼容性是一个重要的考虑因素“可靠”
选项集要求发行商满足该标准。任何“最佳努力”
发布者不连接到“可靠”
因为不能保证传递消息。在相反的情况下,a“可靠”
出版商和“最佳努力”
订阅服务器确实连接,但连接行为为“最佳努力”
接收消息时没有确认。这个例子显示了“最佳努力”
发送消息到“最佳努力”
订户已设置。同样,由于对网络的影响很小“最佳努力”
连接足以处理所有消息。
%重新激活可靠订户以显示未收到任何消息odomPlotSub。NewMessageFcn = @(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“* r”);从最努力的出版商那里发送信息bestEffortOdomPub=ros2publisher(机器人节点,“/奥多姆”,“nav_msgs /测程法”,...“可靠性”,“最佳努力”);为iMsg = 1:numel(odomData) send(bestEffortOdomPub,odomData(iMsg))结束%允许消息到达,然后删除里程计发布者和订阅者暂停(3)允许消息到达并绘制
清晰的奥多姆布bestEffortOdomPub奥多姆普洛茨ub奥多姆蒂明Sub
的耐用性QoS策略控制延迟连接的消息持久性,有以下选项:
“瞬态本地”
—对于发布者,对已经发送的消息进行维护。如果用户将网络加入“瞬态本地”
之后,发布者将持久化消息发送给订阅服务器。
“挥发性”
—发布者发送消息后不持久化消息,订阅者也不从发布者请求持久化消息。
由发布者保存的消息的数量“瞬态本地”
耐久性也由深度
输入订阅者仅根据其个人信息请求最近的邮件数深度
设置。发布者仍然可以存储更多信息,以便其他订阅者获得更多信息。例如,机器人位置的完整列表可能有助于可视化其路径,但定位算法可能只对最后已知的位置感兴趣。这个示例演示了如何使用定位订阅者显示当前位置,使用绘图订阅者显示队列中的所有位置。
发布机器人位置信息posePub = ros2publisher (robotNode,“/ bot_position”,“geometry_msgs / Pose2D”,...“耐久性”,“瞬态本地”,“深度”, 100);负载robotPoseLidarData.matrobotPositions为= 1:numel(robotPositions) send(posePub,robotPositions(iMsg)) pause(0.2)%考虑处理时间结束%创建仅需要当前位置的本地化更新订阅服务器localUpdateSub = ros2subscriber (robotNode,“/ bot_position”@disp,...“耐久性”,“瞬态本地”,“深度”1);暂停(1)允许消息到达
x:0.1047Y:-2.3168θ:-8.5194
%创建可视化订阅服务器以显示机器人的位置hFig=图形;hAxesMoreMsgs=轴(“父”, hFig);标题(“机器人位置(瞬态局部连接)”)包含(“X”(m)) ylabel (“Y(m)”)举行在posePlotSub = ros2subscriber (robotNode,“/ bot_position”,...@(味精)情节(hAxesMoreMsgs、msg.x msg.y,“ok”),...“耐久性”,“瞬态本地”,“深度”,20);暂停(3)允许消息到达并绘制
与可靠性类似,不兼容的耐久性设置可能会阻止发布者和订阅者之间的通信“瞬态本地”
持久性要求出版商具有“瞬态本地”
耐久性。如果出版商“挥发性”
,没有建立联系“瞬态本地”
订阅者。如果一个出版商“瞬态本地”
和用户“易变的
,则创建该连接,而不向订阅者发送持久消息。
重置绘图行为posePlotSub。NewMessageFcn = @(味精)情节(hAxesMoreMsgs、msg.x msg.y,“xr”);%从易失性发布服务器发送消息volatilePosePub = ros2publisher (robotNode,“/ bot_position”,...“耐久性”,“挥发性”);为iMsg=1:numel(机器人位置)发送(volatilePosePub,机器人位置(iMsg))暂停(0.2)%考虑处理时间结束
任何一方均未收到任何消息“瞬态本地”
订户。
删除pose发布者和订阅者清晰的posePub挥发油localUpdateSubposePlotSubrobotNode