一、背景介绍

VO、RVO、ORCA都是为了解决路径规划中的避障问题而研究的算法,它们三个的关系就是走进江湖的剑客,行走江湖逐渐改正自己,完善自己成为顶尖剑客。

而这三种算法是一种局部导航,它只能感知到靠近自身周围的情况,而没有全局环境的信息,只管导航时不与周围的个体目标或者障碍发生碰撞,在这一点与传统的寻路算法A星之间形成互补,A星是最大可能保证导航个体与自身起点到目标点之间的距离是最短路径,但A星没有感知所有导航个体的具体状态和周围其他agent的运动状态,因此它只能把所有物体都看做障碍物,这样就增加了地图的复杂程度,大大增加了寻路的时间。

下面就是我对这三种算法的一个理解

二、算法描述

VO:放弃所有可能相撞的速度和方向:

假设两个圆盘状物体A、B,它们的半径分别为Ra,Rb,如果两个物体不相撞,也就是说圆心A、B之间的距离要大于Ra+Rb,那也就可以等价于如下图所示:

我们将A看成一个质点,也就是在这一帧的相对移动位于这个圆外就可以,并且因为运动是连续的,终点和起点之间是一条连线,所以圆的后方也是不能到达的,所以深色区域都是质点不能到达的。我们把上述图除以时间也就映射到速度域了(即为VO)。

但是,如图所示,A和B相向而行,一开始A和B会错开,但当下一帧对方的速度发生变化时,他们又会把速度转回来,因为A会认为B是就是往左上走的,所以我还是保持最佳的向下走也不会撞上,B也是这么想的,所以他们就转回来了。实际上他们可能不会碰撞,但两个agent的反复横跳是不够优雅的,并且在现实场景中,这种情况也是不可取的。

RVO:作为VO的改进,它解决了VO产生抖动的原因(反复横跳),

假设对方也会使用和我们相同的策略,而并非保持匀速运动。在基础的VO算法中产生抖动的原因是A在第二帧选择新速度之后,发现B的速度也变化了很多,A就会认为改回最佳速度(即直接指向目的地的速度)似乎也不会碰撞了,因为B的新速度其实就是根据A保持最佳速度也不会碰撞下的情况下改变的,所以A就会认为B允许他转回来,但同时B也是这么想的。

然而在 RVO 中,A 把自己的速度只改变 1/2,也就是说,我们假设 A 和 B 想要错开,总共需要错开 10cm,VO算法中A和B都会各自错开10cm,在RVO算法中A只错开一半,也就是5cm,同时A假设B会错开另外一半,B也是这么想的,因此两人不谋而合,第二帧的时候,两个人各自错开了一半,并且发现此时转回最佳速度依然是会碰撞的(因为每个人只转了一半),因此有效避免了上述抖动的现象。

ORCA:作为究极进化体,(个人认为是最难理解的)它解决了上述两种算法只能应用在两个agent下,而当智能体数量增多,如下图所示:

A认为C会向右转,因此自己向左转了1/2,而B认为C会向左转,因此自己向右转了1/2,而C实际上两种做法都没有选择,因为在VO图中,两个锥体摆在自己的面前,所以C选择非常努力的向左或者向右转动。

在RVO中,所有智能体都假设对方只考虑自己。

ORCA与RVO最大的区别,在于VO的形状差异,在以往的VO算法中,VO都是以无限高度的锥形出现的,二维中就是同源的两条射线的夹角,但在ORCA中,我们使用一个有向平面来分割平面。

参考ORCA-有关机器人群碰撞避免算法解读 - 知乎 (zhihu.com)

这里我省略一些图片,跟我上面所描述的图也类似。

引入了VOτA|B的定义。VOτA|B(将A看成质点)是在二维速度空间坐标系中的一片区域,指在某一时刻A、B机器人位置已知的情况下,在下一刻A对于B的相对速度若属于以上定义的区域,则A、B机器人会在时间窗口τ内发生碰撞。相当于坐标系,A的速度是vAO,B的速度为vBO,而A对于B的相对速度是vAB,这里先假设B是静止不动的,vAB=vA.

vAB∈VOτA|B时,A、B会在τ时间内发生碰撞。若vAB ∉ VOτA|B,则两机器人不会发生碰撞。

我们定义CAτA|B为本agent不与其他agent发生碰撞的速度集合。

CAτA|B(VB) = {v|v ∉ VOτA|B⊕VB}。

假设A、B在同一平面上。在二维速度空间坐标系,B这里开始有速度了,假设B的可选择的速度范围为下图深灰色区域。

然后假设VOτA|B为如下浅灰色区域:

VOτA|B⊕VB为如下浅灰色阴影区域。相应的,由于CAτA|B(VB) = {v|v ∉ VOτA|B⊕VB},我们有CAτA|B(VB)为除去浅灰色阴影区域的其他区域。(感觉可以理解成A按照B的速度区域运动,然后得到的VO区域)

基于上面所说的,我们将对象引申到机器人,A机器人的速度为vAopt,B机器人速度为vBopt。先假定A、B会在τ时刻内发生碰撞,显然vAopt-vBopt属于速度障碍区域VOτA|B。

vAopt-vBopt∈VOτA|B。

现设向量uu的起点为vAopt-vBopt。终点为到速度障碍区域VOτA|B边界最近的一点,u即为。

u = (v|arg min||v-(vAopt-vBopt)||)-(vAopt-vBopt),v∈∂VOτA|B。

由于vAopt和vAopt在速度障碍区VOτA|B的内部,A和B会在τ时间内发生碰撞。现在倘若我们让A和B在τ时间内不发生碰撞,那我们必须要改变VAopt或VBopt,或者两者都改变,来使vAopt-vBopt移动至速度障碍区VOτA|B之外。在之前的RVO规定中已经定义了A、B采取相同的计算方法避免碰撞,现在,我们把碰撞责任平均分摊给A、B两个机器人,即A的新速度为vAopt+1/2u,B的新速度为vBopt-1/2u,这样(vAopt+1/2u)-(vBopt-1/2u)已经不属于速度障碍区VOτA|B,也就是避免了碰撞。如图所示:

其中n向量为单位向量,它的起点是u向量的终点。由于ORCAτA|B={v|(v-(vAopt+1/2u))*n≧0},可得ORCAτA|B为一个半平面区域,其中,该半平面区域的边界距离点vAopt的距离为||1/2u||,且与向量n垂直。以同样的方法,我们可得ORCAτB|A。

以上就是我的个人理解,写这篇的目的也主要是为了加强自己的理解,可能会存在错误或者偏差,欢迎人批评指正,互相学习!

关于VO、RVO、ORCA的个人理解相关推荐

  1. rvo算法 matlab,RVO算法

    简介 在介绍VO,RVO之前,需要先介绍路径规划. 对Agent进行路径规划,实际上要完成的任务就是让Agent从点A无碰撞地移动到点B.而路径规划的过程是层次化的,其基本框架大致如下: High l ...

  2. 【笔记】unity逻辑类各种即使方案汇总

    迷雾遮罩: 1.使用war3的地图拼接 2.改变网格范围,传到shader中 寻路: 需要高精度的则不适合用Navmesh 1.https://howtorts.github.io/2014/01/0 ...

  3. bo dto java vo_java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解

    O/R Mapping 是 Object Relational Mapping (对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在 O/R Mapping 的世界里 ...

  4. 后端修行 - java中PO、VO、BO、POJO、DAO、DTO、TO、QO的理解

    最近查看公司的项目结构,发现很多以VO.PO.BO命名的类,因对此一概不知,故搜寻多篇博文,静坐半日 → 予以总结并进行记录 前情提要 正文详解 VO O/R Mapper PO VO与PO区别 BO ...

  5. 深入理解javascript内部原理(2): 变量对象(Variable object)

    本文是翻译Dmitry Soshnikov 的文章 Variable object 文章地址:http://dmitrysoshnikov.com/ecmascript/chapter-2-varia ...

  6. po、bo、do、dto、vo相关图形

    图1.2:基于Springmvc.RPC的三层架构角度 图3.4:基于struts2的三层架构角度 图5:基于mybatis三层构架角度  图6:基于servlet的三层构架角度 图7:信产业务  图 ...

  7. 屏幕为什么要正负压供电_负压变换器的设计

    目前在工业.汽车电子系统中有诸如温度.压力.位置.重量和流量等物理参数的精确测量,这些信号中的一些传感器和前置放大器需要正负电压源驱动或供电,以提供足够宽的动态范围和抗干扰性.这些电子系统通常使用3. ...

  8. matlab llc谐振电路,一个菜鸟对LLC谐振知识的渴望

    admin 离线 LV9 管理员积分:30301 | 主题:2337 | 帖子:8925 积分:30301 管理员 2015-5-27 14:55:14 期待ing shyshihouyun 积分:5 ...

  9. Spring Cloud【Finchley】实战-01注册中心及商品微服务

    文章目录 Spring Cloud[Finchley]专栏 概述 版本说明 搭建Eureka Server注册中心 工程结构 Step1. pom添加依赖 Step2.application.yml ...

  10. 你还要我怎样的JS系列(4) -- 作用域链

    前言 上一章节我们讲了VO. 我们回顾一下之前的内容. 进入执行上下文会创建VO对象.建立作用域链.确定this指向.执行上下文的数据(函数形参.变量声明.函数声明)是作为属性存储在VO中的. 我们也 ...

最新文章

  1. HDU1053 Entropy 哈夫曼树
  2. SolidWorks大师班:从基础到专业学习教程
  3. 3的三个整数立方和有多少个解?全球40万台计算机助力,MIT研究登上PNAS
  4. 【Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )
  5. Dubbo的使用及原理浅析
  6. JAVA中循环删除集合中元素的方法总结
  7. wordpress漏洞上传php文件,WordPress wp-admin/includes/file.php任意文件上传漏洞
  8. Laravel5.5 MySQL配置、读写分离及操作
  9. 发卡网源码 去后门 可以扩展码支付
  10. ILSpy 6.0 Preview 1 发布,.NET 反编译工具
  11. Cplex入门教程(一)
  12. linux桌面图标主题包,推荐 4 款漂亮的 Linux 图标主题
  13. 作为一名开发者,要警惕这五个浪费生命的现象
  14. Android媒体库你了解多少
  15. linux中的 bin sh,Linux-#!/bin/sh理解
  16. 微信小程序获取头像和昵称,头像圆角设置
  17. 提高社会的微生物素养:势在必行!
  18. 蚁群算法ACO求解TSP问题
  19. 对象存储2:数据存储类型-文件存储、块存储、对象存储详解
  20. 信息学奥赛一本通:1309:【例1.6】回文数(Noip1999)

热门文章

  1. python爬虫,爬取哔哩哔哩视频
  2. python爬虫爬取视频时,实现实时进度条显示
  3. 软件评测师--第11小时 安全测试和评估
  4. Android Studio中Spinner控件的使用方法2-2
  5. 2021年最新程序员培训机构排名,学习前避坑必看
  6. 教育培训机构如何利用小程序招生?
  7. 对人工智能的初步认识
  8. 用c++做文本加密与解密程序(源码)
  9. 汉语为主体的计算机网络环境,读书笔记 | 鲁川:汉语语法的意合网络 | 从网络到表层序列的生成...
  10. 使用HbuilerX运行微信小程序到微信小程序模拟器