碰撞回避算法(一) Velocity Obstacle
碰撞回避是机器人导航,游戏AI等领域的基础课题。几十年来,有很多算法被提出。注意这里主要指的是局部的碰撞回避算法。尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系。可是还是有所不同的(局部的碰撞回避算法主要关注的是即将发生的碰撞,而路径规划主要关注的是事先确定出到达目的地的最佳路径。这两种算法通常须要配合使用)。近年,一种基于Velocity Obstacle [1]的ORCA算法由于事实上时性,在很多3A级游戏中被广泛採用。这里我们就介绍一下这样的高性能的算法。
首先考虑一下最主要的情形,有两个圆形的机器人A和B在同一个平面上以一定的速度移动着,那么我们要怎样推断它们是否会发生碰撞?
一种比較直观的方法就是。算出A对于B的相对速度。然后看看相对速度的方向是否在宽度为两者半径之和的扇区内。假设在,那么这两个机器人在未来某个时间点必定会发生碰撞。
反过来说。仅仅要相对速度在这个扇区范围之外。那么就不会发生碰撞。假设要获得对于绝对速度Va的“碰撞范围”,仅仅要将相对速度的“碰撞范围”依据Vb进行平移就可以。而这个“碰撞范围”就是A对于B的Velocity Obstacle。
正式的定义例如以下:
当中
那么假设有复数个机器人。对于B来说,就不止有一个Velocity Obstacle。此时,仅仅要选择在全部的Velocity Obstacle的集合之外的速度就行保证不会发生碰撞。
该方法的优点在于直观以及计算简便。仅仅须要构建出每一个Velocity Obstacle的两条边。便能够直接选择速度,不像更多的算法须要计算距离。当然,另一些详细的问题,如应该选择哪一块区域。或者没有可选择区域时应该怎样选择等。这里我就不多加介绍了。有兴趣的同学能够自行查看后面所列出的參考文献。
这非常棒,没错。
可是,当其它的机器人也採取相同的回避措施的时候,会发生什么?
能够想象下面的情形。
两个机器人A和B都向着各自的目标迎面而行,他们的速度都处于各自的Velocity Obstacle中,也就是说接下来会发生碰撞。A与B都会选择Velocity Obstacle之外的速度进行回避。
一段时间之后,他们的速度都将处于各自的Velocity Obstacle之外。可是,为了尽快的到达目的地,他们又会又一次选择原来的速度,反复上述动作。终于他们的运动轨迹会变成下图所看到的,这样的抖动不仅不自然,也会影响各自的速度。
这个问题的根源在于Velocity Obstacle算法假定机器人B以外的机器人都不会採取回避行动,而仅仅是以固定速度朝着各自的目的地前进。
也就是说,回避的责任所有交给了B。而当其它机器人也採取相同的回避策略时,便会出现上述的问题。为了解决问题,在2007年開始的之后几年间,University of North Carolina at
Chapel Hill的研究小组Gamma提出了Reciprocal Velocity Obstacle以及它的改良算法Optimal Reciprocal Collision Avoidance,并获得了很好的回避性能。
这些算法详细是如何的,让我们留待下回分解。
參考文献
[1] P. Fiorini and Z. Shiller, “Motion planning in dynamic environments using velocity obstacles,” Int. J. Robot. Res., vol. 17, no. 7, pp. 760–772, Jul. 1998.
P.S. 该文章使用Live Wirter公布,似乎图片被自己主动缩小了。看不清的话能够点击查看原图
碰撞回避算法(一) Velocity Obstacle的更多相关文章
- Velocity Obstacle
[Velocity Obstacle] Two circular objects A,B, at time t(0), with velocity V(A),V(B). A represent the ...
- 3D有向包围盒与球体碰撞的算法
之前发的小游戏滚蛋躲方块中,用它来判断球体与立方体是否发生了碰撞. http://www.cnblogs.com/WhyEngine/p/3350012.html 现在发布下该算法: 有向包围盒OBB ...
- 游戏碰撞OBB算法(java代码)
业务需求 游戏2D型号有圆形和矩形,推断说白了就是碰撞检测 : 1.圆形跟圆形是否有相交 2.圆形跟矩形是否相交 3.矩形和矩形是否相交 ...
- RVO算法
http://blog.sina.com.cn/s/blog_6ad33d350102xqal.html 简介 在介绍VO,RVO之前,需要先介绍路径规划. 对Agent进行路径规划,实际上要完成的任 ...
- PBKDF2WithHmacSHA1算法
主要用于明文密码加密字符串存入数据库.由棱镜门思考.目前大部分企业中都是明文密码.一旦被攻破.危害非常大.现在主流加密技术是MD5加密.不过MD5的存在小概率碰撞(根据密码学的定义,如果内容不同的明文 ...
- 1c19b35b005744d55261682b361804fa 如何破解经过 MD5 算法处理的信息?
Md5密文破解(解密)可以说是网络攻击中的一个必不可少的环节,是工具中的一个重要"辅助工具".md5解密主要用于网络攻击,在对网站等进行入侵过程,有可能获得管理员或者其他用户的账号 ...
- URL短网址系统的算法设计及实践
在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密.当人们要分享某个URL,比如短信,邮件,社交媒体,这就需要短URL. 而短网址,顾名思义就是在长度上比较 ...
- 【算法】01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈)
[算法]01-数据结构概述(注意区分jvm堆与堆/jvm栈与栈) 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有 ...
- Explore Basic Behavior of the TurtleBot ---3
原创博文:转载请标明出处(周学伟):http://www.cnblogs.com/zxouxuewei/tag/ Introduction 此示例帮助您使用turtlebot的自主性. 驱动机器人向前 ...
随机推荐
- ExtJS学习第一天 MessageBox
此文用来记录学习笔记: •学习任何技术,首先都要从Helloworld开始,那么我们首要任务就是写一个简单的HelloWorld程序,带领同学们走进ExtJS的世界. •Ext.onReady:这个方 ...
- C语言,单链表操作(增删改查)(version 0.1)
这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...
- 我的Python成长之路---第四天---Python基础(16)---2016年1月23日(寒风刺骨)
四.正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和 ...
- 基于FPGA的DW8051移植(一)
最近 半个月都在移植8051,看到DW8051内核资料比较齐全又是新思发布的,所以就开始玩弄 可是这半个月的努力几近白费 —— 移植失败了,不知道从何着手这个内核.可能大家能找到不同的版本,我的是最初 ...
- 获取java byte的无符号数值
byte a = (byte)234; System.out.println(a); 上面的代码,结果是-22,因为java中byte是有符号的,byte范围是-128~127. 如果想输出234,该 ...
- surfaceView画图
1.视图 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...
- 排行榜妙用——CSS计数器
碰到的坑 小伙伴你们是否有碰到以下的情况,排行榜前3名的样式不一样,你们是怎么处理的么?
- PowerMock mock私有方法
import java.util.Random; public class CodeWithPrivateMethod { public void meaningfulPublicApi() { if ...
- MySQL主键添加/删除
2改动数据库和表的字符集alter database maildb default character set utf8;//改动数据库的字符集alter table mailtable defaul ...
- AT&T汇编
AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部 ...