D*算法-动态路径/运动规划
目录
1 前言
1.1 命名由来
原话:The name of the algorithm, D*, was chosen because it resembles A*
解释:就是觉着像A*干脆起名D*,说是Dynamic A* 不太严谨
1.2 使用场合
适用于动态环境(/路网)中的路径/运动规划(motion planning),与Dijkstra、A* 形成对比(两者适用于静态环境/路网)
解释:
-
动态是指在沿着最优路径前进时,突然出现了既定路径中断的情况需要进行重新规划。
-
路径中断在现实生活中可以理解为诸如塌方、巨石、车祸、阻塞等情况的发生,在图/Graph中是某条边Edge/弧Arc的代价/权重cost/weight突然变得非常大,使得当前路径成本陡增,需要重新规划。
-
当然该方法也可以应用在静态环境/路网中,向下兼容,实际就相当于反向(从终点G开始求解)Dijkstra算法。
-
该方法不是唯一的算法,比如在遇到障碍时再次调用A*(参考A* replanner)也是可以的,但是该方法计算成本低,效率高。
-
同时该方法对已知局部环境(类似游戏中的趟地图开荒)、未知环境情况下也有很好的实用性。
2 算法逻辑
2.1 主流程
2.1.1 情形模拟
-
假设有一机器人任务是从起点S到终点G,首先寻找一条最优路径{S, ……, Y, X, ……,G}
-
之后沿该路径行驶过程中在Y处发现X点塌方(无法到达),需要寻找新的路径{ Y, Z, ……,G}继续行驶。
2.1.2 符号约定
1、有向图:D* 算法以有向图作为前提,即在A、B节点间,“A到B” 与 “B到A” 表示两个弧,因此对应的权重不一定一样。
2、X、Y 、Z、S、G等:称为节点,也称为state,可理解为一个坐标position,其中S表示Start,G表示Goal。
3、{S,……,G}:表示一条路径,该路径以S为起点,G为终点,简记为{S}。
4、c(X, Y):表示“Y->X”节点的成本/权重(cost),具体计算逻辑如下。
-
以Y为中心构成8邻域的九宫格
-
当不存在障碍物时,横向、竖向的连接/移动成本为1、斜向连接成本为1.4
-
当存在障碍物时,不管什么方向的连接/移动成本都设置为比较大的值,比如10000,以确保很难通过
-
虽然是有向图,但是在此文中可以设定双向移动成本一样即c(X, Y) == c(Y, X)
5、b(X) = Y: 用来记录反向指针(backpointer),即X->Y,当处于X位置时可以根据b(X)获得下一个要到达的节点Y,以使得路径最优
6、t(X):节点的访问标记位(tag),支持3个类型:NEW、OPEN、CLOSED
-
NEW:节点从未访问过,最初的设置,可能存在部分节点永远处于改状态
-
OPEN:节点正在访问中,存储在OPEN_LIST(使用优先队列PriorityQueue实现)中,也称为OPEN_QUEUE,以待访问扩展
-
CLOSED:节点已经被访问过,从优先队列中移除