碰撞回避算法(一) 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的自主性. 驱动机器人向前 ...
随机推荐
- ThinkPHP - 加载第三方类库
目录结构: 将核心的第三方目录放置在Apps下的Core目录中. 这样其他控制器便可以轻松访问. *为什么不直接放在ThinkPHP框架既有的第三方文件夹中,答案是便于升级,升级TP版本时,可直接替换 ...
- 【Eclipse】修改项目访问名称
Properties --> Web Project Settings --> Context root --> 输入想要用的名称(默认是项目名)
- 永久性for循环配合switch语句可以实现菜单功能
永久性for循环配合switch语句可以实现菜单功能总结:加入想要无条件地跳转到某条语句执行,用goto语句: 加入想要对某种条件进行判断,为真或为假分别执行不同的语句,用if语句 加入想要检测的条件 ...
- ViewPager+View实现Tab
注:源码来自慕课网. 使用ViewPager+View实现Tab底部导航: 主要思想:顶部top.xml,中间ViewPager,底部线性布局Tab导航. top.xml具体实现: <?xml ...
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- 同步fifo的verilogHDL设计实例
原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: /* date : 2014/10/14 version : modelsim ...
- Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音
原文 Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音 第15部分:在选中ListItem时播放声音 原文地址: http://channel9.msdn.co ...
- MFC全局函数开局——AfxGetApp解剖
MFC中有不少的全局函数,方便在不同对象中获取不同的内容或创建不同的对象.主要全局函数有: AfxWinInit() AfxBeginThread() AfxEndThread() AfxFormat ...
- 【Leetcod】Unique Binary Search Trees II
给定结点数n,结点值为1,2,...,n,求由这些结点可以构成的所有二叉查找树. Given n, generate all structurally unique BST's (binary sea ...
- oracle scn浅析
1. 系统SCN号 查询系统SCN号的方法: select dbms_flashback.get_system_change_number from dual commit后系统SCN号会增长,但是即 ...