ROS 2中管理的服务质量策略
服务质量(QoS)政策选项允许改变通信内ROS 2网络的行为。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”,…@(味精)exampleHelperROS2PlotTimestamps(味精、hAxesLidar),…“历史”,“keepall”);%发送消息,模拟一个非常快速的传感器负载robotPoseLidarData.matlidarScans为iMsg = 1:元素个数(lidarScans)发送(lidarPub, lidarScans (iMsg))结束%允许消息到达,然后移除本地化用户暂停(3)清晰localizationSub
在消息的情况下被删除不重要,真正重要的,只有最新的信息,一个较小的队列建议提高性能,确保使用最新的信息。这个例子展示了快速处理第一个消息,仍然被所有的消息。然而,根据您的资源你可以看到消息得到下降。
%创建一个用户代表用户界面显示hFig =图;hAxesLidar2 =轴(“父”,hFig);标题(“消息时间表(保持去年1)”)
scanDisplaySub = ros2subscriber (robotNode,“/ laser_scan”,…@(味精)exampleHelperROS2PlotTimestamps(味精、hAxesLidar2),…“历史”,“keeplast”,“深度”1);为iMsg = 1:元素个数(lidarScans)发送(lidarPub, lidarScans (iMsg))结束%允许消息到达,然后删除用户和出版商暂停(3)清晰lidarPubscanDisplaySub
可靠性
的可靠性QoS策略决定保证消息的传递,并选择:
“可靠”
——出版商不断将消息发送到订阅者直到用户确认收到的消息。“besteffort”
出版商只发送一次消息,不确认用户接收到它。
可靠的
一个“可靠”
连接是有用的,当所有的数据必须被处理,和任何下降的消息可能会影响结果。这个例子中发布测程法
消息和使用用户回调图位置。因为“可靠”
设置,所有的位置都是在图绘制。
%为测程法数据创建一个出版商odomPub = ros2publisher (robotNode,“/”奥多姆,“nav_msgs /测程法”,…“可靠性”,“可靠”);%为本地化创建一个用户hFig =图;hAxesReliable =轴(“父”,hFig);标题(“机器人的位置(可靠连接)”)包含(“X”(m))ylabel (“Y (m)”)
odomPlotSub = ros2subscriber (robotNode,“/”奥多姆,…@(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“ok”),…“可靠性”,“可靠”);%发送消息,模拟一个非常快速的传感器负载robotPoseLidarData.matodomData为iMsg = 1:元素个数(odomData)发送(odomPub, odomData (iMsg))结束暂停(5)%允许消息到达和策划%暂时阻止可靠用户对新消息做出反应odomPlotSub。NewMessageFcn = [];
最大的努力
一个“besteffort”
连接是有用的,以避免影响性能下降是可以接受的消息。如果设置了一个出版商“可靠”
和一个用户设置为“besteffort”
只,出版商将连接要求“besteffort”
,不确认交付。联系“可靠”
用户在同一主题保证交付相同的出版商。
这个示例使用“besteffort”
订户,但仍然收到所有消息由于低对网络的影响。
hFig =图;hAxesBestEffort =轴(“父”,hFig);标题(“消息时间表(尽最大努力连接)”)
odomTimingSub = ros2subscriber (robotNode,“/”奥多姆,…@(味精)exampleHelperROS2PlotTimestamps(味精、hAxesBestEffort),…“可靠性”,“besteffort”);为iMsg = 1:元素个数(odomData)发送(odomPub, odomData (iMsg))结束暂停(3)%允许消息到达和策划
兼容性
确保兼容性设置可靠性时是一个重要的考虑因素。一个用户“可靠”
选项组需要一个出版商,符合这个标准。任何“besteffort”
出版商不连接“可靠”
用户因为不能保证交付的消息。在相反的情况下,“可靠”
出版商和“besteffort”
用户连接,但是连接行为“besteffort”
接收消息时没有确认。这个例子显示了一个“besteffort”
出版商发送消息到“besteffort”
用户已经设置。再次,由于低对网络的影响,“besteffort”
连接足以处理所有的消息。
%恢复可靠的用户没有接收到的消息odomPlotSub。NewMessageFcn = @(味精)exampleHelperROS2PlotOdom (hAxesReliable味精,“* r”);%发送消息从一个最优的出版商bestEffortOdomPub = ros2publisher (robotNode,“/”奥多姆,“nav_msgs /测程法”,…“可靠性”,“besteffort”);为iMsg = 1:元素个数(odomData)发送(bestEffortOdomPub, odomData (iMsg))结束%允许消息到达,然后移除量距发布者和订阅者暂停(3)%允许消息到达和策划清晰的odomPubbestEffortOdomPubodomPlotSubodomTimingSub
耐用性和深度
的耐用性QoS策略控制消息的持久性late-joining连接,并选择:
“transientlocal”
——对于一个出版商,消息已发送。如果一个用户连接网络“transientlocal”
耐用性之后,那么出版商将持久化消息发送给订阅者。“不稳定”
——出版商不存在消息发送后,从出版商和用户不请求持久化消息。
坚持通过出版商的消息的数量“transientlocal”
耐久性也控制的深度
输入。用户唯一的请求基于个人最近的消息的数量深度
设置。出版商仍然可以为其他用户获得更多储存更多的信息。例如,机器人的完整列表的位置可能是有用的可视化的路径,但定位算法只能对最后的位置感兴趣。这个例子说明了通过使用一个本地化用户显示当前位置和策划用户显示队列中的所有位置。
%发布机器人位置信息posePub = ros2publisher (robotNode,“/ bot_position”,“geometry_msgs / Pose2D”,…“耐久性”,“transientlocal”,“深度”,100);负载robotPoseLidarData.matrobotPositions为iMsg = 1:元素个数(robotPositions)发送(posePub, robotPositions (iMsg))暂停(0.2)%允许处理时间结束%创建本地化更新用户只需要当前位置localUpdateSub = ros2subscriber (robotNode,“/ bot_position”@disp,…“耐久性”,“transientlocal”,“深度”1);暂停(1)%允许消息到达
θy x: 0.1047: -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”);%从动荡的出版商发送消息volatilePosePub = ros2publisher (robotNode,“/ bot_position”,…“耐久性”,“不稳定”);为iMsg = 1:元素个数(robotPositions)发送(volatilePosePub, robotPositions (iMsg))暂停(0.2)%允许处理时间结束
没有收到消息“transientlocal”
订户。
%去除造成发布者和订阅者清晰的posePubvolatilePosePublocalUpdateSubposePlotSubrobotNode