A*算法是自动驾驶中最经典、应用最广泛的全局路径规划算法之一。它通过在已探索的路径代价(g(n))和对未来剩余路径的估算(h(n))之间找到最优的平衡点,能够在静态环境中高效地找到一条从起点到终点的最短路径。
A*算法的精妙之处,在于它用一个简单的公式来评价地图上的每一个节点:
f(n) = g(n) + h(n)
g(n) – 走过的路:代表从起点到当前节点 n 已经走过的实际代价,比如已经行驶的实际距离。
h(n) – 前方的路:代表从当前节点 n 到终点的估计代价。这是一个估算值,通常用直线距离(欧几里得距离)或只能横竖走的“曼哈顿距离”来计算。
A*算法会优先探索 f(n) 值最小的节点,从而确保搜索路径既不是单纯地贪图眼前(只看g(n)),也不是只凭感觉往前冲(只看h(n)),而是寻求整体最优。
你可以把A*算法的执行过程想象成用一张网格地图做标记:
初始化:将起点放入“待检查列表”(Open List)。
迭代搜索:
从“待检查列表”中取出 f(n) 值最小的节点。
将这个节点放入“已检查列表”(Closed List),表示这里已经探索过了。
检查这个节点周围所有的邻居(上下左右及对角线方向):
如果邻居是障碍物或在“已检查列表”中,则忽略。
如果邻居不在“待检查列表”中,则计算它的 f(n)、g(n)、h(n) 值,并将当前节点设为它的父节点,然后加入“待检查列表”。
如果邻居已在“待检查列表”中,则比较从当前节点走是否 g(n) 更小,如果是则更新它的父节点和代价值。
找到路径:当终点被放入“已检查列表”时,路径就找到了。从终点开始,沿着每个节点的父节点指针一路回溯到起点,就得到了完整的最优路径。
尽管在静态路网中很出色,但将A*算法直接用于自动驾驶时,会面临几个核心挑战:
只适用于静态环境:经典的A*算法假设地图是静止不变的,无法应对道路上突然出现的行人、车辆等动态障碍物。
路径不够“顺滑”:A*算法生成的路径往往由折线组成,充满了生硬的拐角,这并不符合车辆的运动学特性(如最小转弯半径),车辆无法直接跟随行驶。
计算效率问题:在大型、复杂的地图中,A*算法需要探索的节点数量可能非常庞大,导致计算时间过长,影响决策的实时性。
针对上述问题,工程师们对A*算法进行了多种改进,使其能适应自动驾驶的需求:
混合A (Hybrid A*)**:在A的搜索过程中加入了车辆的运动学约束(如转弯半径),并考虑路径的平滑性,使生成的路径从一开始就是车辆“开得了”的。研究表明,改进后的混合A*算法可将搜索时间缩短50%以上。
Jump Point Search (JPS) 与 A* 融合:通过智能地“跳”过地图上大量冗余的节点,大幅提升搜索效率,同时结合动态窗口法(DWA)来处理局部动态障碍物,实现更智能的避障。
与其他算法融合:将A*算法生成的全局路径作为“指引”,再结合蚁群算法等在动态环境中适应性更强的算法,共同应对复杂的驾驶场景。