RVO算法

 

简介

在介绍VO,RVO之前,需要先介绍路径规划。

对Agent进行路径规划,实际上要完成的任务就是让Agent从点A无碰撞地移动到点B。而路径规划的过程是层次化的,其基本框架大致如下:

  • High level: dijkstra等算法。
  • Low level: VO, RVO, ORCA等底层避障算法。

很容易可以跟我们的日常生活进行类比,比如说我们要从学校的教学楼走到宿舍楼,那么以上框架对应的就是:

  • High level: 通过dijkstra算法,得到路径为: 教学楼→饭堂→体育馆→图书馆→宿舍楼。
  • Low level: 通过底层避障算法如VO,RVO,ORCA等底层避障算法,保证我们走的每一段路(e.g. 教学楼→饭堂),都不会跟别的同学发生碰撞。

VO和RVO就是经典的底层避障算法。其中VO是最经典的,RVO则在VO的基础上进行了一些改进,解决了VO抖动的问题。

VO(Velocity Obstacle)

一句话总结VO的思路:只要在未来有可能会发生碰撞的速度,都排除在外。

为方便描述,以下都假设是在平面内,圆形物体之间的避障。

VO的直观理解

问题描述

问题描述

Q: 假设B静止,那么A取什么速度能够保证一定不会跟B发生碰撞呢?

A: 一种很粗暴的方法,就是把A化作质点,选择跟B¯B¯(扩展后的B)不相交的速度方向。以后只要在每个周期里面,都选择不在VO的速度,就能够保证不会碰撞。

解决办法

解决办法

以上就是VO的直观理解,需要注意的是:

  • VO是指速度方向与B¯B¯相交的部分,即会发生碰撞的部分(图中灰色斜线部分)。
  • VO是抱着宁杀错,不放过的思想,把所有未来有可能会发生碰撞的速度都放弃了。
  • 实际上假如仅要求一定时间内不发生碰撞的话,有更多的速度可供选择,比如说上图中的(v′AvA′)。

VO的图示理解

有了直观理解之后就可以用更加严谨一点的数学语言图示VO了。

首先将直观理解中口语化的表达转换成对应的数学语言表示。

  • 物体A(B):以pApA为圆心,rArA为半径的点集AA
  • 假设B静止:A相对于B的速度,即相对速度vA−vBvA−vB
  • 把A化作质点:求集合BB与集合−A−A的Minkowski sum,即闵氏和,B⊕−AB⊕−A,其中

于是就有了下图的左半部分(浅色三角形):

RVO算法
 

 

而为了直接求vAvA绝对速度的VO而不是vA−vBvA−vB相对速度的VO,将相对速度下的VO延vBvB方向平移,就有了图中右半部分(深色三角形)。

VO的数学定义

理解了图示,数学定义就很好理解了。

  • 首先给出射线的定义,用λ(p,v)λ(p,v)表示以点pp为顶点,方向为vv的射线。
    λ(p,v)={p+tv|t≥0}λ(p,v)={p+tv|t≥0}
  • 接下来就是VO的定义了,用VOAB(vB)VOBA(vB)表示速度为vBvB的BB对AA的VO
    VOAB(vB)={vA|λ(pA,vA−vB)∩B⊕−A≠∅}VOBA(vB)={vA|λ(pA,vA−vB)∩B⊕−A≠∅}

RVO(Reciprocal Velocity Obstacle)

VO给出了很漂亮的避障条件,所以后面很多底层的避障算法都是基于VO的,而RVO就是其中之一。

RVO主要解决了VO的抖动问题

  • 抖动现象:如下左图所示,即AA会在vAvA与v′AvA′之间来回切换
  • RVO的效果:如下右图所示,保持vAvA,不会抖动

RVO算法

 

证明VO抖动现象存在

首先论文给出了VO的三条性质

  • Symmetry:vAvA的AA会撞上vBvB的BB,则vBvB的BB也会撞上vAvA的AA
    vA∈VOAB(vB)⇔vB∈VOBA(vA)vA∈VOBA(vB)⇔vB∈VOAB(vA)
  • Translation Invariance:vAvA的AA会撞上vBvB的BB,则vA+uvA+u的AA会撞上vB+uvB+u的BB
    vA∈VOAB(vB)⇔vA+u∈VOAB(vB+u)vA∈VOBA(vB)⇔vA+u∈VOBA(vB+u)
  • Convexity:在VOAB(vB)VOBA(vB)的左(右)侧的两个速度之间的任意速度,也在VOAB(vB)VOBA(vB)的左(右)侧。VO左(右)侧如下图所示:
    vA∉→VOAB(vB)∧v′A∉→VOAB(vB)⇒(1−α)vA+αv′A∉→VOAB(vB), for 0≤α≤1vA∉→VOBA(vB)∧vA′∉→VOBA(vB)⇒(1−α)vA+αvA′∉→VOBA(vB), for 0≤α≤1

VO左(右)侧示意

VO左(右)侧示意

接下来是抖动现象存在的证明

  1. 假设初始状态为会发生碰撞:vA∈VOAB(vB), vB∈VOBA(vA)vA∈VOBA(vB), vB∈VOAB(vA)
  2. 由于在对方的VO内,所以各自选择新的速度以防止碰撞:v′A∉VOAB(vB), v′B∉VOBA(vA)vA′∉VOBA(vB), vB′∉VOAB(vA)
  3. 由前面VO的Symmetry性质可知:此时,原来的速度不在当前速度的VO内:vB∉VOBA(v′A), vA∉VOAB(v′B)vB∉VOAB(vA′), vA∉VOBA(vB′)
  4. 假设我们更加prefer原来的速度,则又会回到原来的vAvA与vBvB
  5. 于是在1→4之间循环,即发生抖动

RVO的Insight

首先回想一下为什么会发生抖动:

双方为了避障,都偏移了当前速度太多,导致更新速度后,原来速度不再会发生碰撞。

那么我们有没有办法减少对当前速度的偏移,同时又能保证避障呢,RVO的回答是肯定的:

  • 缩小VO的大小,新的”VO”就叫做RVO
    • p.s. 我个人对Reciprocal的理解是:相对于VO完全把对方当做木头,RVO假设对方在避障中也会承担一定责任,所以不用完全靠自己改变速度来走出VO,有种互相合作避障的感觉。
  • 或者换一个角度理解,不再直接选择VO外的速度v′AvA′作为新的速度,而是average当前速度vAvA与VO外的速度v′AvA′

RVO的定义与图示

  • 速度为vBvB的BB对速度为vAvA的AA产生的RVO为:

RVOAB(vB,vA)={v′A | 2v′A−vA∈VOAB(vB)}RVOBA(vB,vA)={vA′ | 2vA′−vA∈VOBA(vB)}

  • 图示理解如下:

RVO算法
 

 

  • 释意:
    • 2v′A−vA2vA′−vA:vAvA相对于v′AvA′的对称点。
    • 所以公式的含义是:对称点在原VO中,则中点在RVO中。
    • 所以RVO的构成是:vAvA与原VO中的点的中点。

RVO不会发生碰撞且没有抖动现象的证明

这一部分不赘述了,论文中写得很详尽,只说一下证明的思路:

  • 双方选择同侧避障时,不会发生碰撞。
  • 双方一定会选择同侧避障。
  • 不会有抖动现象:原来会撞的在选择新速度后依然会撞。

收获

  • 用数学语言来描述问题:化作质点的描述、抖动的描述。
  • 从实际应用中发现问题:抖动问题的发现。
  • 特殊到一般的推广:论文后面还将RVO推广到一般情况,很漂亮的推广。

References

 

  •  
为了优化RVO(Reciprocal Velocity Obstacle)算法以提高队伍成员之间的防撞性能,可以从以下几个方面入手: ### 1. 引入ORCA(Optimal Reciprocal Collision Avoidance) RVO的一个已知问题是它可能导致机器人之间出现抖动或不稳定的行为,特别是在密集环境中。ORCA是一种改进的RVO方法,它通过在速度空间中引入一个线性约束,确保每个机器人选择的速度是其最优解的一部分,从而避免碰撞并减少抖动。ORCA的核心思想是为每个机器人定义一个速度约束区域,使得该区域内的速度既能满足避障需求,又能保证机器人尽可能接近其目标速度。 ### 2. 动态调整避障半径 在RVO算法中,通常假设每个机器人是一个圆形或球形的几何体,并且有一个固定的避障半径。然而,在实际应用中,队伍成员之间的相对位置和速度可能会导致不同的避障需求。因此,可以通过动态调整避障半径来适应不同的场景。例如,当两个机器人之间的距离较小时,可以适当增加避障半径以提高安全性;当距离较大时,则可以减小避障半径以提高效率。 ### 3. 考虑运动学和动力学约束 RVO算法通常忽略机器人的运动学和动力学约束,这可能导致计算出的速度在实际中不可行。为了提高防撞性能,可以在RVO的基础上加入运动学和动力学约束。一种方法是将这些约束作为后处理步骤,将计算出的速度调整到运动学和动力学允许的范围内。另一种更彻底的方法是在推导允许速度时直接考虑这些因素,从而确保生成的速度既安全又可行。 ### 4. 多目标优化 在队伍成员之间进行避障时,除了避免碰撞外,还可能需要考虑其他目标,如保持队形、最小化能耗或最大化任务完成速度。可以通过多目标优化的方法,将这些目标转化为速度空间中的约束条件,并在RVO框架内进行优化。例如,可以使用加权平均法或Pareto最优方法来平衡不同目标之间的权衡。 ### 5. 实时感知与预测 在动态环境中,队伍成员的位置和速度可能会随时间变化。为了提高防撞性能,可以结合实时感知和预测技术,提前预测其他成员的未来轨迹,并在RVO算法中考虑这些预测信息。例如,可以使用卡尔曼滤波或粒子滤波等方法来估计其他成员的运动状态,并在计算速度障碍时考虑这些估计值。 ### 6. 三维扩展 虽然RVO最初是为二维环境设计的,但其原理可以扩展到三维空间。在三维环境中,队伍成员之间的相对位置和速度更加复杂,因此需要对RVO算法进行适当的修改。例如,可以使用三维速度障碍区域来表示避障约束,并在三维速度空间中寻找最优解。 ### 7. 仿真与验证 在实际部署之前,应通过仿真验证优化后的RVO算法的性能。可以使用现有的仿真工具(如MATLAB、ROS Gazebo等)来模拟不同的场景,并评估算法在各种条件下的表现。此外,还可以通过对比实验来验证不同优化策略的效果,例如比较原始RVO与改进后的RVO在碰撞次数、路径长度和计算时间等方面的差异。 ### 示例代码 以下是一个简单的RVO算法实现示例,展示了如何计算速度障碍区域: ```python def compute_velocity_obstacle(robot, neighbors): velocity_obstacle = [] for neighbor in neighbors: relative_position = neighbor.position - robot.position relative_velocity = neighbor.velocity - robot.velocity distance = np.linalg.norm(relative_position) if distance < robot.radius + neighbor.radius: # 如果已经发生碰撞,返回零速度 return [np.array([0.0, 0.0])] else: # 计算速度障碍区域 direction = relative_position / distance min_distance = robot.radius + neighbor.radius time_to_collision = (distance - min_distance) / np.linalg.norm(relative_velocity) if time_to_collision > 0: obstacle_velocity = relative_velocity + (min_distance / time_to_collision) * direction velocity_obstacle.append(obstacle_velocity) return velocity_obstacle ``` ### 相关问题 1. 如何在RVO算法中引入ORCA以减少队伍成员之间的抖动? 2. 如何动态调整RVO算法中的避障半径以适应不同的场景? 3. 如何在RVO算法中考虑机器人的运动学和动力学约束? 4. 如何通过多目标优化方法平衡RVO算法中的避障与其他任务目标? 5. 如何在三维环境中扩展RVO算法以提高队伍成员之间的防撞性能?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值