基于此文章学习整理。
在实际环境,也就是机器人的工作空间(Workspace)中,机器人是有形状和大小的,这不利于进行运动规划。要将工作空间转换到配置空间中,即将机器人转化为一个质点,同时将障碍物按照机器人的体积进行膨胀,如下图:
创建一个容器,用来存储将要访问的节点
将起点加入容器
开始做如下循环
从容器中取出一个节点
获得该节点的邻节点
将这些邻节点装入容器
结束循环
通过栈(Stack)数据结构实现深度优先搜索,如下图所示:
将该算法应用到路径规划中,如下图所示:
可见该算法所得到的路径并不是最短路径。
通过队列(Queue)数据结构实现广度优先搜索,如下图所示:
将该算法应用到路径规划中,如下图所示:
可见该算法所得到的路径为最短路径,但是需要大量时间。
GBFS使用的是优先队列(Priority Queue),普通队列是一种先进先出的数据结构,而在优先队列中元素被赋予了优先级,最高优先级元素优先弹出。
在图搜索算法中,使用代价函数
其中,欧氏距离和曼哈顿距离分别表示如下:
欧式距离和曼哈顿距离的计算方法分别为:
在无障碍物的地图中,GBFS可以很快的找到最短路径,如下图所示:
但是在实际情况中,很容易陷入局部最优陷阱,找不到最短路径:
将该算法应用到路径规划中,如下图所示:
Dijkstra算法可以用于有权图的图搜索,Dijkstra算法与GBFS同样使用优先队列的数据结构,不过其代价函数
将该算法应用到路径规划中,如下图所示:
Dijkstra算法和BFS算法一样可以得到最短路径,但是速度较慢。
在A*算法中,将GBFS与Dijkstra算法的代价函数进行了结合,即
由于引入启发函数
其中,
将该算法应用到路径规划中,如下图所示:
将A*算法中的代价函数更新如下:
当
A*算法在某些情况下会出现低效率的情况,其中的一种情况是在大型的开放空间中搜索,如下图所示:
可以看见图中的每一条路径的代价都是相同的,即,A*算法在搜索过程中搜索了许多不必要的点。
可以用以下几种方法提高A*算法的效率:
让
轻微地干扰
如下图中图(1)所示,当水平或竖直搜索时,根据Look Ahead Rule,仅需要考虑一个节点(natural neighbors)
当如图(2)所示进行对角线搜索时,需要考虑三个节点
当出现如图(3)、(4)所示的特殊情况时,需要额外多考虑一个紫色节点(forced neighbors)
在没有搜索到终点的情况下:
首先如图(1)所示水平或竖直搜索,直到遇到如图(3)所示情况,并将图三中紫色节点作为Jump Point Successor,加入优先队列
如果水平或竖直搜索都没有找到Jump Point Successor,则进行如图(2)所示的对角线搜索,直到遇到如图(4)所示情况,并将图三中紫色节点作为Jump Point Successor
将找到Jump Point Successor节点的节点列为Jump Point,并继续搜索,如果没有新的forced neighbor,从队列中的节点继续搜索。
示例1
示例2:在开放空间搜索时与A*算法比较
示例3:JPS是否总是最优?
下图为JPS算法得到的路径
下图为A*算法得到的路径