服务质量(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)
清晰的localizationSub
在一些情况下,被丢弃的消息不太重要,只有最新的信息才是真正重要的,建议使用较小的队列来提高性能,并确保使用最新的信息。这个示例显示了对第一个消息的更快处理,并且仍然获取所有消息。然而,根据您的资源,您可能会看到消息被删除。
创建一个表示用户界面显示的订阅者hFig =图;hAxesLidar2 =轴(“父”, hFig);标题(“消息时间线(保留最后1)”) scanDisplaySub = ros2subscriber(robotNode,“/ laser_scan”,...@(msg)examplehelperros2plottimestamps(msg,haxeslidar2),...“历史”,“keeplast”,“深度”1);为IMSG = 1:NUMER(LIDARSCANS)发送(LIDARPUB,LIDARSCANS(IMSG))结束允许消息到达,然后删除订阅者和发布者暂停(3)
清晰的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.matodomData为IMSG = 1:NUMEL(ODOMDATA)发送(ODPUB,ODOMDATA(IMSG))结束暂停(5)允许消息到达并绘制
%暂时防止可靠的订户对新消息作出反应odomPlotSub。NewMessageFcn = [];
一个“最大努力”
如果删除的消息是可接受的,则连接可用于避免影响性能。如果发布者设置为“可靠”
,并将订阅者设置为“最大努力”
而发行商则认为这种联系是必须的“最大努力”
,并不确认交货。连接与“可靠”
同一主题上的订阅者保证来自同一发布者。
这个例子使用了“最大努力”
订阅者,但仍然收到所有消息由于对网络的影响低而导致的所有消息。
hFig =图;haxesbesteffort =轴(“父”, hFig);标题(“消息时间线(最大努力连接)”) odomTimingSub = ros2subscriber(robotNode,“/ odom”,...@(msg)examplehelperros2plottimestamps(msg,haxesbesteffort),...“可靠性”,“最大努力”);为IMSG = 1:NUMEL(ODOMDATA)发送(ODPUB,ODOMDATA(IMSG))结束暂停(3)允许消息到达并绘制
确保兼容性是设置可靠性时的重要考虑因素。具有a的订阅者“可靠”
选项集要求发行商满足该标准。任何“最大努力”
发布者不连接到“可靠”
因为不能保证传递消息。在相反的情况下,a“可靠”
出版商和“最大努力”
订阅服务器确实连接,但连接行为为“最大努力”
接收消息时没有确认。这个例子显示了“最大努力”
发送消息到“最大努力”
订户已设置。同样,由于对网络的影响很小“最大努力”
连接足以处理所有消息。
%重新激活可靠的订阅者显示没有收到的消息odomPlotSub。NewMessageFcn = @(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“* r”);从最努力的出版商那里发送信息Bestffortodompub = ROS2Publisher(RobotNode,“/ odom”,“nav_msgs /测程法”,...“可靠性”,“最大努力”);为iMsg = 1:numel(odomData) send(bestEffortOdomPub,odomData(iMsg))结束允许消息到达,然后删除里程表发布者和订阅者暂停(3)允许消息到达并绘制
清晰的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)允许消息到达并绘制
与可靠性类似,不兼容的耐用性设置可以防止发布者和订阅者之间的通信。订阅者“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