路径规划之图搜索算法

基于此文章学习整理。

配置空间(Configuration Space)

在实际环境,也就是机器人的工作空间(Workspace)中,机器人是有形状和大小的,这不利于进行运动规划。要将工作空间转换到配置空间中,即将机器人转化为一个质点,同时将障碍物按照机器人的体积进行膨胀,如下图:

配置空间

图搜索算法的基本流程

创建一个容器,用来存储将要访问的节点

将起点加入容器

开始做如下循环

从容器中取出一个节点

获得该节点的邻节点

将这些邻节点装入容器

结束循环

深度优先搜索(DFS)

通过栈(Stack)数据结构实现深度优先搜索,如下图所示:

DFS

将该算法应用到路径规划中,如下图所示:

DFS

可见该算法所得到的路径并不是最短路径。

广度优先搜索(BFS)

通过队列(Queue)数据结构实现广度优先搜索,如下图所示:

BFS

将该算法应用到路径规划中,如下图所示:

BFS

可见该算法所得到的路径为最短路径,但是需要大量时间。

贪婪最佳优先算法(GBFS)

GBFS使用的是优先队列(Priority Queue),普通队列是一种先进先出的数据结构,而在优先队列中元素被赋予了优先级,最高优先级元素优先弹出。

在图搜索算法中,使用代价函数f(n)作为优先级判断标准,f(n)越小,优先级越高。GBFS使用启发评估函数h(n)作为代价函数,h(n)为当前节点到终点的代价,一般用欧氏距离(Euclidean Distance)或者曼哈顿距离(Manhattan Distance)表示。

其中,欧氏距离和曼哈顿距离分别表示如下:

距离

欧式距离和曼哈顿距离的计算方法分别为:

DManhattan=|x1x2|+|y1y2|

DEuclidean=(x1x2)2+(y1y2)2

在无障碍物的地图中,GBFS可以很快的找到最短路径,如下图所示:

GBFS1

但是在实际情况中,很容易陷入局部最优陷阱,找不到最短路径:

GBFS2

将该算法应用到路径规划中,如下图所示:

GBFS

Dijkstra算法

Dijkstra算法可以用于有权图的图搜索,Dijkstra算法与GBFS同样使用优先队列的数据结构,不过其代价函数g(n)定义为从起点到当前点的移动代价,如下图所示:

Dijkstra

将该算法应用到路径规划中,如下图所示:

Dijkstra

Dijkstra算法和BFS算法一样可以得到最短路径,但是速度较慢。

A*算法

在A*算法中,将GBFS与Dijkstra算法的代价函数进行了结合,即

f(n)=h(n)+g(n)

由于引入启发函数h(n),A*算法得到的路径不一定是最优的。但是当对所有的节点n,都有

h(n)<h(n)

其中,h(n)为从节点n到目标节点的真实代价时,A*算法得到的路径是最优的。

将该算法应用到路径规划中,如下图所示:

A

权重A*算法

将A*算法中的代价函数更新如下:

f(n)=g(n)+εh(n),ε>1

ε为1时,该代价函数为A*算法的代价函数,ε越大,权重A*算法越接近GBFS,可以理解为通过牺牲一定的最优性,以换取搜索速度。

提高A*算法效率的方法

A*算法在某些情况下会出现低效率的情况,其中的一种情况是在大型的开放空间中搜索,如下图所示:

image-20230419224145429

可以看见图中的每一条路径的代价都是相同的,即,A*算法在搜索过程中搜索了许多不必要的点。

可以用以下几种方法提高A*算法的效率:

  1. h(n)尽可能地接近h(n)

  2. 轻微地干扰h(n)

    (1)h~(n)=h(n)×(1+p)p<minimum cost of one stepexpected maximum path cost

跳点搜索算法(JPS)

Look Ahead Rule

neighbors

Jumping Rules

在没有搜索到终点的情况下:

JPS演示

  1. 示例1

    image-20230419223753780

  2. 示例2:在开放空间搜索时与A*算法比较

    image-20230419224224649

  3. 示例3:JPS是否总是最优?

    下图为JPS算法得到的路径

    image-20230419224048375

    下图为A*算法得到的路径

    image-20230419224538083