这是我对ROS官方ROS2教程的翻译,纯个人理解,对于文中的关键词汇或不确定的语句标注了原文,如有错误或翻译问题还请指出。
文章翻译并未按照逐句逐词的方式进行,而是加入了我的一些主观思考,不过原则上还是会以原文思路为主。
原文:https://index.ros.org/doc/ros2/Concepts/About-Quality-of-Service-Settings/
有关于服务质量的设置
概述
ROS2提供了一套非常丰富的**服务质量(Quality of Service, QoS)**策略,可以用于在节点之间调整通信。正确的设置服务质量策略之后,ROS2可以做到像TCP协议一样可靠,或者是像UDP一样高效,也可以选取两者之间的非常多种可能的状态。ROS1仅使用TCP支持通信,不同于ROS1,ROS2受益于在具有有损无线网络中的基础DDS传输的灵活性,高效策略将更加合适,然而当ROS2处于实时计算系统中时,必须依赖正确性服务质量配置(right Quality of Service profile)来确保实时性(meet deadlines)。
一系列的QoS策略组成了一个QoS配置文件(profile)。考虑到为一个特定的场景选择正确QoS策略的复杂性,ROS2为一些通用的使用场景提供了一系列预定义的QoS配置文件,比如传感器数据。同时,用户也可以灵活的控制QoS策略中的特殊配置文件。
QoS配置文件特定于不同的发布者、订阅者、服务器或者客户端。一个QoS配置文件可以独立应用于上述的每一个实例,但是如果使用了不同的配置文件,很有可能导致这些实例无法建立连接。
QoS策略
现在,基础的QoS配置文件包括如下的一些策略设置:
- 历史记录(History)
- 保留近期记录:仅仅保存最大N个样本数据,通过配置队列深度选项来指定最大数据限制。
- 保留所有记录:存储所有的样本数据,但受限于底层中间件的配置资源限制。
- 深度(Depth)
- 队列深度:仅仅当历史记录选择为"保留最近记录"时,配合指定最大数据限制。
- 可靠性(Reliability)
- 尽力的(Best effort):尝试传输样本,但如果网络不稳定可能会丢失数据。
- 可靠的(Reliable):保证样本的可靠传输,可能会尝试多次重传。
- 持续性(Durability)
- 局部瞬态(Transient local):发布者负责对晚到连接(late-joining)的订阅者保留样本数据。
- 易变态(Volatile):不尝试保留样本数据。
对于每一个策略,都会有一个对应的系统默认值,可以使用通过DDS供应商工具定义的底层中间件默认值来确定,比如DDS供应商工具的XML配置文件。DDS可以配置大量的策略。由于它们和ROS1的特性很相似,所以基本都已经暴露了这些策略;而且很有可能在将来越来越多的策略会暴露给ROS2。
与ROS1的比较
ROS2中历史记录和深度的策略结合起来类似于ROS1中队列大小的功能。
ROS2中可靠性的策略类似于使用UDPROS(仅roscpp中含有)实现最尽力(best effort)的效果,或者使用TCPROS(ROS1默认)来实现最可靠的效果。然而,ROS2中的可靠性策略是通过UDP来实现的,如果需要的话可以允许多播。
持续性策略与深度为1的深度结合起来的功能类似于latching订阅者。
QoS配置文件
配置文件帮助开发者专注于他们的应用,而不需要担心每一个可能的QoS设置。一个QoS配置文件有一系列的策略组成,可以有效的与特定的用例结合起来使用。
当前的默认配置文件有:
-
默认的发布者和订阅者QoS配置文件
为了保证ROS1和ROS2之间的过渡,我们希望能设计一套相似的网络行为。默认情况下,发布者和订阅者依赖于ROS2,具有易变态的持续性(volatile durability)配置以及保留近期记录的历史记录配置。
-
服务
与发布者和订阅者一样,服务是可靠的。而且易变态的持续性对于服务来说特别重要,这是因为重新启动提供服务的服务端可能会接收到过期的请求。虽然客户端被保护避免接收多次响应,但服务端并没有被保护,以免于遭受接收到过期请求的副作用。
-
传感器数据
传感器数据对大多数用例来说,及时的接收读取值比保证接收所有数据值要更为重要。即使有着丢失数据的风险,开发者仍希望在捕获到数据之后能够最快的更新样本数据。因为这样的原因,传感器数据配置项使用可靠性为尽力的,并且使用最小的队列深度。
-
参数
ROS2中的参数依赖于服务,而且和服务的配置文件很相似。不同之处自傲与参数使用一个非常大的队列深度,从而保证请求不会丢失,比如说,客户端参数是不可能大于服务端参数长度的(the parameter client is unable to reach the parameter service server)。
-
系统默认
系统默认配置文件可以用于所有的策略。
点击这里可以查看使用上述配置文件的特殊策略。这些配置文件的设置可能会根据社区的反馈意见做进一步的调整。
虽然ROS2提供了一些通用的QoS配置文件,DDS中定义的策略也允许ROS用户利用现有的DDS文档中提供的大量资料来为其特定的用例配置QoS配置文件。
QoS兼容性
**注意:**这一部分涉及到发布者和订阅者,但是内容同样适合于描述服务端和客户端。
QoS配置文件可能会独立的为发布者和订阅者进行配置。只有当发布者和订阅者两端的QoS配置文件是兼容的情况下,一次连接才会成功建立。QoS配置文件的兼容性被基于"请求与提供"(Request vs Offerer)模型来决定。只有在所请求订阅者的策略不如发布者的策略更加严格的情况下,一次连接才会成功建立。两个策略中较为不严格的策略被用于连接策略。
暴露给ROS2的影响兼容性的QoS策略是持续性和可靠性策略。下表展示了不同策略配置的兼容性结果:
持续性配置文件的QoS兼容性:
发布者 | 订阅者 | 是否能够连接 | 结果 |
---|---|---|---|
易变的 | 易变的 | 可以连接 | 易变的 |
易变的 | 局部瞬态的 | 不可以连接 | |
局部瞬态的 | 易变的 | 可以连接 | 易变的 |
局部瞬态的 | 局部瞬态的 | 可以连接 | 局部瞬态的 |
可靠性配置文件的QoS兼容性:
发布者 | 订阅者 | 是否能够连接 | 结果 |
---|---|---|---|
尽力的 | 尽力的 | 可以连接 | 尽力的 |
尽力的 | 可靠的 | 不可以连接 | |
可靠的 | 尽力的 | 可以连接 | 尽力的 |
可靠的 | 可靠的 | 可以连接 | 可靠的 |
为了成功建立连接,影响兼容性的所有的配置文件必须都是兼容的。这意味着即使一个发布者订阅者对已经在可靠性QoS配置文件中具有兼容性,但如果他们在持续性QoS配置文件中不兼容,那么连接依然无法建立,反之同理。