路径规划-AStar

概述

A*算法是一种基于图搜索的路径搜索算法,通过结合移动代价和启发代价,优化路径的搜索性能. 青岛

算法描述

确定规划的起点和终点

下图所示,红色方块代表规划起始点,绿色方块代表终点,深灰色方块代表障碍物区域,其余白色方块代表可行驶区域(free space).首先将起始点节点推送到open集合中.

原始地图给定起始点和终点

产生临近节点

每次从open集合中取出总代价值最小的节点,由于当前open集合中只有起始节点,所以此时从open集合中取出的就是起始节点,并将该节点推入close集合.

如下图所示,基于起始节点生成相邻节点,并计算每个节点的代价值.其中A*节点的代价值由移动代价启发代价组成,即\(F = G + H\).

本例中,采用如下距离计算代价值:

  • 移动代价 采用欧拉距离计算移动代价值
  • 启动代价 采用曼哈顿距离计算启发代价值

临近节点产生

图例说明

下图是对上图中每个节点中小方格的说明:

  • 左下角的方格代表移动代价
  • 右下角的方格代表启发代价
  • 最上方的矩形方格代表总的代价值
  • 中间的紫色方格代表父节点的方向

节点选择

A*算法下一节点的选择,是从open集合中选取总代价值最小的节点.如下图所示,位于起始点右侧的节点代价值最小,图中使用浅绿色蒙板覆盖该节点表示选中.

选择价值最低节点

节点扩展

基于选中的节点,根据扩展规则,生成新的临近节点,计算临近节点时只需要计算移动代价.

如下图中的右侧所示,对于新生成的8个节点需要做如下条件判断:

  • 是否在close集合中:

    如果该节点在close集合中,直接跳过该节点,进行下一节点的判断

  • 是否碰撞:

    若该节点与障碍物存在碰撞可能,则跳过该节点,进行下一节点的判断;

  • 是否在open集合中:

    1. 如果该节点==在==open集合中,需要判断该节点的移动代价是否小于原先位置节点的移动代价:

      如果小于,则替换原先节点,并将节点的父节点方向指向当前节点,否则跳过该节点,进行下一节点的判断.

    2. 如果该节点==不在==open集合,则直接将其加入open集合.

如下图所示,当前节点的左侧的节点已经在close集合中,直接跳过该节点;当前节点左上角,左下角,上方和下方的节点已经在open集合中,所以需要比较新节点与open集合中节点的移动代价.通过比较,这四个新节点的移动代价大于相应open集合中节点的移动代价,所以跳过这些节点;当前节点右侧三个新节点都不在open集合中,所以直接将它们推入open集合.

基于扩展规则,不断推出总代价值最小的节点,并扩展这些节点.下图中,当前节点右侧三个新节点与障碍存在碰撞,所以直接跳过.

如下图所示,如果存在总代价相等的情况,则先推出最新推入的节点.下图中,假设右下方总代价值为64的节点是新推进open集合的节点.

如下图所示,继续推出新的节点,并迭代更新.

如下图所示,新的节点有的与障碍物存在碰撞,有的已经在close集合中,有的移动代价大于原先的节点;但当前节点下方的节点,其移动代价小于open集中对应节点的代价,所以需替换open集合中该节点的移动代价,并将其父节点指向当前节点.

迭代

如下图所示,直到从open集合中推出的节点是终点,表明搜索结束.浅绿色蒙板包含的区域属于close集合,其它搜索过的节点属于open集合.如果遍历所有open集合的节点都无法到达终点,则搜索失败.

搜索完成

获取路径

如下图所示,搜索结束后,以终点为起始节点,根据节点所指向的父节点,反向更新搜索路径,直到节点的父节点指向为空,即到达起始点.

搜索结果

参考