QoS服务质量
定义在:qos_profile.proto
Qos 基本上负责了 DDS 的所有配置,无论是心跳,消息可靠性,流量控制,还是安全配置,甚至包括通道配置,全是通过 Qos 来实现的。
- 在ROS1中,节点间的通信是基于TCP的。因为TCP的失败重传机制,在一些网络不稳定的场景,通信会出现延时严重的问题。这大大限制了ROS1的使用场景。
- 在ROS2中,采用DDS作为通信中间件。ROS2的DDS中间件是可以配置成不同厂家提供的。这些不同的DDS各自有不同的侧重点,可根据项目的不同需求来选择。
- 通过正确的服务质量策略配置,ROS2可以像TCP一样可靠,也可以像UDP那样尽力而为。在不稳定的网络环境下,“尽力而为”策略将更合适。在实时性要求高的场景下,设定数据的有效性将是必须的。
- 将服务质量(QoS)调整到特定的工作负载和环境对于获得最佳性能至关重要。
我们可以为发布器、订阅器、提供服务的服务器和客户端配置QoS。
因为每个节点的Qos是可以单独配置的,所以如果配置的Qos互相不兼容,节点间的通信将无法建立。
QosHistoryPolicy:历史数据
- HISTORY_KEEP_LAST:
- 最保留最新的N个数据
- N可通过Depth的Queue size配置。
- 默认配置
- HISTORY_KEEP_ALL:缓存所有的数据,但是受限于DDS底层的资源限制。
QosReliabilityPolicy:配置通道的可靠性
- RELIABILITY_RELIABLE
- 确保数据被传送到,可能会重传多次,导致数据延时严重
- 会等待 remote 的到达确认,如果数据丢失会重传;
- 如果当网络发生错误, DataReader可能无法收到DataWriter的样本数据时,会对样本数据进行重发,保证DataReader能够收到数据;
- RELIABILITY_BEST_EFFORT
- 尽力传送数据,但是网络不稳定可能会丢弃一些数据;适合视频流等数据
- 如果当网络发生错误, DataWriter不会重新发送丢失的样本数据,这样,无法保证DataReader能够收到数据;
通常,配置为使用BEST_EFFORT可靠性时,DDS具有最低的延迟和最高的吞吐量。 使用RELIABLE QoS设置时,重要的是要确保资源限制(resource limits)足够支持预期的发布速率。 当由于订阅者用尽资源限制(resource limits)而丢弃已发布的消息时,发布者必须重新传输它们,从而导致更高的延迟。
QosDurabilityPolicy:配置新加入节点对已发送数据的接受规则
- DURABILITY_TRANSIENT_LOCAL:保留已发送数据,当有新 DataReader 加入,会把内存中的历史数据全部发给它;
- DURABILITY_VOLATILE:不保留已发送数据;