ROS Quality of Service settings

  • QoS策略[^1]
    • 同ROS 1比较
  • QoS配置文件
  • QoS兼容性
    • ROS1的QoS体系
  • QoS事件
    • 发布者相关事件
    • 订阅者相关事件
  • 参考

QoS(Quality of Service)是在通信中非常常见的一个概念,用来定义通信的质量等级,以适配不同的场景。
对通信来说,最理想的情况,当然是所有的消息都无损地实时地被传输到接收端。但这带来的代价几乎是不可接受的,因此我们通过不同的服务质量等级QoS定义来使得这个代价可被接受同时保证不对业务产生影响。

例如:

  1. 一段文字,如果有缺失,则会大幅影响意思
    “我不想去动物园”,传输中丢失了“不”字,则意思就完全相反了。因此这种场景下,我们需要定义相对高的QoS等级确保信息不被丢失。
  2. 视频传输通常可以忍受部分的信息丢失
    一段视频,以24帧/秒的速率传输,一般来说,丢失了个别帧,不对整段视频的意义带来影响,这种场景下,我们的QoS等级就可以相对较低,容忍一定程度的信息丢失。

上面的例子中,只用了简单的高低来描述QoS,当然,实际场景要复杂得多。
因此,ROS 2提供了丰富的服务质量(QoS)策略,允许我们对节点之间的通信进行调优。在QoS的不同策略下,ROS 2可以像TCP一样可靠,或者像UDP一样提供尽力服务,当然也可以调整为两者之间任意可能的服务质量状态。
相较于ROS 1仅支持TCP,DDS为ROS 2提供了传输的灵活性:在有损的无线网络环境中,“尽力服务”策略将会更合适;在实时计算系统中,合适的服务质量配置则可以满足通信对实时时限的要求。

一组QoS策略结合形成一个QoS配置文件(profile)。ROS 2为常见场景提供了预设的QoS策略配置。当然我们也可以控制QoS配置文件。
QoS配置文件可以根据发布者、订阅者、服务的服务端和客户端加以指定。一个QoS配置文件可以被独立应用于上述实体的每个实例。当然,如果使用不同的配置文件,可能会导致不兼容,从而无法传递消息。

QoS策略1

QoS基本配置包括了一下策略的设置:

现在包含以下策略:

  • 历史History

    • 保留最后Keep last:只存储N个数据,可通过队列深度选项变更相关配置。
    • 保留所有Keep all:存储所有数据,根据底层中间件的配置进行资源限制。
  • 深度Depth
    • 队列深度Queue size:仅当“历史”策略为“保持最后”时生效。
  • 可靠性Reliability
    • 尽力服务Best effort:尝试发送数据,但若网络不够健壮,则可能会丢失。
    • 可靠Reliable:通过多次重试保证数据送达。
  • 耐用性Durability
    • 暂存本地Transient local:发布者将负责对数据进行持久化,以便“迟加入”的订阅者可获取数据。
    • 挥发性Volatile:不尝试保存数据。
  • 截止时间Deadline
    • 持续时间Duration:将连续消息发布到主题时的预期最大时间。
  • 寿命Lifespan
    • 持续时间Duration:在发布和接收消息之间的最长时间,在此时间内,消息不会被认为是过期的(过期的消息会被安静地丢弃,永远不会再被接收到)。
  • 活跃程度Liveliness
    • 自动Automatic:若任意节点发布了一条消息,系统将认为所有节点在接下来的租赁周期(Lease Duration)中都是活跃的。
    • 按主题手动Manual by topic:若任意节点发布了一条消息,系统仅将认为节点在接下来的租赁周期(Lease Duration)中是活跃的(通过调用发布的API)。
  • 租赁周期Lease Duration
    • 持续时间Duration:系统认为发布者失活的最大周期时间(失活将会导致失败)。

对没有指定持续时间的策略,通常使用底层中间件的默认值。
对于每一个有持续时间的策略,都存在一个默认的持续时间,底层中间件通常将其解释为无限长的持续时间。

同ROS 1比较

在ROS 2中,“历史”和“深度”策略联合使用,基本等效于ROS 1的queue size。
“可靠性”策略在ROS 1中等效于UDPROS(尽力服务)和TCPROS(可靠)。其中UDPROS仅在roscpp中存在,TCPROS是ROS 1的默认值。注意ROS 2的可靠性策略是基于UDP实现的,它仍允许组播的存在。
“耐用性”策略中的“暂存本地”,加上任意的深度,提供了类似发布者“锁存”的功能。
ROS 2中的其余策略都同ROS 1中的策略没有相似之处。

QoS配置文件

配置文件允许开发者集中精力于他们的应用本身,而无需关注到每个QoS的设置。一个QoS配置文件为一个特定的用户场景定义了一系列策略。
预定义的QoS配置文件如下:

  • 默认:适用于发布订阅
    为了可以更简单地从ROS1迁移至ROS2,需要采用同ROS1相似的网络配置。默认情况下,ROS2中的发布订阅使用“保留最后”的策略,且队深为10;可靠性设置为“可靠”;耐用性设置为“挥发性”;活跃程度设置为“系统默认”。截止时间、寿命、租赁周期也均设为“默认”。
  • 服务
    服务也设置为与发布订阅相同的可靠性。对服务来说,使用挥发性的耐用性设置尤为重要,否则服务端将可能会收到过期的请求。此时,客户端可以避免收到多个响应,而服务端则会收到过期请求。
  • 传感数据
    大部分情况下,我们希望能够实时地接收到传感器的数据,而不会过多地关注于所有的数据都被送达。对开发者来说,我们需要的是最新的采样数据,可以接受部分数据被丢弃。因此,传感器的配置文件将使用尽力的可靠性和一个较小的队列深度。
  • 参数
    ROS2的参数是基于服务的,因此使用同服务相同的配置文件。不同点仅在于参数会使用更大的队列深度,以便在参数的请求方无法获取服务时尽可能地保留相关请求不被丢弃。
  • 系统默认
    对所有的策略使用RMW实现的默认设置。不同的RMW实现可能有不同的默认值。

可以在此链接中找到上述的配置文件。此配置文件中的设定将根据社区的反馈进行调整。

QoS兼容性

注意本节涉及的发布者和订阅者的内容,也覆盖了服务中的服务端和客户端。

我们可以为发布者和订阅者独立地设置QoS配置文件,只有在具有相兼容的的配置文件时,二者才能正确连接。

QoS配置文件基于“请求/提供”模型来确定器兼容性。订阅者请求一个它可接受的最低质量的QoS配置文件,发布者提供一个它可提供的最高质量的QoS配置文件。只有当请求的QoS配置文件的每个策略都松于提供的QoS配置文件的对应策略时,连接才会被建立。发布者和订阅者之间的兼容性不受其它发布者和订阅者的存在影响,这意味着,即使多个订阅者请求的配置文件不同,它们也可以同时连接到同一个发布者。

不同策略的配置兼容性如下表所示:

reliability QoS策略兼容性

发布者 订阅者 兼容与否?
Best effort Best effort Yes
Best effort Reliable No
Reliable Best effort Yes
Reliable Reliable Yes

durability QoS策略兼容性

发布者 订阅者 兼容与否?
Volatile Volatile Yes
Volatile Transient local No
Transient local Volatile Yes
Transient local Transient local Yes

deadline QoS策略兼容性
假设x与y为可用的任意持续时间值

发布者 订阅者 兼容与否?
Default Default Yes
Default x No
x Default Yes
x x Yes
x y (y>x) Yes
x y (y<x) No

liveliness QoS策略兼容性

发布者 订阅者 兼容与否?
Automatic Automatic Yes
Automatic Manual by topic No
Manual by topic Automatic Yes
Manual by topic Manual by topic Yes

lease duration QoS策略兼容性

假设x与y为可用的任意持续时间值

发布者 订阅者 兼容与否?
Default Default Yes
Default x No
x Default Yes
x x Yes
x y (y>x) Yes
x y (y<x) No

只有所有影响兼容性策略的策略都为兼容时,方可建立连接。反之,即使请求的和提供的某一QoS配置文件不具有兼容性时,则他们仍不会建立连接。
当无法建立连接时,发布者和订阅者之间不会传递任何消息。有一些机制可以检测这种情况,可以在后续的小节中进行讨论。

ROS1的QoS体系

在ROS1中的QoS体系更为宽松,任何在相同主题上具有相同消息类型的发布者和订阅者之间都能通信,并不考虑相互间的服务质量。

QoS事件

在某些QoS策略下,系统将提供相关的事件,我们可以对发布者和订阅者提供回调函数。回调函数由前述的QoS事件触发,我们可以在回调函数中书写相应的处理,典型的例如如何处理接收到的主题消息。

发布者相关事件

  • 发布者过期Offered deadline missed
    发布者未能在deadline QoS策略期望的时间内发布相应的消息。

  • 失活Liveliness lost
    发布者未能在周期内声明其活跃性。

  • QoS设置不兼容Offered incompatible QoS
    发布者的QoS配置不能满足订阅者请求的相关配置要求,导致二者无法连接。

订阅者相关事件

  • 订阅者过期Requested deadline missed
    订阅者未能在deadline QoS策略期望的时间内收到相应的消息。

  • 活跃性变化Liveliness changed
    订阅者发现任意发布者未能在周期内声明其活跃性。

  • QoS设置不兼容Requested incompatible QoS
    发布者的QoS配置不能满足订阅者请求的相关配置要求,导致二者无法连接。

参考


  1. About Quality of Service settings ↩︎

ROS2学习(六).ROS概念 - 服务质量设置相关推荐

  1. ROS2学习(七).ROS概念 - ROS客户端库(Ros Client Library)

    ROS客户端库 概述 支持的客户端库 通用功能:RCL 语言特有功能 同ROS 1的比较 小结 参考 概述 客户端库是开发者用以开发ROS代码时使用的API,使用客户端库,开发者将接触到ROS的相关概 ...

  2. 项目管理工具project软件学习(六) - 设置里程碑、任务备注

    1. 里程碑设置三种方法: 1.1 工期设置为0,默认就是里程碑 1.2 双击任务名称,弹出框选择高级,下面标记为里程碑的选项勾选 1.3 添加里程碑的列 右击,插入列 然后选择里程碑,在里程碑列,选 ...

  3. ROS2学习笔记之turtlesim(小乌龟)介绍

    Turtlesim Turtlesim 是一个用于学习 ROS 2 的轻量级模拟器,因为其有个乌龟,所以也经常被称为小乌龟. turtlesim package 默认并不在 ROS 系统中,需要额外安 ...

  4. 鸿蒙Hi3861学习六-Huawei LiteOS-M(软件定时器)

    一.简介 软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器.当经过设定的Tick时钟计数值后,会触发用户定义的回调函数.定时精度与系统Tick时钟周期有关. 硬件定时器受硬件的限制,数量上 ...

  5. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  6. C#多线程学习(六) 互斥对象

    C#多线程学习(六) 互斥对象 原文链接:http://kb.cnblogs.com/page/42533/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个 ...

  7. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  8. PyTorch框架学习六——图像预处理transforms(二)

    PyTorch框架学习六--图像预处理transforms(二) (续)二.transforms的具体方法 4.图像变换 (1)尺寸变换:transforms.Resize() (2)标准化:tran ...

  9. JMS学习六(ActiveMQ消息传送模型)

    JMS学习六(ActiveMQ消息传送模型) ActiveMQ 支持两种截然不同的消息传送模型:PTP(即点对点模型)和Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和Pub/ ...

最新文章

  1. python关闭浏览器、未过期的session_session.cookie_lifetime = 0时,为什么会话在浏览器关闭时不会过期?...
  2. git只合并某一个分支的某个commit
  3. feign和ajax,SpringCloud-feign 声明式服务调用
  4. 架构、框架和设计模式关系
  5. 为什么要使用数据连接池
  6. 内存对齐 | 原来字段顺序还能影响结构体占用的内存空间
  7. Lua mysql insert 并发数_高并发 Nginx+Lua OpenResty系列(6)——Lua开发库Mysql
  8. BZOJ 1013 球形空间产生器
  9. mybatis源码学习方式
  10. [js开源组件开发]js文本框计数组件
  11. java script和java有什么区别_Java中final finally finalize的区别(其实没什么联系 不过面试官喜欢这么问)
  12. JAVA黑马刘意学习笔记
  13. c语言对excel进行分类,六ABC分类法的Excel实现.doc
  14. VS中如何添加报表控件
  15. 个人带领团队做过的事
  16. 保研面试问题(英文)
  17. 告别2016迎接2017,分享一些第三方插件
  18. 初中计算机实践研究计划,初中信息技术教研工作计划
  19. TSI系统测量参数之:轴向振动
  20. 网站长尾关键词怎么布局 提升搜索排名

热门文章

  1. SQLmap的下载和安装,以及其参数大全和使用教程(值得收藏)
  2. 文件服务器访问权限分配,设置文件服务器的访问权限
  3. terminated 线程_Java【多线程系列】JUC线程池—2. 原理(二)、Callable和Future
  4. python正则匹配日期2019-03-11_都2019年了,正则表达式为啥还是这么难?这里的Python学习教程教你搞定!...
  5. springboot扫描组件_springboot多模块包扫描问题的解决方法
  6. jvm虚拟机_JVM虚拟机五连问,能过并不是只靠运气
  7. Android开发之Android Studio 3.6新特性之获取控件id的高级方式ViewBinding
  8. Android修改原生AlertDialog按钮的颜色大小边距位置以及标题居中等
  9. Android开发之adb命令安装apk的问题
  10. 三点弯曲弹性模量怎么计算公式_怎么计算弯管的尺寸和弯管的张力