- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
技术干货:赛车游戏中最短路径和最小曲率路径算法
最近参与了一个非常蛋疼的业余时间小项目:给定赛道和赛车模拟程序,
赛车跑完赛道的最快的办法。对于这个问题,我一开始的想法是:就像Google
的自动驾驶一样,给定足够的训练数据,然后汽车对前方的画面做出判断决定当
前时刻的驾驶策略。不过查了查文献,从游戏开发的角度,似乎一般都是用先找
出赛车的最优路径,然后沿着路径驾驶就行了。我们最后采用的是后者,我负责
了其中赛道产生中的一部分:近似求解最短路径(ShortestPath)和最小曲率路径
(MinimumCurvature Path)。
给定的输入是赛道的图像文件,用OpenCV 中的边缘检测模块得到赛道的线
条和中心轮廓线:一堆按顺序排列好的像素点,描述了赛道的形状,输出则是最
短路径和最小曲率路径按顺序排列的坐标点。
[1] [2]
有了赛道轮廓之后,求解路径的办法主要采用的是 和 中描述的方法。
对赛道进行分段:
分段的办法是在轮廓中心线上取间隔相等的垂直线段,然后将赛道上的控制
点坐标表示为在垂直线段上的相对位置。比如上面这幅图中的第 个线段,假设i
这个线段的上面端点叫 ,下面的端点叫 ,令 ,
则线段上任意一点 可以表示为:
这样做的好处是把需要用二维点坐标表示的赛道转化为一维的在赛道上的
相对位置,如此一来需要处理的问题就变得简单而直观了。
最短路径:
来看 和 ,两点间的距离为
其中,
类似,就不写出来了。那么最短路径就可以看作是求下面这个
优化问题:
注意到这里我们求的是 而并非 ,为什么呢?当然不仅仅
是为了避免求绝对值,将 展开我们得到:
这个形式的表达式,正是标准的Simply boundedQuadratic Programming
问题啊,于是求解 就方便多了。至于为什么 和 基本等效,
是因为在我们的问题中有个假设是赛道分割的宽度近似相等,关于这个假设后面
还有进一步讨论。
最小曲率路径:
需要最小曲率路径的出发点是曲率越小,赛车能达到的最大速度越大,相应
[1]
的关系 中有简单介绍。对于求解,这块的思路和最短路径思路类似,都是在
一定假设下,先求局部量 曲率,距离 ,找到形如( ) ax+bax+b 的表达式,然后平
QP [1] cubicspline
方一下转化为 问题进行求解。在 中求曲率使用的 ,实际实现
( …… )
其实未必用得着 当然也是因为我比较懒 二次的实现比三次简单很多 ,二次
拟合和三次拟合求曲率的主要区别在于方向的影响,二次拟合求曲率时认为一个
点周围的两个临近点是完全对称的,这和赛道分割的假设一致,所以可以用下面
的公式来进行参数化:
s t -1 1
其中 是某一点到起点的路程,所以 的取值范围是 到 。结合前面的假
设来看只要分段等间隔可以被满足,那么 可以近似认为是个常数,经过一
番和最短路径部分类似的繁琐推导,可以得到每一个路径点对应的曲率正比
于 。于是最小曲率路径又化成了一个QP 问题:
其中 的展开为:
这种解法近似求得了全局曲率和的最小解,但是这个解对于赛车而言未必是
最优的,因为求和值最小的解法,对于赛道这种分段数量庞大的情况,单个极值
的影响总会被平均掉,仍很可能有的地方曲率
文档评论(0)