QoS(Quality of Service)
总的来说,QoS是一个强大的工具,它提供了一种高效、灵活的方式来处理分布式系统中的数据通信和共享问题。
在ROS1中,节点间的通信是基于TCP的。因为TCP的失败重传机制,在一些网络不稳定的场景,通信会出现延时严重的问题。这大大限制了ROS1的使用场景。
在ROS2中,采用DDS作为通信中间件。ROS2的DDS中间件是可以配置成不同厂家提供的。这些不同的DDS各自有不同的侧重点,可根据项目的不同需求来选择。ROS2 Galactic和Rolling默认采用rmw_cyclonedds_cpp。rmw_cyclonedds_cpp在进程间和多主机间通信的场景下,主要是使用UDP做为通信媒介。
每一个node都可以单独配置一个QoS,但是要注意不同配置之间是否兼容。
常用的配置:
-
History
-
Keep last: 只缓存最新的
N个数据,N可通过Depth的Queue size配置。 -
Keep all: 缓存所有的数据,但是受限于DDS底层的资源限制。
-
Depth
- Queue size: 当
History设置为Keep last时有效 -
Reliability
-
Best effort: 尽力传送数据,但是网络不稳定可能会丢弃一些数据。
-
Reliable: 确保数据被传送到,可能会重传多次,导致数据延时严重。
-
-
Durability
- Transient local: 为后订阅话题的订阅者保留数据,比如
map_server发布map的Qos策略。 - Volatile: 不为后订阅话题的订阅者保留数据,比如订阅传感器数据的节点。
- Transient local: 为后订阅话题的订阅者保留数据,比如
-
Deadline
- Duration: 设置数据被发布的间隔时间。比如:像
cmd_vel等控制命令就希望是固定间隔时间下发的。
- Duration: 设置数据被发布的间隔时间。比如:像
-
Lifespan
- Duration: 设置数据从发布到被接收的最大间隔时间。超过该时间将被认为是过时的数据,直接丢弃了。这对于传感器数据来说是很重要的。因为过时的传感器数据毫无用处。
-
Liveliness
- Automatic: 一个节点可能有多个发布器。只要有一个发布器发布了数据,系统将认为该节点的所有发布器在接下来的
lease duration时间段内是活跃的。 - Manual by topic: 如果手动确认发布器仍然是活跃的,系统将认为该发布器在接下来的
lease duration时间段内是活跃的。
- Automatic: 一个节点可能有多个发布器。只要有一个发布器发布了数据,系统将认为该节点的所有发布器在接下来的
-
Lease Duration
- Duration: 在这个时间段内,发布器需发布数据,不然会被系统认为是停止工作了。该参数与
Liveliness配合使用。
- Duration: 在这个时间段内,发布器需发布数据,不然会被系统认为是停止工作了。该参数与
浙公网安备 33010602011771号