简介
ROS2 提供了提供了非常丰富的服务质量控制规则。利用这些规则你可以优化微调节点间的通信。 合适的服务质量设置可以使得ROS2像TCP协议一样可靠谱或者像UDP协议一样高效。亦或者在之间的无线可能的状态之中。 在ROS1中,我们只能支持TCP协议。ROS2则受益于底层的DDS传输可以灵活设置。对于在一个容易丢失数据的无线网环境下,可以使用一个高效的服务质量规则。对于在实时计算情况下可以使用高可靠性的服务质量规则。
一组服务质量规则组合在一起就构成了一个服务质量配置文件。 由于在不同的场景中设置合适的服务质量配置文件并不是一个简单的事情。ROS2预先提供了一些常用情景下的配置文件。(比如传感器数据) 同时用户也可以更改服务质量的具体配置。
服务质量文件可以专门用来配置发布者,订阅者,服务提供者和客户端。 一个服务质量文件可以独立应用于不同的上面所说的各种实体。但是如果它们之间使用了不同的服务质量文件那么有可能它们之间会无法建立连接。
服务质量规则
一个基本服务质量规则配置文件包含下面的几个规则:
- 历史 (History)
- Keep last: 只存储最多N个样本,通过队列深度设置
- Keep all: 存储所有样本,由底层中间件的资源大小限制
- 深度 (Depth)
- 队列的大小:只有在和Kepp last一起时才会起作用
- 可靠性 (Reliability)
- 最高效率: 尝试发送数据,但是在网络不好的情况下有可能丢包
- 高可靠性: 保证数据发送成功,但是可能会重试发送多次
- 耐久力 (Durability)
- 本地缓存(Transient local): 发送者会为还未加入的节点保存未接收的数据
- 自动挥发(Volatile): 不会特意保存数据
对于每个规则,都还有一个系统默认选项。这些值使用了来自底层中间件的参数。默认值可以通过DDS工具进行设置(比如 xml配置文件) DDS本身有着更多的规则可以配置。 由于和ROS1中的功能很相似,所以以上的规则被暴露出来。在未来很有可能会在ROS2中暴露更多的配置规则。
和ROS1的对比
历史和深度规则组合起来和ROS1中的队列大小是一样的。
ROS2中的可靠性规则和ROS1中也有对应。ROS1的UDPROS(只在roscpp里面)对应于高效模式。TCPROS(ROS1的默认模式)对应于高可靠性模式。 特别注意即使是ROS2里面的高可靠性模式也是用UDP去实现的。在合适的场景下还可以用来进行广播。
持久性规则和depth=1的规则组合起来和ROS1中的"latching" subscribers很类似。
QoS 配置文件
配置文件使得开发者可以专注于开发自己的应用程序,不用关心每个服务质量设置。 服务质量配置文件包含了一系列的规则,保证程序能够在特定的使用场景下工作。
目前已经定义的服务质量配置有
默认的发布者和订阅者的服务质量配置
为了能够从ROS1过渡到ROS2,保证网络的相似性是很必要的。 在默认条件下,发布者和订阅者在ROS2中都是配置为可靠模式,自动挥发,和存储最后。
服务
和发布者和订阅者一样服务也是可靠的 对于服务来说使用挥发耐久力是必须的,因为否则当服务提供者可能会受到已经过时的请求。 尽管这样可以保证客户端不会受到多个应答。服务端却无法保证不受到已经过时的请求。
传感器数据
对于传感器数据,在大多数情况下在及时的受到数据更加重要。而保证收到所有的数据并没有这么重要。 也就是开发者希望能尽快的收到最新的数据,尽管可能会有数据丢失。 由于这个原因传感器数据被设置成了高效模式和一个较低队列深度。
参数
ROS2中的参数设置是基于服务的。所以他们有相似的配置。 不同的是参数会有一个更大的队列来保证请求不会丢失。比如当参数客户端无法连接到参数服务器的时候。
系统默认
使用系统默认的规则
点击这里可以查看上面的配置使用到的特殊规则。 根据社区的反馈上面的一些规则还需要进一步的调整。
尽管ROS2提供了一些服务质量配置,但是直接配置DDS所提供的规则可以更大程度的发挥出DDS程序的性能。
服务质量兼容性
注意: 这一部分只说明了发布者和订阅者的信息,但是这些内容对于服务提供者和服务客户端同样也是适用的。
服务配置文件可以独立配置发布者和订阅者。 只有在发布者和订阅者的服务质量规则是相兼容的时候,它们才能相互建立连接。 服务质量配置文件的兼容性判定是基于“请求对比提供者”模型。只有在请求方,也就是订阅者的规则没有发布者更加严格的条件下才能建立连接。 两者中的更为严格的那个规则会被用于它们之间的这个连接。
在ROS2中暴露的服务质量规则能够影响到连接的是可靠性和耐久性。 下面的表格表示了不同的配置规则和结果:、
服务质量耐久度兼容性
Publisher | Subscriber | Connection | Result |
---|---|---|---|
Volatile | Volatile | Yes | Volatile |
Volatile | Transient local | No | - |
Transient local | Volatile | Yes | Volatile |
Transient local | Transient local | Yes | Transient local |
服务质量可靠性兼容性
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 |
为了保证能够建立一个连接。所有可能影响到兼容性的规则都要注意保证兼容。 也就是即使一个发布者和订阅者有相互兼容的服务质量可靠性规则,但是如果它们的服务质量耐久性规则不兼容,也是无法建立连接的。反之亦然。