Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9413507
  • 博文数量: 1748
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20070
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1748)

文章存档

2024年(24)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2020-11-25 17:12:25

https://www.cnblogs.com/dzyBK/p/13961877.html

 参考:ROS2API 

1.概述

         ROS2提供了一套非常丰富的服务质量(Quality of Service, QoS)策略用于调整节点之间的通信。众所周知,在TCPUDP之间存在着无数的折中设置,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的比较

         ROS2HistoryDepth结合起来类似于ROS1的队列大小功能。

         ROS2ReliabilityBest-effort类似于ROS1UDPROS(roscpp包含此功能),取Reliable类似于ROS1TCPROS

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

4.QoS配置文件

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

         (1)默认(qos_profiles.hrmw_qos_profile_system_default)

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

         (2)主题(qos_profiles.hrmw_qos_profile_default)

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

         (3)服务(qos_profiles.hrmw_qos_profile_services_default)

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

         (4)参数(qos_profiles.hrmw_qos_profile_parameters)

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

         (5)参数事件(qos_profiles.hrmw_qos_profile_parameter_events)

与参数Profile相同。

         (6)传感器数据(qos_profiles.hrmw_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策略是DurabilityReliability。下面的展示了不同策略配置的兼容性结果:

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不兼容,那么也不能建立连接,反之亦然

阅读(2367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~