你好,各位技术爱好者们!我是 qmwneb946,一名热爱探索技术深处的博主。今天,我们将一同踏上一段激动人心的旅程,深入剖析自动驾驶领域的核心技术之一:路径规划算法。

自动驾驶,这个曾经只存在于科幻电影中的梦想,正以前所未有的速度驶入我们的现实生活。从L2级辅助驾驶的普及,到L4、L5级全自动驾驶技术的持续探索,无人车正在重塑未来的交通格局。而在这一切的背后,一个至关重要的“大脑”正在默默地工作,它就是路径规划系统。

想象一下,你坐在自动驾驶汽车中,车辆需要在复杂的城市环境中,安全、高效、舒适地从A点行驶到B点。这不仅仅是识别红绿灯、避开障碍物那么简单,它还包括了“我应该走哪条路?”、“我的车速应该如何变化?”、“遇到突发情况,我如何快速、平稳地调整轨迹?”等等一系列决策。这些问题的答案,正是路径规划算法所要提供的。

路径规划,是自动驾驶汽车做出“如何行驶”决策的核心环节。它需要综合感知模块获取的环境信息、预测模块对周围交通参与者行为的预判,以及高精地图等先验知识,生成一条车辆可以安全、合法、舒适地遵循的行驶轨迹。这条轨迹不仅要考虑车辆自身的运动学和动力学约束,还要规避静态障碍物、动态障碍物,遵守交通规则,并兼顾乘客的乘坐体验。

在这篇博客中,我们将从宏观到微观,系统地探讨自动驾驶中的路径规划算法。我们将首先了解它在整个自动驾驶系统中的地位与面临的挑战,然后深入剖解全局路径规划、局部路径规划中的经典算法及其最新进展。我们还会探讨不同算法的融合策略,以及未来可能的发展方向。

准备好了吗?让我们一起启程,揭开路径规划的神秘面纱!

自动驾驶路径规划的地位与挑战

在深入探讨具体算法之前,我们有必要理解路径规划在整个自动驾驶系统中的核心地位。经典的自动驾驶系统通常被划分为“感知-决策-控制”或“感知-规划-控制”三大模块。

  • 感知 (Perception):相当于车辆的“眼睛”和“耳朵”,利用摄像头、雷达、激光雷达等传感器,识别环境中的交通参与者(车辆、行人、自行车)、交通标志、车道线、路沿等,并构建环境模型。
  • 规划 (Planning):相当于车辆的“大脑”,根据感知结果和高精地图,综合考虑交通规则、舒适性、安全性、效率等因素,做出行驶决策,并生成具体的路径和轨迹。
  • 控制 (Control):相当于车辆的“手脚”,根据规划模块生成的轨迹,通过控制车辆的油门、刹车、方向盘,使车辆精确地沿着规划的轨迹行驶。

路径规划是连接感知与控制的关键桥梁,它将抽象的环境信息转化为具体的行驶指令。其重要性不言而喻,但同时,它也面临着巨大的挑战:

  • 动态环境与不确定性:道路环境是高度动态且不确定的。行人可能突然闯入,其他车辆可能随意变道,传感器也存在噪声和盲区。路径规划必须在这些不确定性中做出鲁棒的决策。
  • 安全性:这是自动驾驶的最高优先级。规划的路径必须确保车辆不会与任何障碍物发生碰撞,并能应对各种紧急情况。
  • 舒适性:自动驾驶汽车的目标是提供与人类驾驶员相媲美甚至更好的乘坐体验。规划的轨迹应避免急加速、急减速、急转弯,保持平稳顺畅。
  • 实时性:在高速行驶中,车辆需要在毫秒级的时间内完成感知、规划、控制的循环。路径规划算法必须高效,以满足实时决策的需求。
  • 复杂约束:车辆的运动学(如最大转弯半径、横向加速度限制)和动力学(如最大纵向加速度、刹车距离)约束,以及交通规则(如限速、车道保持、禁止掉头)都必须在规划中得到满足。
  • 长距离与短距离的协同:车辆需要同时考虑从起点到终点的宏观路径,以及当前时刻下一秒甚至更短时间内的微观行驶轨迹。
  • 人类驾驶行为的预测与交互:在混合交通流中,自动驾驶汽车需要预测人类驾驶员的行为意图,并做出合理的交互决策,例如超车、并道等。

为了应对这些挑战,路径规划通常被划分为不同的层次,以协同完成复杂的任务。

路径规划的层次结构

为了有效管理自动驾驶中的规划复杂性,路径规划通常被分解为多个层次,每个层次关注不同的时间尺度和空间范围。尽管具体划分方式可能因系统架构而异,但常见的层次包括:

全局路径规划 (Global Path Planning)

全局路径规划,也称为任务规划或路线规划,旨在为车辆提供从起点到终点的宏观路径。它通常在驾驶任务开始前进行,或者在行驶过程中根据高精地图、交通信息、用户偏好等进行更新。

  • 特点
    • 长距离:通常覆盖整个行程,数百米甚至数公里。
    • 抽象:不考虑具体的障碍物细节,主要基于路网结构、车道信息、交通流等。
    • 离线或准实时:通常在任务启动时计算,或在重大交通状况变化时更新。
    • 目标:找到一条合法、合理、效率最高的路径,例如最短路径、最快路径或油耗最低路径。

行为规划 (Behavior Planning)

行为规划处于全局路径规划和局部路径规划之间,负责根据当前交通状况和全局路径,做出高层次的驾驶决策。

  • 特点
    • 中等时间尺度:关注未来几秒到几十秒内的行为。
    • 决策类型:决定车辆应该执行何种驾驶行为,例如:
      • 车道保持 (Lane Keeping)
      • 车道变换 (Lane Changing)
      • 超车 (Overtaking)
      • 跟车 (Following)
      • 停车 (Stopping)
      • 转弯 (Turning)
      • 掉头 (U-turn)
      • 避让 (Yielding)
      • 紧急制动 (Emergency Braking)
    • 输入:来自感知模块的环境信息、全局路径以及预设的交通规则。
    • 输出:为局部路径规划提供高层指令,例如“当前应保持车道”、“准备向左变道”或“在前方路口左转”。

局部路径规划 (Local Path Planning)

局部路径规划,也称为轨迹规划或避障规划,是与车辆实时行驶最紧密的部分。它根据行为规划的指令和当前感知的环境信息,生成一条短期内(通常是未来几秒)可执行、平滑、无碰撞的精确轨迹。

  • 特点
    • 短距离与实时性:通常关注未来几十米范围内的路径,并以高频率(如10-100Hz)进行更新。
    • 细节考虑:需要精确地考虑动态和静态障碍物、车辆运动学/动力学约束、舒适性要求和交通规则。
    • 目标:生成一条可追踪的、平滑的、无碰撞的轨迹,包含位置、速度、加速度等信息。
    • 输入:行为规划的决策、感知模块的实时障碍物信息、高精地图的详细车道信息。
    • 输出:由一系列时间戳上的位姿(位置、朝向)、速度、加速度、曲率等组成的离散点序列。

这三个层次相互协作,构成了一个完整的规划系统。全局路径规划指明方向,行为规划决定策略,局部路径规划则生成具体的执行细节。接下来,我们将深入探讨每个层次中使用的经典算法。

全局路径规划算法

全局路径规划的目标是在给定的地图(通常是预构建的拓扑地图或高精地图)上找到一条从起点到终点的最优路径。这里的“最优”可能意味着最短距离、最短时间、最少燃料消耗,或者结合多种因素的综合最优。常用的全局路径规划算法主要包括图搜索算法和采样算法。

图搜索算法

图搜索算法将地图抽象为图(Graph),其中节点(Node)代表交叉口或关键路段,边(Edge)代表路段,边的权重则可以是距离、时间或成本。

Dijkstra算法

Dijkstra算法是一种经典的单源最短路径算法,用于计算从图中一个节点到所有其他节点的最短路径。

  • 基本原理

    1. 初始化:将起点到自身的距离设为0,到其他所有节点的距离设为无限大。
    2. 迭代:从所有未访问的节点中,选择当前距离起点最短的节点 u
    3. 更新邻居:遍历 u 的所有邻居节点 v。如果通过 uv 的距离小于当前已知的到 v 的距离,则更新 v 的距离。
    4. 标记:将 u 标记为已访问。
    5. 重复:重复步骤2-4,直到所有节点都被访问,或者目标节点被访问。
  • 优点:能够找到无负权边图中的最短路径。

  • 缺点:需要探索所有可达的节点,效率较低,尤其是在大型图中。对于全局路径规划,通常目标只有一个终点,Dijkstra会计算到所有点的最短路径,这是一种浪费。

A*算法

A*算法是Dijkstra算法的一种优化,它引入了启发式函数(Heuristic Function)来指导搜索方向,从而提高了搜索效率。

  • 基本原理
    A*算法的核心是评估函数 f(n)=g(n)+h(n)f(n) = g(n) + h(n)

    • g(n)g(n):从起点到当前节点 n 的实际代价(已走过的路径长度)。
    • h(n)h(n):从当前节点 n 到目标节点的估计代价(启发式函数),例如欧几里得距离或曼哈顿距离。
    • f(n)f(n):从起点经过 n 到终点的总估计代价。

    A*算法总是优先扩展 f(n)f(n) 值最小的节点。

  • A*算法步骤

    1. 初始化
      • 创建两个集合:open_set(待探索的节点)和 closed_set(已探索的节点)。
      • 将起点加入 open_set
      • 初始化起点到自身的 g(start_node)=0g(start\_node) = 0,对所有其他节点 g(n)=g(n) = \infty
      • 初始化起点到自身的 f(start_node)=h(start_node)f(start\_node) = h(start\_node),对所有其他节点 f(n)=f(n) = \infty
    2. 循环:当 open_set 不为空时:
      • open_set 中选择 f(n)f(n) 值最小的节点 current
      • 如果 current 是目标节点,则回溯路径并返回。
      • currentopen_set 移除,并添加到 closed_set
      • 扩展邻居:对于 current 的每个邻居 neighbor
        • 如果 neighbor 已在 closed_set 中,则跳过。
        • 计算从起点经过 currentneighbor 的新代价:tentative_g=g(current)+cost(current,neighbor)tentative\_g = g(current) + cost(current, neighbor)
        • 如果 tentative_g 小于 g(neighbor)g(neighbor),或者 neighbor 不在 open_set 中:
          • 更新 g(neighbor)=tentative_gg(neighbor) = tentative\_g
          • 更新 f(neighbor)=g(neighbor)+h(neighbor)f(neighbor) = g(neighbor) + h(neighbor)
          • 记录 neighbor 的前驱节点为 current
          • 如果 neighbor 不在 open_set 中,则将其加入 open_set
  • 启发式函数的选择

    • 欧几里得距离h(n)=(xnxgoal)2+(ynygoal)2h(n) = \sqrt{(x_n - x_{goal})^2 + (y_n - y_{goal})^2}
    • 曼哈顿距离h(n)=xnxgoal+ynygoalh(n) = |x_n - x_{goal}| + |y_n - y_{goal}|
    • 最佳实践:启发式函数必须是“可接受的”(admissible),即 h(n)h(n) 永不大于从 n 到目标的真实最短路径代价。如果启发式函数也是“一致的”(consistent),则A*算法找到的路径是最优的。欧几里得距离和曼哈顿距离都是可接受的。
  • A*算法的伪代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def A_star(start, goal, graph, heuristic):
open_set = {start}
came_from = {} # 用于重建路径

g_score = {node: float('inf') for node in graph.nodes}
g_score[start] = 0

f_score = {node: float('inf') for node in graph.nodes}
f_score[start] = heuristic(start, goal)

while open_set:
current = min(open_set, key=lambda node: f_score[node])

if current == goal:
return reconstruct_path(came_from, current)

open_set.remove(current)

for neighbor in graph.neighbors(current):
tentative_g_score = g_score[current] + graph.get_edge_cost(current, neighbor)

if tentative_g_score < g_score[neighbor]:
came_from[neighbor] = current
g_score[neighbor] = tentative_g_score
f_score[neighbor] = g_score[neighbor] + heuristic(neighbor, goal)
if neighbor not in open_set:
open_set.add(neighbor)

return None # No path found

def reconstruct_path(came_from, current):
total_path = [current]
while current in came_from:
current = came_from[current]
total_path.append(current)
return total_path[::-1] # Reverse to get path from start to goal
  • 优点:在保证最优性的前提下,比Dijkstra算法效率更高,尤其是在大型图中。
  • 缺点:在障碍物密集或路径点非常多的高维空间中,计算量依然较大。对于连续空间,需要将其离散化为网格图或拓扑图。

在自动驾驶中,A算法常用于在高精地图的路网拓扑图上规划宏观路径。例如,车辆从一个城市到另一个城市,A可以规划出经过哪些主要道路和交叉口。

采样算法

当环境复杂、障碍物不规则,或者状态空间维度较高时(例如,机器人不仅仅有位置,还有姿态、关节角度等),传统的图搜索算法可能效率低下。采样算法通过在状态空间中随机采样点来构建搜索树或图,从而避免了对整个空间的显式表示。

快速随机探索树 (Rapidly-exploring Random Tree - RRT)

RRT是一种用于在连续、高维空间中快速探索的路径规划算法。它不是直接在图中搜索,而是构建一棵快速向未知区域扩展的树。

  • 基本原理

    1. 初始化:从起点 qstartq_{start} 开始,构建一棵树 TT
    2. 随机采样:在配置空间(例如,车辆的X, Y坐标和航向角)中随机采样一个点 qrandq_{rand}
    3. 寻找最近节点:在树 TT 中找到距离 qrandq_{rand} 最近的节点 qnearestq_{nearest}
    4. 扩展新节点:从 qnearestq_{nearest}qrandq_{rand} 的方向,以固定步长 Δq\Delta q 扩展,生成新节点 qnewq_{new}。在生成 qnewq_{new} 的过程中,需要进行碰撞检测,确保从 qnearestq_{nearest}qnewq_{new} 的路径是无碰撞的。
    5. 添加到树:如果 qnewq_{new} 是合法的(无碰撞),则将 qnewq_{new} 添加到树 TT 中,并将 qnearestq_{nearest} 设置为 qnewq_{new} 的父节点。
    6. 重复:重复步骤2-5,直到 qnewq_{new} 靠近目标点 qgoalq_{goal} 或达到最大迭代次数。
  • RRT算法的伪代码概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def RRT_Plan(start_node, goal_node, obstacles, max_iterations, step_size):
tree = {start_node: None} # Node -> Parent
nodes = [start_node]

for _ in range(max_iterations):
q_rand = generate_random_point() # Sample a random point in the space

q_nearest = find_nearest_node(q_rand, nodes) # Find the nearest node in the tree

q_new = steer(q_nearest, q_rand, step_size) # Steer from q_nearest towards q_rand with step_size

if is_valid_path(q_nearest, q_new, obstacles): # Check for collisions
nodes.append(q_new)
tree[q_new] = q_nearest
if distance(q_new, goal_node) < some_threshold:
# Path found, reconstruct and return
return reconstruct_path(tree, q_new)
return None # No path found
  • 优点
    • 适用于高维空间和复杂障碍物环境。
    • 探索性强,能快速找到一条可行路径(但不保证最优)。
    • 增量式构建,可以在线运行。
  • 缺点
    • 找到的路径通常不是最优的,可能存在很多不必要的绕行。
    • 对采样点分布敏感。
    • 生成路径不平滑,需要后处理(如路径平滑)。

RRT* (RRT-Star)

RRT* 是 RRT 的一个改进版本,旨在找到渐进最优的路径。它在 RRT 的基础上增加了“重新布线”(Rewiring)步骤。

  • 基本原理
    在添加新节点 qnewq_{new} 到树中之后,RRT* 会进行两个额外的优化步骤:

    1. 选择父节点:在 qnewq_{new} 周围的某个半径范围内,寻找所有能通过更短路径到达 qnewq_{new} 的节点 qneighborq_{neighbor}。选择其中代价最低的作为 qnewq_{new} 的父节点。
    2. 重新布线:对于 qnewq_{new} 周围半径范围内的其他邻居节点 qneighborq_{neighbor},如果通过 qnewq_{new} 到达 qneighborq_{neighbor} 的代价更低,则将 qneighborq_{neighbor} 的父节点重新设置为 qnewq_{new}
  • 优点:渐进最优性,即随着采样点的增加,找到的路径会逐渐趋近于最优路径。

  • 缺点:相比RRT,计算开销更大,收敛速度可能较慢。

RRT及其变体在自动驾驶中常用于全局路径规划的阶段,特别是在没有预先建模的复杂停车场或野外环境下,或者需要快速探索未知区域时。然而,由于生成路径的不平滑性,通常需要结合后续的平滑处理。

优化算法

全局路径规划有时也可以被建模为一个优化问题,特别是当路径需要满足特定的平滑性或效率约束时。这类方法通常会定义一个成本函数,然后通过优化技术来找到使成本函数最小化的路径。

  • 基本原理
    将路径表示为参数曲线(如多项式、样条曲线),然后构建一个包含平滑性、安全性、效率等多种目标的成本函数。利用数值优化方法(如梯度下降、序列二次规划SQP)来求解。

  • 成本函数示例
    J=w1Jsmoothness+w2Jsafety+w3JefficiencyJ = w_1 \cdot J_{smoothness} + w_2 \cdot J_{safety} + w_3 \cdot J_{efficiency}
    其中:

    • JsmoothnessJ_{smoothness}:与路径的曲率、曲率变化率、加速度等相关,用于保证乘坐舒适性。
    • JsafetyJ_{safety}:与路径到障碍物的距离、碰撞风险等相关。
    • JefficiencyJ_{efficiency}:与路径长度、行驶时间等相关。
  • 优点

    • 能够生成非常平滑且满足多种约束的路径。
    • 可以很好地处理车辆的运动学和动力学约束。
  • 缺点

    • 计算复杂度高,可能不适用于实时性要求极高的场景。
    • 容易陷入局部最优。
    • 对初始路径的质量敏感。

在自动驾驶中,优化方法更多地应用于局部路径规划和轨迹优化阶段,以生成精细、平滑的轨迹。然而,其概念和一些技术也可以扩展到全局路径规划,特别是在需要生成非常高质量的参考路径时。

局部路径规划算法

局部路径规划是自动驾驶中最具挑战性、也最活跃的研究领域之一。它需要实时应对动态变化的道路环境,生成一条平滑、安全、舒适且可执行的轨迹。

动态窗口法 (Dynamic Window Approach - DWA)

动态窗口法是一种经典的局部避障算法,它在车辆的允许速度空间内进行采样,并评估每种采样速度下的可达轨迹。

  • 基本原理
    DWA的核心思想是在车辆的“动态窗口”内(即当前时刻到下一时刻车辆所有可能的线速度和角速度组合)进行搜索。

    1. 定义速度空间

      • 车辆的最大/最小速度、最大/最小角速度。
      • 电机和刹车系统的加速度限制,决定了在短时间内速度的变化范围。
      • 当前车速和角速度,结合车辆的加速度限制,确定一个“动态窗口” [vmin,vmax][v_{min}, v_{max}][ωmin,ωmax][\omega_{min}, \omega_{max}]。这个窗口代表了车辆在下一个时间步内可以达到的所有合法速度。
    2. 轨迹预测

      • 在动态窗口内,以一定的分辨率采样多组 (v,ω)(v, \omega) 组合。
      • 对于每组 (v,ω)(v, \omega),根据车辆的运动模型(如差分驱动模型、阿克曼转向模型),预测未来一小段时间内的轨迹(例如,未来 TT 秒的轨迹)。
    3. 轨迹评估

      • 对每条预测轨迹进行评估,计算其得分。评估函数通常考虑以下几个方面:
        • 目标导向性 (Heading):轨迹终点是否接近目标方向。
        • 障碍物距离 (Clearance):轨迹上离最近障碍物的最小距离。
        • 速度 (Velocity):轨迹的平均速度,通常希望速度尽可能高。
        • 平滑性/舒适性 (Smoothness/Comfort):轨迹的曲率、速度变化等。

      一个典型的评估函数可能如下:
      G(v,ω)=αheading(v,ω)+βdist(v,ω)+γvel(v,ω)G(v, \omega) = \alpha \cdot \text{heading}(v, \omega) + \beta \cdot \text{dist}(v, \omega) + \gamma \cdot \text{vel}(v, \omega)
      其中:

      • heading(v,ω)\text{heading}(v, \omega):衡量轨迹终点与目标方向的对齐程度。
      • dist(v,ω)\text{dist}(v, \omega):衡量轨迹与障碍物的最近距离。
      • vel(v,ω)\text{vel}(v, \omega):衡量当前速度 vv 的大小。
      • α,β,γ\alpha, \beta, \gamma:权重系数,用于平衡不同目标。

      注意:如果轨迹在预测时间内与障碍物发生碰撞,该轨迹的得分会非常低(甚至直接排除)。

    4. 选择最佳轨迹:选择得分最高的 (v,ω)(v, \omega) 组合作为当前时刻的控制指令。

    5. 重复:在下一个时间步重复上述过程。

  • DWA的伪代码概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def DWA_Plan(robot_state, obstacles, goal_point, config):
# 1. Calculate the dynamic window [v_min, v_max, omega_min, omega_max]
# based on current velocity, acceleration limits, and system max/min limits
dynamic_window = calculate_dynamic_window(robot_state, config)

best_score = -float('inf')
best_velocity = (0, 0) # (linear_vel, angular_vel)

# 2. Sample velocities within the dynamic window
for v_sample in np.arange(dynamic_window.v_min, dynamic_window.v_max, config.v_resolution):
for omega_sample in np.arange(dynamic_window.omega_min, dynamic_window.omega_max, config.omega_resolution):
# 3. Predict trajectory for a short look-ahead time (e.g., config.predict_time)
predicted_trajectory = predict_trajectory(robot_state, v_sample, omega_sample, config.predict_time, config.dt)

# 4. Evaluate the trajectory
# - Heading: Alignment with goal
# - Clearance: Minimum distance to obstacles
# - Velocity: Desired speed
# - IsCollision: Boolean flag if collision occurs
score, is_collision = evaluate_trajectory(predicted_trajectory, obstacles, goal_point, config)

if not is_collision and score > best_score:
best_score = score
best_velocity = (v_sample, omega_sample)

return best_velocity
  • 优点
    • 实时性好,计算效率高。
    • 能够有效地进行动态避障。
    • 考虑了车辆的运动学约束。
  • 缺点
    • 容易陷入局部最优(例如,在狭窄通道中可能无法找到出口)。
    • 对预测时间窗的选择敏感。
    • 不直接处理车辆的动力学约束(如轮胎滑动)。
    • 在复杂场景(如拥堵、多车并线)下的表现有限。

DWA在机器人导航,特别是移动机器人领域非常流行,也常用于自动驾驶车辆的低速、简单避障场景。

人工势场法 (Artificial Potential Field - APF)

人工势场法是一种直观且实现简单的局部路径规划方法。它通过模拟物理势场来引导车辆运动。

  • 基本原理

    1. 引力场:目标点对车辆产生一个引力,将车辆吸引向目标。
    2. 斥力场:障碍物对车辆产生一个斥力,将车辆推离障碍物。
    3. 合力:车辆在每个时刻所受的合力是引力与斥力的矢量和,车辆沿着合力的方向运动。
  • 引力函数
    Uatt(q)=12kattqqgoal2U_{att}(q) = \frac{1}{2} k_{att} \cdot ||q - q_{goal}||^2
    其中:

    • qq 是车辆当前位置。
    • qgoalq_{goal} 是目标位置。
    • kattk_{att} 是引力系数。
      引力 Fatt(q)=Uatt(q)=katt(qqgoal)F_{att}(q) = -\nabla U_{att}(q) = -k_{att} \cdot (q - q_{goal})
  • 斥力函数
    Urep(q)={12krep(1d(q)1d0)2if d(q)d00if d(q)>d0U_{rep}(q) = \begin{cases} \frac{1}{2} k_{rep} \left(\frac{1}{d(q)} - \frac{1}{d_0}\right)^2 & \text{if } d(q) \le d_0 \\ 0 & \text{if } d(q) > d_0 \end{cases}
    其中:

    • d(q)d(q) 是车辆到最近障碍物的距离。
    • d0d_0 是障碍物影响范围。
    • krepk_{rep} 是斥力系数。
      斥力 Frep(q)=Urep(q)F_{rep}(q) = -\nabla U_{rep}(q),其方向远离障碍物。
  • 合力
    Ftotal(q)=Fatt(q)+Frep,i(q)F_{total}(q) = F_{att}(q) + \sum F_{rep, i}(q)
    车辆沿着 FtotalF_{total} 的方向移动一个步长。

  • 优点

    • 概念简单,易于实现。
    • 实时性好,计算量小。
    • 能够实时避障。
  • 缺点

    • 局部极小值问题:当引力和斥力相互抵消时,车辆可能陷入局部极小值,无法到达目标。例如,在凹形障碍物或U形障碍物中。
    • 目标不可达:当目标点被障碍物包围时,引力可能被斥力抵消,导致无法到达。
    • 振荡问题:在狭窄通道或障碍物附近,车辆可能出现来回振荡。
    • 难以处理车辆运动学/动力学约束。

由于局部极小值问题,APF在自动驾驶中通常不作为独立的路径规划算法,但其引力/斥力的思想常被融合到其他基于优化的方法中,作为成本函数的一部分。

采样和轨迹评估 (Sampling and Trajectory Evaluation)

这种方法是现代局部路径规划的常用范式,特别是在复杂的城市环境中。它结合了采样和优化思想。

  • 基本原理

    1. 轨迹生成/采样:在车辆的预测范围内,生成大量可能的候选轨迹。这些轨迹可以是:

      • 多项式曲线:例如,五次多项式 (quintic polynomial) 可以保证位置、速度、加速度的连续性,满足车辆运动学约束。
      • 样条曲线:如B样条、NURBS,提供高度平滑性。
      • 螺旋线 (Clothoids):曲率随弧长线性变化的曲线,符合车辆的转向特性。
      • 状态采样:在终点处采样不同的速度、位置、方向组合,然后反向生成轨迹。
      • Frenet坐标系:将笛卡尔坐标系下的轨迹规划问题解耦为纵向(沿参考线)和横向(垂直于参考线)规划,简化了问题。在Frenet坐标系下生成轨迹,可以更好地利用车道信息。

      例如,在Frenet坐标系下,横向运动 d(s)d(s) 和纵向运动 s(t)s(t) 可以分别用五次多项式表示:
      d(t)=a0+a1t+a2t2+a3t3+a4t4+a5t5d(t) = a_0 + a_1 t + a_2 t^2 + a_3 t^3 + a_4 t^4 + a_5 t^5
      s(t)=b0+b1t+b2t2+b3t3+b4t4+b5t5s(t) = b_0 + b_1 t + b_2 t^2 + b_3 t^3 + b_4 t^4 + b_5 t^5
      通过给定初始状态(位置、速度、加速度)和终点状态,可以求解出多项式系数。

    2. 轨迹评估:对每条生成的候选轨迹进行严格评估,通常考虑以下几个方面:

      • 安全性:是否与障碍物发生碰撞(静态和动态)。这是最高优先级。
      • 舒适性:轨迹的平滑性(加速度、加加速度、曲率变化率是否在合理范围内)。
      • 可行性:是否满足车辆的运动学和动力学约束。
      • 效率:是否尽可能快地到达目标点或保持期望速度。
      • 合法性:是否遵守交通规则(车道线、限速等)。
      • 与高层规划的一致性:是否符合行为规划的意图(如车道保持、变道)。

      评估通常通过定义一个加权成本函数来完成:
      Cost=wobsCobs+wsmoothCsmooth+wvelCvel+Cost = w_{obs} \cdot C_{obs} + w_{smooth} \cdot C_{smooth} + w_{vel} \cdot C_{vel} + \dots
      其中 CobsC_{obs} 是碰撞风险成本,CsmoothC_{smooth} 是平滑性成本,CvelC_{vel} 是速度偏差成本等。

    3. 选择最佳轨迹:选择得分最高的轨迹作为当前时刻的执行轨迹。

    4. 轨迹修剪与跟踪:选择的轨迹通常只执行一小部分,然后重新规划。车辆控制模块会跟踪这条轨迹。

  • 优点

    • 能够生成平滑、安全、满足车辆约束的轨迹。
    • 能够有效处理动态障碍物。
    • 模块化设计,易于扩展不同的成本项。
  • 缺点

    • 需要生成和评估大量的轨迹,计算量较大。
    • 需要精心设计成本函数和权重。
    • 在极端复杂或拥堵场景下,采样空间可能难以覆盖所有最优解。

这是Apollo、Autoware等主流自动驾驶平台中广泛采用的局部路径规划方法。

模型预测控制 (Model Predictive Control - MPC)

模型预测控制是一种先进的控制策略,近年来在自动驾驶轨迹规划和控制中扮演越来越重要的角色。它将规划和控制紧密结合,本质上是一个滚动优化问题。

  • 基本原理
    MPC的核心思想是:

    1. 系统模型:建立车辆的运动学或动力学模型,用于预测车辆未来的状态。
    2. 预测与优化:在每个时间步,MPC利用车辆模型预测未来一段时间(预测时域 NpN_p)内的系统行为。在此预测时域内,它求解一个开环优化问题,计算出一系列最优控制输入序列(例如,方向盘转角、油门/刹车开度),使得一个定义的成本函数最小化,同时满足各种约束(如障碍物规避、车辆运动学/动力学限制)。
    3. 滚动优化:MPC只执行优化得到的第一个控制输入,然后舍弃其余的控制输入。在下一个时间步,它再次测量当前系统状态,重复上述优化过程。这种“滚动”或“预测-校正”机制使得MPC能够应对系统模型不确定性、外部扰动和环境变化。
  • 成本函数 (Objective Function)
    MPC的成本函数通常包含以下几项:

    • 轨迹跟踪误差:使车辆尽可能接近参考路径。
    • 控制输入平滑性:减小控制输入的剧烈变化,提高乘坐舒适性。
    • 速度偏差:使车辆保持期望速度。
    • 障碍物规避:惩罚车辆与障碍物之间的距离过近。

    例如,一个简化的成本函数可以表示为:
    J=k=0Np1(w1qkqref,k2+w2ukuprev2+w3vkvdes2)+ConstraintPenaltiesJ = \sum_{k=0}^{N_p-1} (w_1 ||q_k - q_{ref,k}||^2 + w_2 ||u_k - u_{prev}||^2 + w_3 ||v_k - v_{des}||^2) + \text{ConstraintPenalties}
    其中:

    • qkq_kkk 时刻的预测状态。
    • qref,kq_{ref,k}kk 时刻的参考路径点。
    • uku_kkk 时刻的控制输入。
    • uprevu_{prev} 是上一时刻的控制输入。
    • vkv_kkk 时刻的预测速度。
    • vdesv_{des} 是期望速度。
    • wiw_i 是权重系数。
    • ConstraintPenalties\text{ConstraintPenalties} 用于处理软约束(如障碍物距离)。
  • 约束条件 (Constraints)

    • 车辆运动学/动力学约束:最大/最小速度、加速度、横向加速度、转向角限制等。
    • 环境约束:车道边界、道路曲率、障碍物位置等。
    • 安全约束:与障碍物的最小安全距离。
  • MPC的伪代码概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def MPC_Plan_and_Control(robot_state, reference_path, obstacles, config):
# 1. Define optimization problem for the current time step
# - States: x, y, yaw, vx, vy, ...
# - Controls: steer_angle_rate, acceleration_rate, ...
# - Predict future states using vehicle model over a prediction horizon Np

# 2. Formulate objective function:
# - Minimize tracking error to reference_path
# - Minimize control effort / ensure smoothness
# - Maximize speed (or minimize time)
# - Penalize proximity to obstacles (soft constraints)

# 3. Define constraints:
# - Vehicle dynamics (e.g., max/min speed, acceleration, jerk, steer limits)
# - Non-holonomic constraints (for cars)
# - Obstacle avoidance (hard constraints or soft penalties)
# - Road boundaries

# 4. Solve the optimization problem
# This is typically a Quadratic Programming (QP) or Non-Linear Programming (NLP) problem
# Requires efficient solvers (e.g., OSQP, IPOPT, ACADO)
optimal_control_sequence = solve_optimization_problem(robot_state, reference_path, obstacles, config)

# 5. Apply the first control command
first_control_command = optimal_control_sequence[0]
apply_to_vehicle(first_control_command)

# 6. Re-plan at the next time step (receding horizon)
# The loop continues at the control frequency
  • 优点
    • 能够显式地处理复杂的运动学和动力学约束。
    • 能够处理多目标优化,实现安全性、舒适性和效率的平衡。
    • 具有预测能力,能够预见未来的系统行为和约束,从而提前采取行动。
    • 鲁棒性强,能够应对模型不确定性和外部扰动。
  • 缺点
    • 计算复杂度高,对求解器的实时性要求极高。
    • 需要精确的车辆模型。
    • 对参数(权重、时域)调优困难。
    • 非凸优化问题可能陷入局部最优。

MPC是目前自动驾驶领域,特别是高速、复杂场景下轨迹规划和控制的热点。许多高级驾驶辅助系统(ADAS)和L3/L4级自动驾驶系统都广泛采用了MPC技术。

融合与挑战

自动驾驶的路径规划并非简单地选择某一种算法,而是将多种算法和策略进行有机融合,以应对不同层次、不同场景的复杂需求。

全局与局部路径规划的融合

  • 瀑布流式 (Waterfall):全局路径规划提供一条宏观参考路径,行为规划根据此路径和实时感知信息做出决策,然后局部路径规划在此基础上生成可执行的轨迹。这是最常见的架构。
  • 混合式 (Hybrid):局部规划不仅考虑当前局部障碍物,还会参考全局路径的一部分,避免局部规划偏离全局路径太远,或陷入局部死胡同。
  • 分层优化 (Hierarchical Optimization):将不同层次的规划问题建模为优化问题,高层规划为低层规划提供软约束或参考,低层规划则在满足自身硬约束的前提下,尽可能接近高层规划的目标。

不确定性处理

自动驾驶环境的固有不确定性是路径规划的巨大挑战。

  • 传感器噪声:雷达、激光雷达、摄像头的数据并非百分之百准确。
  • 预测误差:对其他车辆和行人行为的预测总是有误差的。
  • 定位误差:GPS、惯导、高精地图匹配都会有误差。

应对策略包括:

  • 鲁棒规划:设计算法时考虑最坏情况,或在规划中加入安全裕度。
  • 概率规划:将不确定性建模为概率分布,规划的目标是最小化碰撞概率,而不是仅仅避免确定性碰撞。例如,在MPC中引入随机性或模糊性。
  • 多假设跟踪/预测:对其他交通参与者生成多种可能的行为预测,并为每种可能性规划应对策略。
  • 强化学习:通过与环境的交互,学习在不确定环境中做出最优决策的策略。

交互式驾驶与人类行为预测

在混合交通流中,自动驾驶汽车需要与人类驾驶员和行人进行交互。

  • 意图识别:通过对人类驾驶行为(如车速、方向、打转向灯)的观察,预测其意图(如变道、停车)。深度学习模型在这方面表现突出。
  • 社会化路径规划:规划的轨迹不仅要考虑自身安全,还要考虑其他交通参与者的舒适度和可预测性。例如,不要突然加速让后车措手不及,或者在并道时给出清晰的意图。
  • 博弈论:将交通场景建模为博弈,自动驾驶汽车和其他参与者之间进行动态博弈,寻找纳什均衡解。

计算效率与实时性

自动驾驶对实时性有严苛要求。

  • 算法优化:使用高效的数据结构、剪枝策略、并行计算等。
  • 硬件加速:利用GPU、FPGA、ASIC等专用硬件加速计算。
  • 近似算法:在保证性能的前提下,牺牲一定最优性以换取计算速度。
  • 增量式规划:不每次从头开始计算,而是基于上次规划结果进行小幅更新。

安全与鲁棒性

  • 冗余设计:采用多传感器、多算法融合,即使部分系统失效也能保持功能。
  • 故障检测与安全停车:系统应能检测自身故障,并在必要时执行安全停车操作。
  • 形式化验证:在某些关键安全模块上使用数学方法严格证明其正确性。
  • 大规模测试:通过仿真、封闭场地测试和实际道路测试来验证算法的鲁棒性。

深度学习在路径规划中的应用

近年来,深度学习为路径规划带来了新的范式。

  • 端到端学习 (End-to-End Learning):直接从传感器输入(如图像、激光雷达点云)映射到控制输出(如方向盘转角、速度)。
    • 优点:简化了系统架构,减少了中间模块的误差累积。
    • 缺点:可解释性差,难以保证安全性,对训练数据依赖大,泛化能力有待提高。目前主要用于辅助驾驶或特定简单场景。
  • 强化学习 (Reinforcement Learning - RL):将路径规划问题建模为马尔可夫决策过程(MDP),通过与环境交互,学习最优的驾驶策略。
    • 优点:能够学习复杂、非线性的策略,处理动态和不确定环境。
    • 缺点:训练效率低,需要大量的模拟或真实数据,难以收敛,难以保证安全性和泛化性。通常用于行为决策或辅助规划。
  • 预测模块的增强:深度学习在车辆和行人行为预测方面表现出色,为规划提供了更准确的未来环境信息。
  • 成本函数学习:通过模仿学习或逆强化学习,从人类驾驶数据中学习路径规划的成本函数或偏好。
  • 语义规划:结合语义信息(如道路类型、交通参与者类别)进行规划,使规划更符合人类直觉。

虽然端到端和强化学习在路径规划领域潜力巨大,但由于安全性和可解释性的限制,目前在L4/L5级自动驾驶中,它们更多地作为辅助工具,与传统的基于规则和优化的方法结合使用,形成混合式系统。

实际案例与开源项目

路径规划算法并非纸上谈兵,它们已广泛应用于各大自动驾驶公司的实践中。

  • 百度Apollo:作为全球领先的自动驾驶开放平台之一,Apollo的规划模块采用了分层架构。其局部规划模块(EMPlannerLatticePlanner)广泛使用了采样-评估的方法,结合了预测模块的信息,并通过优化技术生成轨迹。
  • Autoware:另一个流行的开源自动驾驶平台。其规划模块也包含了多种经典算法的实现,如A*用于全局路径,DWA用于局部避障,以及基于优化和样条曲线的轨迹生成器。
  • Waymo/Cruise:虽然这些商业公司并未完全开源其核心算法,但从其公开论文和专利中可以看出,它们普遍采用了多层次的规划架构,深度融合了基于模型的优化方法(如MPC)、采样评估策略以及对人类行为的复杂预测。

这些项目的实践表明,路径规划是一个多学科交叉、持续演进的领域。没有“一招鲜吃遍天”的算法,而是需要根据具体场景和性能要求,灵活组合和优化不同的技术。

结论

自动驾驶的路径规划,是车辆从“看到”环境到“如何行动”的桥梁,也是实现安全、高效、舒适自动驾驶的基石。从经典的图搜索算法A*,到应对动态环境的DWA和采样-评估方法,再到结合强大预测能力的MPC,路径规划算法体系正在不断进化。

我们探讨了:

  • 路径规划在自动驾驶系统中的核心地位与挑战。
  • 全局、行为、局部三个层次的规划职责。
  • A*和RRT等全局路径规划算法的原理与应用。
  • DWA、人工势场和采样-评估、MPC等局部路径规划算法的细节与优劣。
  • 以及如何融合不同算法、应对不确定性、预测人类行为、提升计算效率和保障安全性,以及深度学习带来的新机遇。

尽管取得了巨大进展,路径规划仍然面临诸多挑战:如何在极端恶劣天气下保持鲁棒性?如何处理罕见或“长尾”事件?如何实现真正自然、类人的驾驶交互?如何确保规划系统的可解释性和可验证性?这些问题,需要全球研究者和工程师们持续的探索和创新。

未来,我们可能会看到更加智能、自适应的规划算法,它们能更好地学习人类驾驶的智慧,在复杂交通流中做出更优的决策。机器学习和优化理论的交叉融合将更加深入,计算硬件的进步也将为实时、复杂的规划提供更强大的支撑。

自动驾驶的征途充满挑战,但前景光明。路径规划算法作为其核心驱动力之一,将继续引领我们走向更加安全、高效、便捷的出行未来。

希望这篇深度解析能帮助你对自动驾驶的路径规划算法有一个全面而深入的理解。如果你有任何问题或想法,欢迎在评论区与我交流!


博主:qmwneb946
日期:2023年10月27日