QoS学习日志

参考:ROS2API 及 https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings

1.概述

ROS2提供了一套非常丰富的服务质量(Quality of Service, QoS)策略用于调整节点之间的通信。众所周知,在TCP与UDP之间存在着无数的折中设置,QoS既可以设置成像TCP一样可靠(reliable),也可以设置成像UDP一样高效(best effort)。不同于ROS1,它主要支持TCP通信,ROS2底层采用的是DDS(Data Distribution Service)传输,当DDS工作在损无线网络(lossy wireless network)中时更有利于best-effect策略,当DDS工作在实时计算系统中时通过设置适合的QoS策略来满足实时性。

一套QoS策略形成了一个QoS Profile。考虑到为特定的场景选择正确QoS策略较为复杂,ROS2提供了一套预定义的QoS Profiles,用于常见场景(如传感器数据)。同时,也提供了特定的Profiles给使用者设置QoS策略。

发布器、订阅器、服务端和客户端可以指定Profile,且它们的每个实例都可以单独指定Profile,但不兼容的Profiles可能导致无法通信。

2.QoS策略

当前,QoS Profile提供了对以下QoS策略的设置:

(1)历史记录(History)

保留近期记录(Keep last):缓存最多N条记录,可通过队列长度选项来配置。

保留所有记录(Keep all):缓存所有记录,但受限于底层中间件可配置的最大资源。

(2)深度(Depth)

队列深度(Size of the queue):只能与Keep last配合使用。

(3)可靠性(Reliability)

尽力的(Best effort):尝试传输数据但不保证成功传输(当网络不稳定时可能丢失数据)。

可靠的(Reliable):反复重传以保证数据成功传输。

(4)持续性(Durability)

局部瞬态(Transient local):发布器为晚连接(late-joining)的订阅器保留数据。

易变态(Volatile):不保留任何数据。

以上每个策略都有系统默认值。这个默认值就是底层中间件的默认值,由DDS供应商工具(如XML配置文件)定义。DDS本身提供了许多可配置的策略。这些策略与ROS1的特征相似,所以在ROS1中是可见的。之后可能会有更多的策略在ROS2中可见。

3.ROS1的比较

ROS2的History和Depth结合起来类似于ROS1的队列大小功能。

ROS2的Reliability取Best-effort类似于ROS1的UDPROS(仅roscpp包含此功能),取Reliable类似于ROS1的TCPROS。

ROS2的Durability和队列深度为1的Depth结合起来类似于ROS1中的latching订阅器。

4.QoS配置文件

Profile使开发者专注于他们的应用,而无需担心QoS的各种设置。一个QoS Profile包含一套策略,可以高效地配合特定的用例工作。当前定义了一些默认的Profiles,以下对它们进行介绍。

(1)默认(qos_profiles.h:rmw_qos_profile_system_default)

所有的策略设置为RMW的默认值。不同的RMW默认值可能存在差异。

(2)主题(qos_profiles.h:rmw_qos_profile_default)

为了保证ROS1和ROS2之间的过渡,有必要设计一套相似的网络行为。于是,设置发布器和订阅器的默认Profile为(Keep last, 10, Reliable, Volatile)。

(3)服务(qos_profiles.h:rmw_qos_profile_services_default)

与发布器和订阅者器一样,服务首先得reliable。其次,Volatile对服务也是必须的,否则会收到过时的请求。尽管客户端已被设计避免接收多次响应,但服务端没有设计如何处理过时的请求产生的副作用。服务Profile的详细取值为(Keep last, 10, Reliable, Volatile)。

(4)参数(qos_profiles.h:rmw_qos_profile_parameters)

参数是基于服务的,所以有相似的Profile。不同之处参数具有更大的队列深度,以避免丢失请求(例如当在参数客户端不能访问参数服务端时)。参数Profile的详细取值为(Keep last, 1000, Reliable, Volatile)。

(5)参数事件(qos_profiles.h:rmw_qos_profile_parameter_events)

与参数Profile相同。

(6)传感器数据(qos_profiles.h:rmw_qos_profile_sensor_data)

在大多数用例中,需要实时读取传感器的数据而无需读取所有数据。也就是说,开发者希望尽快地获取最新数据,为此可以丢失一些数据。因此,传感器需要Best effort和更小的队列深度,其Profile详细取值为(Keep last, 5, Best effort, Volatile)。

以上Profiles更多信息可参见~\ros2\include\rmw\qos_profiles.h。这些Profiles的取值会根据社区的反馈意见进一步的调整

虽然ROS2提供了一些常用的QoS Profiles,但DDS中定义的策略允许ROS用户基于现有的DDS文档提供的大量的信息来为其特定的用例设置QoS Profile。

5.QoS兼容性

注意:以下内容以发布器和订阅器举例阐述,但同样适合于服务端和客户端。

发布器和订阅器可以分别指定自己的OoS Profiles。只有当它们的Profiles兼容时,两者才能建立连接。Profile的兼容性基于"请求与提供"(Request vs Offerer)模型,只有当订阅器的策略没有发布器的严格时,连接才能建立,且建立的连接使用严格度低的策略。

ROS2中存在兼容性问题的OoS策略是Durability和Reliability。下面的展示了不同策略配置的兼容性结果:

Durability的兼容性配置:

Publisher

Subscriber

Connection

Result

Volatile

Volatile

Yes

Volatile

Volatile

Transient local

No

 

Transient local

Volatile

Yes

Volatile

Transient local

Transient local

Yes

Transient local

Reliability的兼容性配置:

Publisher

Subscriber

Connection

Result

Best effort

Best effort

Yes

Best effort

Best effort

Reliable

No

 

Reliable

Best effort

Yes

Best effort

Reliable

Reliable

Yes

Reliable

为建立连接,所有影响兼容性的策略都必须设置成可以兼容的。换句话说,假设如发布器和订阅器的Reliability是兼容的,但Durability不兼容,那么也不能建立连接,反之亦然。

ROS2学习日志:QoS学习日志的更多相关文章

  1. 学习Coding-iOS开源项目日志(五)

    继续,接着前面第四篇<学习Coding-iOS开源项目日志(四)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目 ...

  2. logging 日志模块学习

    logging 日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪,所以还是灰常重要滴,下面我就来从入门到放弃的系统学习一下日志既可以在屏幕上显示,又可以在文件中体现. ...

  3. 学习Coding-iOS开源项目日志(一)

    前言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目.本篇开始会陆续更新本人对github上开源的一个很不错的项目的一点点学习积累.也就是,探究着别人写的源码,我学到了 ...

  4. 学习Coding-iOS开源项目日志(三)

    继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...

  5. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  6. Linux学习笔记(21) Linux日志管理

    1. 简介 (1) 日志服务 在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式 ...

  7. Andorid:日常学习笔记(3)——掌握日志工具的使用

    Andorid:日常学习笔记(3)——掌握日志工具的使用 使用Android的日志工具Log 方法: Android中的日志工具类为Log,这个类提供了如下方法来供我们打印日志: 使用方法: Log. ...

  8. ELK日志分析 学习笔记

    (贴一篇之前工作期间整理的elk学习笔记) ELK官网 https://www.elastic.co   ELK日志分析系统 学习笔记 概念:ELK = elasticsearch + logstas ...

  9. MySQl Study学习之--MySQl二进制日志管理

    MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log)   a.它包括的内容及作用例如以下:     包括了全部更新了数据或者已经潜在更新了数据(比方没 ...

随机推荐

  1. TCP-IP ---三次握手和四次挥手来啦

  2. S7-300 符号IO域的组态 HMI变量指针化的方法以及应用,在一个IO域显示多个温度值的办法

    应用工业场景 例如需要测试很多个节点的温度值的时候,需要监控的位置很多,如果HMI的画面很小, 可以使用符号IO域和变量的间接寻址 符号IO域接近于VB中的combo 控件 实现上图的界面 : 上图界 ...

  3. HTML有2种路径的写法:绝对路径和相对路径

    HTML有2种路径的写法:绝对路径和相对路径 2016年11月30日 17:51:20 Bolon0708 阅读数 21775   版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...

  4. 关于AJAX跨域和原生AJAX CORS跨域解决

    项目需求要在别人的域名下调用自己的接口,因为浏览器的同源策略是不允许不同域名下之间的信息交换,那就意味着要跨域处理 参考博客 :https://blog.csdn.net/Ulricalin/arti ...

  5. 《C++ Primer(中文版)(第5版)》斯坦利·李普曼 (Stanley B. Lippman) (作者), 约瑟·拉乔伊 (Josee Lajoie) (作者), 芭芭拉·默 (Barbara E. Moo) (作者) azw3

    内容简介: 这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委 ...

  6. SSH框架系列:Spring配置多个数据源

    分类: [java]2013-12-09 16:59 1247人阅读 评论(0) 收藏 举报 1.问题的引入 对于普通的SSH框架而言,一般配置一个数据源,一个SessionFactory,一个事务管 ...

  7. [NOIP 2017 day1]逛公园

    题目描述 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要 ...

  8. Django 利用第三方平台实现用户注册

    前言: 登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家.我们这次使用的第三方短息平台是云通信,当然你可以用其 ...

  9. gpg加密和解密

    linux:gpg加密和解密 1 创建密钥 2 查看私钥 3 导出公钥 4 导出私钥 5 导入秘钥 5.1 公钥 6 公钥加密 7 私钥解密 创建密钥 gpg --gen-key 你要求输入一下内容, ...

  10. sftp 多用户安装与配置

    sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH 的一部分,由于这种传输方式使用了加密/解 ...