概率图路线算法是完备的,当地图有解的时候,它是一定能给出解的。
当我们直接对地图使用A算法时,实际上是对一张布满网格的地图进行图搜索,这是一张非常复杂的图,我们要想改进算法,搜索前需要讲栅格地图换成一种更简单的概率地图。这是PRM,PRM分为两个阶段。
Learning阶段,将一张地图采样,随机采样,根据一些规则,将点连成线。
query阶段,搜索阶段,使用A算法进行路径搜索。
这样子虽然是对A*的算法效率有所提升,但这里还是有可以改进的空间。Learning在连成将概率点连成线的时候,不也可以在路线生成的时候同时也做一些规划吗?也就是说Learning和query做的工作有所冗余。我们可以在去掉query直接在learning上做一些规划。这里介绍一种这样的算法,Lazy collision-checking,这是在采样连线后直接按照距离最短的规定返回一条路径,然后做一些检测,是否穿过了障碍物,如果是的话,删掉通过障碍物的几条路径,重新选择,然后再返回再检测,这样就大大减少了路径规划的时间。
接下来介绍的是基于采样的Rapidy-exploring Random Trees. RRT算法。
RRT算法是在随机采样的点上建立起路径,直到终点被归纳进树里面,然后根据父节点直接返回一条路径.
RRT伪代码:
RRT的缺点是:
- 在需要通过一些狭窄的地形下,随机采样落到狭窄地形的概率比较小, 所以搜索时间会大大增加.不一定是最短路径
解决方法:
Kd-tree:
当新增加一个点时,kd-tree能帮助你快速找到离它最近的一个.通过一种特殊的储存结构能够快速找出最近的一个节点,
Bidirectional RRT:
在narrow case 的情况下, 让终点长出两颗树来再进行搜索.
或者直接改进采样函数, 使它具有启发性.
其实就是重载小括号,这使得它的调用起来非常像函数,因此也被称为仿函数。
匿名函数对象类名加()。如 Person(),这就是创建一个匿名对象,在此行结束后立刻被释放。



