主要内容

管理ros2中的服务策略质量

服务质量(QoS)策略选项允许改变ros2网络内通信的行为。针对特定的通信对象(如发布者和订阅者)修改QoS策略,并更改在对象中处理消息以及在它们之间传输消息的方式。对于在两个通信对象之间传递的任何消息,它们的QoS策略必须是兼容的。

ROS 2中的可用服务质量是:

  • 历史-消息队列模式

  • 深度-消息队列大小

  • 可靠性- 发货保证

  • 耐用性- 持久性消息

有关更多信息,请参阅关于服务质量设置

历史和深度

历史深度QoS策略决定了通信对象的行为,当消息的速度比可以处理的速度更快时。这主要是对在仍在处理先前消息的同时接收消息的用户的担忧。消息放入处理队列中,该队列也会影响发布商。历史有选择:

  • “keeplast”—消息处理队列的最大大小等于深度价值。如果队列已满,则丢弃最旧的消息以为较新的邮件腾出空间。

  • “keepall”—消息处理队列尝试将接收到的所有消息保留在队列中,直到处理完毕。

在历史设置下,队列大小受硬件资源限制。如果用户在接收到新消息时调用回调,则队列大小也受到最大递归限制的限制。

在处理所有消息的情况下,增加深度价值或使用历史,“KeepAll”建议。

此示例显示如何设置发布者和订阅者以发送和接收点云消息。出版商深度是20,订户历史设置为“keepall”.订阅者使用回调来绘制每个消息的时间戳,以显示处理每个消息的时间。初始消息的处理时间较长,但所有消息最终都是从队列处理的。

%创建一个发布者来提供传感器数据robotNode = ros2node (“/ simple_robot”);lidarPub = ros2publisher (robotNode,“/ laser_scan”“sensor_msgs / PointCloud2”...“历史”“keeplast”“深度”, 20);%创建表示本地化的用户,需要所有扫描数据hFig =图;hAxesLidar =轴(“父”, hFig);标题(“消息时间表(保持全部)”localizationSub = ros2subscriber(robotNode,“/ laser_scan”...@(msg)examplehelperros2plottimestamps(msg,haxeslidar),...“历史”“keepall”);发送消息,模拟一个非常快的传感器负载robotPoseLidarData.matLidarscans.IMSG = 1:NUMER(LIDARSCANS)发送(LIDARPUB,LIDARSCANS(IMSG))结束允许消息到达,然后删除本地化订户暂停(3)

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

清晰的localizationSub

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

创建一个表示用户界面显示的订阅者hFig =图;hAxesLidar2 =轴(“父”, hFig);标题(“消息时间线(保留最后1)”) scanDisplaySub = ros2subscriber(robotNode,“/ laser_scan”...@(msg)examplehelperros2plottimestamps(msg,haxeslidar2),...“历史”“keeplast”“深度”1);IMSG = 1:NUMER(LIDARSCANS)发送(LIDARPUB,LIDARSCANS(IMSG))结束允许消息到达,然后删除订阅者和发布者暂停(3)

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

清晰的Lidarpub.scanDisplaySub

可靠性

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

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

  • “最大努力”- 该发布者只发送一次消息,并不确认订户收到它。

可靠的

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

为里程计数据创建一个发布者odomPub = ros2publisher (robotNode,“/ odom”“nav_msgs /测程法”...“可靠性”“可靠”);为本地化创建订阅者hFig =图;hAxesReliable =轴(“父”, hFig);标题(“机器人位置(可靠连接)”)包含(“X”(m)) ylabel (“y(m)”)odomplateub = ros2subscriber(RobotNode,“/ odom”...@(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“ok”),...“可靠性”“可靠”);发送消息,模拟一个非常快的传感器负载robotPoseLidarData.matodomDataIMSG = 1:NUMEL(ODOMDATA)发送(ODPUB,ODOMDATA(IMSG))结束暂停(5)允许消息到达并绘制

图中包含一个轴对象。具有标题机器人位置(可靠连接)的轴对象包含40个类型的类型,文本。

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

最大努力

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

这个例子使用了“最大努力”订阅者,但仍然收到所有消息由于对网络的影响低而导致的所有消息。

hFig =图;haxesbesteffort =轴(“父”, hFig);标题(“消息时间线(最大努力连接)”) odomTimingSub = ros2subscriber(robotNode,“/ odom”...@(msg)examplehelperros2plottimestamps(msg,haxesbesteffort),...“可靠性”“最大努力”);IMSG = 1:NUMEL(ODOMDATA)发送(ODPUB,ODOMDATA(IMSG))结束暂停(3)允许消息到达并绘制

图中包含一个轴对象。具有标题消息时间线(最佳努力连接)的轴对象包含40个类型的类型,文本。

兼容性

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

%重新激活可靠的订阅者显示没有收到的消息odomPlotSub。NewMessageFcn = @(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“* r”);从最努力的出版商那里发送信息Bestffortodompub = ROS2Publisher(RobotNode,“/ odom”“nav_msgs /测程法”...“可靠性”“最大努力”);iMsg = 1:numel(odomData) send(bestEffortOdomPub,odomData(iMsg))结束允许消息到达,然后删除里程表发布者和订阅者暂停(3)允许消息到达并绘制

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

清晰的Odpub.bestEffortOdomPubodomplateub.odomtimingsub

耐用性和深度

耐用性QoS策略控制延迟连接的消息持久性,有以下选项:

  • “transientlocal”- 对于发布者,已维护已发送的消息。如果订阅者加入网络“transientlocal”耐用性之后,发布者将持久的消息发送到订阅者。

  • “易挥发的”—发布者发送消息后不持久化消息,订阅者也不从发布者请求持久化消息。

由发布者保存的消息的数量“transientlocal”耐用性也由此控制深度输入。订阅者仅根据其个人申请最近的消息数量深度设置。发布者仍然可以存储更多信息,以便其他订阅者获得更多信息。例如,机器人位置的完整列表可能有助于可视化其路径,但定位算法可能只对最后已知的位置感兴趣。这个示例演示了如何使用定位订阅者显示当前位置,使用绘图订阅者显示队列中的所有位置。

发布机器人位置信息posePub = ros2publisher (robotNode,“/ bot_position”“geometry_msgs / Pose2D”...“耐久性”“transientlocal”“深度”, 100);负载robotPoseLidarData.matrobotPositions= 1:numel(robotPositions) send(posePub,robotPositions(iMsg)) pause(0.2)%考虑处理时间结束%创建一个只需要当前位置的本地化更新订户localUpdateSub = ros2subscriber (robotNode,“/ bot_position”@disp,...“耐久性”“transientlocal”“深度”1);暂停(1)允许消息到达
X:0.1047 Y:-2.3168θ:-8.5194
%创建一个可视化订阅者以显示机器人的位置hFig =图;haxesmoremsgs =轴(“父”, hFig);标题(“机器人位置(瞬态局部连接)”)包含(“X”(m)) ylabel (“y(m)”)举行posePlotSub = ros2subscriber (robotNode,“/ bot_position”...@(味精)情节(hAxesMoreMsgs、msg.x msg.y,“ok”),...“耐久性”“transientlocal”“深度”, 20);暂停(3)允许消息到达并绘制

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

兼容性

与可靠性类似,不兼容的耐用性设置可以防止发布者和订阅者之间的通信。订阅者“transientlocal”耐用性需要发行商“transientlocal”耐久性。如果一个出版商“易挥发的”,没有建立联系“transientlocal”订阅者。如果一个出版商“transientlocal”和用户“易挥发的,则创建该连接,而不向订阅者发送持久消息。

重置绘图行为posePlotSub。NewMessageFcn = @(味精)情节(hAxesMoreMsgs、msg.x msg.y,“XR”);%来自Volatile Publisher的消息volatilePosePub = ros2publisher (robotNode,“/ bot_position”...“耐久性”“易挥发的”);IMSG = 1:NUMEL(RobotPositions)发送(volatilePosEpub,RobotPositions(IMSG))暂停(0.2)%考虑处理时间结束

任何一个都没有收到消息“transientlocal”订户。

删除pose发布者和订阅者清晰的posePubvolatileposepub.localupdatesub.posePlotSubrobotNode