开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2024.03.24北京
1.1
引力势场
(AttractivePotentialField)
人工势场这个特殊的势场并不是一个单一的场,其实它是由两个场叠加组合而成的,一个是引力场,一个是斥力场。
顾名思义引力势场是具有吸引的性质,会将机器人从起点处朝着终点处吸引,所以引力场的存在使得机器人获得了运动的大方向。
在实际的工程中,其实有很多种方法可以构建这样的一个引力势场,最简单而且也是最常用的方式就是直接对地图自由空间的每个点都相对终点计算出欧氏距离的平方,并乘上一个缩放系数ε。
fa(x,y)便是所谓的引力势场函数,它会构建一个离终点越远引力越大的特殊势场,在Matlab中可以非常直观地看到这个引力势场。
1.2
斥力势场
(RepulsivePotentialField)
当然仅仅只有引力势场是不够的,我们还需要让机器人懂得避开地图中的障碍物,这时斥力势场便有用武之地了,斥力势场的会构建一个距离障碍物越近,斥力越大的特殊势场。
这个过程其实非常好理解,引力势场负责吸引机器人从起点朝着终点运动,斥力势场负责规避地图中的障碍。
通常我们会用下面这个函数来构建斥力势场:
其中ρ(x,y)是一个特殊的函数,它会计算出离当前点(x,y)最近的障碍物的距离,而d0是一个距离阈值,当当前点到最近障碍物的距离大于d0时不产生斥力。η同样是一个简单的缩放系数。
在Matlab中可以直观地看到这个斥力势场的样子,离障碍物越近的点所具备的斥力值越大,离障碍物越远斥力值越小,甚至为0。
我们生成了引力势场和斥力势场这两个特殊势场之后,只要将两个势场进行简单的叠加组合之后就得到了最终的人工势场。
在Matlab中可以直观地看到这个叠加的结果如下,其实相信看到这里小伙伴们应该有点感觉了,当我们每个人工势场都是根据特定的终点而特定生成的,在地图不变的情况下,改变终点的位置便会改变人工势场。终点的位置总是人工势场中势能最低的地方,想象一下,现实中存在一个长得和人工势场一样的曲面,现在我们拿着一个小球放在曲面的高处,那么在重力的作用下,小球自然而然地就会顺着曲面滚到最低点。如果你成功地想象出这个画面,那么恭喜你,你已经领悟了人工势场的核心思想了。
1.3
梯度下降
相信只要是学过高数的小伙伴一定知道梯度的概念,如果你忘记了,那么赶紧回去复习。梯度下降法在寻找最优点的问题上被十分广泛地运用,但其实这也是一个听名字很高大上,说穿了很直观的方法。
我还是和各路前辈一样使用山坡为例,来说说明梯度下降法的核心思想。假设你一觉醒来被空投到一个未知的山坡上,现在要求你尽全力下山,也就是说要你找到最低的点。那么这时候你该怎么办呢?非常简单,第一步:环顾你的四周找到一个坡度最陡峭的地方;第二步:朝着最陡峭的方向迈出一步;就这样重复执行第一步、第二步,直到你到达一个位置,在这个位置的四周都比它高,也就是说这是一个你能找到的最低的点。
在数学中,梯度的方向就是函数位于当前某一点(x0,y0)时,增长速度最快的方向。那么反过来,将函数添加上负号,再求梯度,便可以找到函数减少最快的方向。
所以这便回答了方才提出的“如何利用人工势场进行运动规划”这一问题,我们采用梯度下降法配合人工势场进行运动规划。
2.1
引力势场函数
然后引力势场函数的实现相对比较简单,就是计算meshgrid中每个点相对于终点的欧氏距离的平方,乘以一个缩放系数。对,就是这么简单。
2.2
斥力势场函数
斥力势场函数在实现中比较麻烦的点在于ρ(x,y)函数,但是各位不要担心,万能的Matlab已经有现成的函数可以实现这个功能,这个函数就是bwdist()。
在bwdist()的描述中我们可以得知,这个函数其实是一个图像处理函数,他会计算出一张二值图片中所有像素点相对其最近的非零像素点的距离。这就正合我们意了,我们的障碍物地图恰好就是一张二值图片,0表示自由空间,1表示障碍物。那么这个函数就会计算出地图中每个点相对最近障碍物的距离值,当然如果当前点恰好是个障碍物,那么最近的障碍物就是它自己,所以得到的距离结果就是0。
如下图的代码所示,influence就是表达式中的d0即距离阈值,这里将bwdist()的结果除以100再加1,首先是除以100是为了将距离值缩放到一个合理的范围,其次加1是为了规避前面说过障碍物结果为0的情况。
最终将两个生成的势场简单地相加就可以得到最终的人工势场了。
2.3
梯度规划器
2.4
最终运行效果
从4月份到现在,当初答应你们的5个运动规划入门算法已经悉数奉上,那么本系列就可以暂告一段落了。希望笔者这粗糙的讲解可以帮到你们些许。