主要内容

管理ROS 2中的服务质量政策

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

ROS 2现行的服务质素政策如下:

  • 历史-消息队列模式

  • 深度-消息队列大小

  • 可靠性-消息的传递保证

  • 耐用性-消息的持久性

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

历史和深度

这个历史深度当消息的可用速度快于处理速度时,QoS策略决定通信对象的行为。对于在接收消息时仍在处理前一条消息的订阅者来说,这主要是一个问题。消息被放置到处理队列中,这也会影响发布者。历史有以下选项:

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

  • “基帕尔”-消息处理队列尝试保留队列中接收到的所有消息,直到处理完毕。

在这两种历史设置下,队列大小受硬件资源限制。如果订阅者在收到新消息时调用回调,则队列大小也受最大递归限制。

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

本示例演示如何设置用于发送和接收点云消息的发布者和订阅者。出版商深度是20并且用户历史记录设置为“基帕尔”。订户使用回拨来绘制每条消息的时间戳,以显示处理每条消息的时间。处理初始消息需要更长的时间,但所有消息最终都会从队列中处理。

%创建发布服务器以提供传感器数据robotNode = ros2node (“/ simple_robot”);lidarPub = ros2publisher (robotNode,“/ laser_scan”,“sensor_msgs / PointCloud2”,...“历史”,“keeplast”,“深度”, 20);%创建一个表示本地化的订阅者,需要所有扫描数据hFig=图形;hAxesLidar=轴(“父”,hFig);头衔(“消息时间线(保留全部)”localizationSub = ros2subscriber(robotNode,“/ laser_scan”,...@(味精)exampleHelperROS2PlotTimestamps(味精、hAxesLidar),...“历史”,“基帕尔”);发送消息,模拟一个非常快的传感器负载robotPoseLidarData.matlidarScans对于iMsg = 1:numel(lidarScans)发送(lidarPub,lidarScans(iMsg))终止%允许消息到达,然后删除本地化订阅服务器暂停(3)

图中包含一个Axis对象。带有标题消息Timeline(保留全部)的Axis对象包含18个line、text类型的对象。

清晰的本地化子系统

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

创建一个表示用户界面显示的订阅者hFig =图;hAxesLidar2 =轴(“父”,hFig);头衔(“消息时间线(保留最后1)”) scanDisplaySub = ros2subscriber(robotNode,“/ laser_scan”,...@(味精)exampleHelperROS2PlotTimestamps(味精、hAxesLidar2),...“历史”,“keeplast”,“深度”1);对于iMsg = 1:numel(lidarScans)发送(lidarPub,lidarScans(iMsg))终止%允许邮件到达,然后删除订阅服务器和发布服务器暂停(3)

图中包含一个Axis对象。带有标题消息Timeline(Keep Last 1)的Axis对象包含40个line、text类型的对象。

清晰的lidarPub斯堪的纳维亚潜艇

可靠性

这个可靠性QoS策略确定是否保证消息的传递,并具有以下选项:

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

  • “besteffort”—发布者只发送一次消息,并且不确认订阅者接收了消息。

可靠的

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

%为里程计数据创建发布服务器odomPub=ros2publisher(机器人节点,“/”奥多姆,“导航/里程计”,...“可靠性”,“可靠的”);%为本地化创建订阅服务器hFig=图形;HAXESREABLE=轴(“父”,hFig);头衔(“机器人位置(可靠连接)”)包含(“X(m)”) ylabel (“Y (m)”) odomPlotSub = ros2subscriber(robotNode,“/”奥多姆,...@(msg)示例HelpErrors2plotodom(msg,haxesreable,“好的”),...“可靠性”,“可靠的”);发送消息,模拟一个非常快的传感器负载robotPoseLidarData.mat奥多姆达塔对于iMsg = 1:numel(odomData) send(odomPub,odomData(iMsg))终止暂停(5)%允许消息到达并打印

图中包含一个轴对象。标题为“机器人位置(可靠连接)”的轴对象包含40个类型为line、text的对象。

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

最大的努力

A.“besteffort”如果删除的消息是可接受的,则连接有助于避免对性能的影响。如果出版商设置为“可靠的”,并将订阅者设置为“besteffort”,发布者将该连接视为仅需要“besteffort”,不确认发货。联系“可靠的”同一主题上的订阅者保证来自同一发布者。

此示例使用“besteffort”订阅服务器,但仍然接收所有消息,因为对网络的影响很小。

hFig =图;hAxesBestEffort =轴(“父”,hFig);头衔(“消息时间线(尽力而为的连接)”)odomTimingSub=ROS2订户(机器人节点,“/”奥多姆,...@(味精)exampleHelperROS2PlotTimestamps(味精、hAxesBestEffort),...“可靠性”,“besteffort”);对于iMsg = 1:numel(odomData) send(odomPub,odomData(iMsg))终止暂停(3)%允许消息到达并打印

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

兼容性

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

重新激活可靠订阅者以显示未收到邮件odomPlotSub.NewMessageFcn=@(msg)示例HelpErrors2plotodom(msg,haxesreable,“*r”);从最努力的出版商那里发送信息bestEffortOdomPub = ros2publisher (robotNode,“/”奥多姆,“导航/里程计”,...“可靠性”,“besteffort”);对于iMsg=1:numel(odomData)发送(bestEffortOdomPub,odomData(iMsg))终止允许消息到达,然后删除里程表发布者和订阅者暂停(3)%允许消息到达并打印

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

清晰的odomPub百事通odomPlotSubodomTimingSub

耐用性和深度

这个耐久性QoS策略控制延迟加入连接的消息的持久性,并具有以下选项:

  • “transientlocal”-对于发布者,将保留已发送的消息。如果订阅者使用“transientlocal”持久性之后,发布者将持久消息发送给订阅者。

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

由发布者保存的消息的数量“transientlocal”耐久性也是由深度输入。订阅者仅根据其个人请求最近的消息数量深度设置。发布者仍然可以为其他订阅者存储更多消息以获取更多信息。例如,机器人位置的完整列表可能有助于可视化其路径,但定位算法可能只对最后一个已知位置感兴趣。此示例说明了使用定位订阅者显示当前位置以及打印订阅服务器,以显示队列中的所有位置。

%发布机器人位置信息posePub = ros2publisher (robotNode,“/ bot_position”,“geometry_msgs / Pose2D”,...“耐久性”,“transientlocal”,“深度”,100);负载robotPoseLidarData.mat机器人位置对于= 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 theta: -8.5194
%创建一个可视化订阅者来显示机器人的位置hFig =图;hAxesMoreMsgs =轴(“父”,hFig);头衔(“机器人位置(瞬态局部连接)”)包含(“X(m)”) ylabel (“Y (m)”)举行posePlotSub=ros2subscriber(机器人节点,“/ bot_position”,...@(msg)绘图(hAxesMoreMsgs、msg.x、msg.y、,“好的”),...“耐久性”,“transientlocal”,“深度”, 20);暂停(3)%允许消息到达并打印

图中包含一个Axis对象。标题为Robot Position(瞬态本地连接)的Axis对象包含20个line类型的对象。

兼容性

与可靠性类似,不兼容的持久性设置也会阻止发布者和订阅者之间的通信。一个用户“transientlocal”持久性需要发行商配合“transientlocal”耐久性。如果一个出版商“不稳定”,没有与建立连接“transientlocal”订阅者。如果发布者是“transientlocal”和用户“不稳定,则创建该连接,而不向订阅服务器发送持久消息。

%重置打印行为posePlotSub.NewMessageFcn=@(msg)绘图(hAxesMoreMsgs,msg.x,msg.y,“xr”);%从不稳定的发布者发送消息volatilePosePub=ros2publisher(机器人节点,“/ bot_position”,...“耐久性”,“不稳定”);对于iMsg = 1:numel(robotPositions) send(volleposepub,robotPositions(iMsg)) pause(0.2)%考虑处理时间终止

两者都没有收到任何消息“transientlocal”订户。

%删除发布者和订阅者清晰的波塞波volatilePosePublocalUpdateSubposePlotSub机器人节点