主要内容

管理ros2中的服务策略质量

服务质量(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)

图中包含一个轴对象。带有标题Message Timeline (Keep All)的axes对象包含18个类型为line, text的对象。

清晰的localizationSub

在一些情况下,被丢弃的消息不太重要,只有最新的信息才是真正重要的,建议使用较小的队列来提高性能,并确保使用最新的信息。这个示例显示了对第一个消息的更快处理,并且仍然获取所有消息。然而,根据您的资源,您可能会看到消息被删除。

创建一个表示用户界面显示的订阅者hFig =图;hAxesLidar2 =轴(“父”, hFig);标题(“消息时间线(保留最后1)”) scanDisplaySub = ros2subscriber(robotNode,“/激光扫描”...@(msg)示例HelpErrors2plotTimestamps(msg,haxeslidear2),...“历史”“keeplast”“深度”1);iMsg=1:numel(lidarScans)发送(lidarPub,lidarScans(iMsg))结束允许消息到达,然后删除订阅者和发布者暂停(3)

图中包含一个轴对象。带有标题Message Timeline (Keep Last 1)的axes对象包含40个类型为line, text的对象。

清晰的利达卜scanDisplaySub

可靠性

可靠性QoS策略决定是否保证消息的传递,有以下选项:

  • “可靠”-发布者持续向订阅者发送消息,直到订阅者确认收到消息为止。

  • “最佳努力”-发布者只发送一次消息,不确认订阅者是否收到消息。

可信赖的

一个“可靠”当必须处理所有数据时,连接非常有用,任何丢弃的消息都可能影响结果。这个例子中发布测程法消息并使用订阅者回调来绘制位置。因为“可靠”设置后,所有位置都将绘制在图中。

为里程计数据创建一个发布者odomPub = ros2publisher (robotNode,“/奥多姆”“nav_msgs /测程法”...“可靠性”“可靠”);为本地化创建订阅者hFig =图;hAxesReliable =轴(“父”, hFig);标题(“机器人位置(可靠连接)”)包含(“X”(m)) ylabel (“Y(m)”)odomPlotSub=ros2subscriber(机器人节点,“/奥多姆”...@(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“ok”),...“可靠性”“可靠”);%发送消息,模拟极快的传感器负载robotPoseLidarData.matodomDataiMsg=1:numel(odomData)发送(odomPub,odomData(iMsg))结束暂停(5)允许消息到达并绘制

图中包含一个轴对象。标题为Robot Position(可靠连接)的轴对象包含40个类型为line、text的对象。

%暂时阻止可靠订户对新消息作出反应odomPlotSub。NewMessageFcn = [];

尽力

一个“最佳努力”如果丢弃的消息是可接受的,则连接有助于避免影响性能。如果发布服务器设置为“可靠”,并将订阅者设置为“最佳努力”而发行商则认为这种联系是必须的“最佳努力”,并且不确认交付。与的连接“可靠”同一主题上的订阅者保证来自同一发布者。

这个例子使用了“最佳努力”订户,但由于对网络的影响较小,因此仍接收所有消息。

hFig=图形;hAxesBestEffort=轴(“父”, hFig);标题(“消息时间线(最大努力连接)”) odomTimingSub = ros2subscriber(robotNode,“/奥多姆”...@(msg)示例HelpErrors2plotTimestamps(msg,haxesbestefort),...“可靠性”“最佳努力”);iMsg=1:numel(odomData)发送(odomPub,odomData(iMsg))结束暂停(3)允许消息到达并绘制

图中包含一个Axis对象。带有标题消息时间线(尽力连接)的Axis对象包含40个line、text类型的对象。

兼容性

在设置可靠性时,确保兼容性是一个重要的考虑因素“可靠”选项集要求发行商满足该标准。任何“最佳努力”发布者不连接到“可靠”因为不能保证传递消息。在相反的情况下,a“可靠”出版商和“最佳努力”订阅服务器确实连接,但连接行为为“最佳努力”接收消息时没有确认。这个例子显示了“最佳努力”发送消息到“最佳努力”订户已设置。同样,由于对网络的影响很小“最佳努力”连接足以处理所有消息。

%重新激活可靠订户以显示未收到任何消息odomPlotSub。NewMessageFcn = @(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“* r”);从最努力的出版商那里发送信息bestEffortOdomPub=ros2publisher(机器人节点,“/奥多姆”“nav_msgs /测程法”...“可靠性”“最佳努力”);iMsg = 1:numel(odomData) send(bestEffortOdomPub,odomData(iMsg))结束%允许消息到达,然后删除里程计发布者和订阅者暂停(3)允许消息到达并绘制

图中包含一个轴对象。标题为Message Timeline (Best Effort Connection)的axes对象包含76个类型为line、text的对象。

清晰的奥多姆布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)允许消息到达并绘制

图中包含一个轴对象。标题为机器人位置(瞬态局部连接)的轴对象包含20个类型为line的对象。

兼容性

与可靠性类似,不兼容的耐久性设置可能会阻止发布者和订阅者之间的通信“瞬态本地”持久性要求出版商具有“瞬态本地”耐久性。如果出版商“挥发性”,没有建立联系“瞬态本地”订阅者。如果一个出版商“瞬态本地”和用户“易变的,则创建该连接,而不向订阅者发送持久消息。

重置绘图行为posePlotSub。NewMessageFcn = @(味精)情节(hAxesMoreMsgs、msg.x msg.y,“xr”);%从易失性发布服务器发送消息volatilePosePub = ros2publisher (robotNode,“/ bot_position”...“耐久性”“挥发性”);iMsg=1:numel(机器人位置)发送(volatilePosePub,机器人位置(iMsg))暂停(0.2)%考虑处理时间结束

任何一方均未收到任何消息“瞬态本地”订户。

删除pose发布者和订阅者清晰的posePub挥发油localUpdateSubposePlotSubrobotNode