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: 在这个时间段内,发布器需发布数据,不然会被系统认为是停止工作了。该参数与