http://blog.sina.com.cn/s/blog_6ad33d350102xqal.html

简介

在介绍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是指速度方向与B¯B¯相交的部分,即会发生碰撞的部分(图中灰色斜线部分)。
  • VO是抱着宁杀错,不放过的思想,把所有未来有可能会发生碰撞的速度都放弃了。
  • 实际上假如仅要求一定时间内不发生碰撞的话,有更多的速度可供选择,比如说上图中的(v′AvA′)。
  • 物体A(B):以pApA为圆心,rArA为半径的点集AA
  • 假设B静止:A相对于B的速度,即相对速度vA−vBvA−vB
  • 把A化作质点:求集合BB与集合−A−A的Minkowski
    sum,即闵氏和,B⊕−AB⊕−A,其中
  • A⊕B={a+b | a∈A,b∈B}A⊕B={a+b | a∈A,b∈B}
  • −A={−a | a∈A}−A={−a | a∈A}

  • 首先给出射线的定义,用λ(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≠∅}
  • 抖动现象:如下左图所示,即AA会在vAvA与v′AvA′之间来回切换
  • RVO的效果:如下右图所示,保持vAvA,不会抖动

  • 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
  1. 假设初始状态为会发生碰撞:vA∈VOAB(vB), vB∈VOBA(vA)vA∈VOBA(vB), vB∈VOAB(vA)
  1. 由于在对方的VO内,所以各自选择新的速度以防止碰撞:v′A∉VOAB(vB), v′B∉VOBA(vA)vA′∉VOBA(vB), vB′∉VOAB(vA)
  1. 由前面VO的Symmetry性质可知:此时,原来的速度不在当前速度的VO内:vB∉VOBA(v′A), vA∉VOAB(v′B)vB∉VOAB(vA′), vA∉VOBA(vB′)
  1. 假设我们更加prefer原来的速度,则又会回到原来的vAvA与vBvB
  1. 于是在1→4之间循环,即发生抖动
  • 缩小VO的大小,新的”VO”就叫做RVO
  • p.s. 我个人对Reciprocal的理解是:相对于VO完全把对方当做木头,RVO假设对方在避障中也会承担一定责任,所以不用完全靠自己改变速度来走出VO,有种互相合作避障的感觉。
  • 或者换一个角度理解,不再直接选择VO外的速度v′AvA′作为新的速度,而是average当前速度vAvA与VO外的速度v′AvA′
  • 速度为vBvB的BB对速度为vAvA的AA产生的RVO为:
  • 图示理解如下:

  • 释意:
  • 2v′A−vA2vA′−vA:vAvA相对于v′AvA′的对称点。
  • 所以公式的含义是:对称点在原VO中,则中点在RVO中。
  • 所以RVO的构成是:vAvA与原VO中的点的中点。
  • 双方选择同侧避障时,不会发生碰撞。
  • 双方一定会选择同侧避障。
  • 不会有抖动现象:原来会撞的在选择新速度后依然会撞。
  • 用数学语言来描述问题:化作质点的描述、抖动的描述。
  • 从实际应用中发现问题:抖动问题的发现。
  • 特殊到一般的推广:论文后面还将RVO推广到一般情况,很漂亮的推广。

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

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

VO(Velocity Obstacle)

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

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

VO的直观理解

问题描述

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

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

解决办法

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

VO的图示理解

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

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

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

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

VO的数学定义

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

RVO(Reciprocal Velocity Obstacle)

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

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

证明VO抖动现象存在

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

VO左(右)侧示意

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

RVO的Insight

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

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

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

RVO的定义与图示

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

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

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

收获

References

RVO算法的更多相关文章

  1. RTS寻路相关资料收集

    http://www.cocoachina.com/game/20150824/13174.html RVO算法 RVO避开agent

  2. 如何制作RTS游戏的寻路系统?

    Q1:我们在做一个RTS游戏,开始用的是Unity自带的NavMesh的寻路,但发现这个并不适合RTS多人寻路,因为总会出现阻挡和闪跳的问题.看Asset Store上的A* path插件评论说在碰撞 ...

  3. GameUnity 2.0 文档(五) 人工智能之---------------Flocking算法 (聚集,分散,列队 )

    AI是游戏的灵魂,是人物的智商,是让玩家觉得游戏是否幼稚的重要判断功能,下面我将介绍国外流行,国内不行的,ai算法. 主要介绍  Flocking  和 Reciprocal Velocity Obs ...

  4. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  5. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  6. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  7. 红黑树——算法导论(15)

    1. 什么是红黑树 (1) 简介     上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...

  8. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  9. 虚拟dom与diff算法 分析

    好文集合: 深入浅出React(四):虚拟DOM Diff算法解析 全面理解虚拟DOM,实现虚拟DOM

随机推荐

  1. hdu 4927 java程序

    /*对于本题题意非常easy 关键在于求杨辉三角时的二项式是没实用到优化,导致超时. 对于第n行的二项式的第i个可有第i-1个乘于一个数处于一个数得到,要用到大数.java比較方便. 假如n=6,i= ...

  2. JVM GC调优一则--增大Eden Space提高性能

    版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/24924843 ...

  3. xutils3基本使用

    根目录下新建一个类继承application,调用xUtils3初始化方法 public class AtguiguApplication extends Application { @Overrid ...

  4. mongo简介

    MongoDB MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服 ...

  5. 分享知识-快乐自己:Hibernate框架常用API详解

    1):Configuration配置对象 Configuration用于加载配置文件. 1): 调用configure()方法,加载src下的hibernate.cfg.xml文件 Configura ...

  6. Mysql处理字符串函数(转)

    http://www.jb51.net/article/27458.htm 感觉上MySQL的字符串函数截取字符,比用程序截取(如PHP或JAVA)来得强大,所以在这里做一个记录,希望对大家有用. 函 ...

  7. 【HDU 3487】Play with Chain Splay

    题意 给定$n$个数序列,每次两个操作,将区间$[L,R]$拼接到去掉区间后的第$c$个数后,或者翻转$[L,R]$ Splay区间操作模板,对于区间提取操作,将$L-1$ Splay到根,再将$R+ ...

  8. HihoCoder1655 : 第K小最简真分数([Offer收割]编程练习赛39)(唯一分解+容斥定理+二分)(不错的数学题)

    描述 给一个整数N,请你求出以N为分母的最简(既约)真分数中第K小的是多少? 输入 两个整数N个K. 对于30%的数据,1 <= N <= 1000000 对于100%的数据,1 < ...

  9. Spring笔记03(Spring创建对象的三种方式)

    1.创建对象的三种方式和bean的生命周期的验证: Animal接口代码: package cn.pb.dao; /** * 动物接口 */ public interface Animal { //吃 ...

  10. 字典树Trie的使用

    1. Trie树介绍 Trie,又称单词查找树.前缀树,是一种多叉树结构.如下图所示: 上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, ...