一、全局路径规划概述

1.1 自动驾驶系统架构

先聊聊自动驾驶的整体架构。我做了这么多年,发现很多新人一上来就扎进算法细节,结果连系统怎么搭的都没搞明白。

自动驾驶系统,说白了就是三个核心模块:感知决策控制

  • 感知层:负责“看”和“听”。摄像头、激光雷达、毫米波雷达、超声波传感器,这些是车的眼睛和耳朵。它们告诉系统:前方50米有辆车,右侧有个行人,路中间有个锥桶。
  • 决策层:负责“想”。这是大脑。感知层把数据传过来,决策层要回答三个问题:我在哪?我要去哪?我该怎么去?全局路径规划就属于这一层。
  • 控制层:负责“动”。决策层给出了路径和指令,控制层去踩油门、打方向盘、踩刹车。

嗯,这里要注意:感知和决策之间有个定位模块。没有高精度的定位,全局路径规划就是空中楼阁。我在项目里吃过这个亏——定位漂移了半米,规划出来的路径直接怼上了马路牙子。

1.2 全局路径规划的定义与作用

全局路径规划,说白了就是:给定起点和终点,找出一条最优的、可行驶的路径

你打开手机地图,输入家和公司,导航给你一条路线——这就是全局路径规划。只不过自动驾驶的要求更苛刻:

  • 路径必须可行驶(不能穿过花坛、不能逆行)
  • 路径必须安全(避开施工区域、避开事故路段)
  • 路径必须高效(时间最短、能耗最低、或者综合最优)

我个人的习惯是,把全局路径规划比作“战略层”的决策。它不关心你下一秒怎么打方向盘,它只关心:从北京到上海,走京沪高速还是走沿海公路?

那它的作用是什么?三个字:定方向

没有全局路径规划,车就像无头苍蝇。局部路径规划(比如避障、换道)只能在全局路径的“骨架”上做微调。全局路径错了,局部规划再怎么折腾也白搭。

核心观点:全局路径规划是自动驾驶的“顶层设计”。它决定了车辆的大致走向,为后续的局部规划、控制执行提供了约束和参考。

1.3 规划问题的数学建模

好,接下来是硬核部分。怎么把“找一条路”这件事,用数学语言描述出来?

我刚开始做规划时,觉得这有什么难的?不就是图搜索吗?后来发现,现实世界比图复杂得多。你想想看,路网不是简单的网格,它有车道、有红绿灯、有转弯限制、有单行道……

所以,数学建模要解决三个核心要素:

1.3.1 状态空间

状态空间,就是车可能处于的所有位置和姿态的集合。通常用 (x, y, θ) 表示:

  • x:车辆在全局坐标系下的横坐标
  • y:车辆在全局坐标系下的纵坐标
  • θ:车辆的朝向角(车头指向)

但实际项目中,状态空间还要考虑速度 v、加速度 a,甚至曲率 κ。为什么?因为有些路径虽然几何上可行,但车速太快过不了弯。我曾经就遇到过这种情况——规划出来的路径曲率太大,车以60km/h的速度根本拐不过去,差点冲上路肩。

1.3.2 动作空间

动作空间,就是车可以执行的操作集合。对于全局路径规划,动作空间通常是离散化的:

  • 直行
  • 左转
  • 右转
  • 掉头

每个动作都对应一个代价(cost)。比如左转的代价可能比直行高,因为左转要等红灯、要避让对向车辆。

1.3.3 代价函数

代价函数是规划问题的核心。它告诉算法:什么样的路径是“好”的。

常见的代价项包括:

代价项 描述 典型权重
路径长度 从起点到终点的总行驶距离
行驶时间 预计耗时,考虑限速和交通状况
能耗 燃油或电量消耗
安全性 经过事故多发区、施工区的惩罚
舒适性 急转弯、频繁加减速的惩罚

代价函数通常写成加权和的形式:

J = w₁ * L + w₂ * T + w₃ * E + w₄ * S + w₅ * C

其中 w₁, w₂, ... 是权重系数。调这些权重,是我觉得最头疼的事。权重设大了,路径可能绕远路;设小了,又可能走危险路段。我一般先用仿真跑几百组参数,再上路实测微调。

1.3.4 约束条件

规划不是无限制的。约束条件包括:

  • 运动学约束:车的转弯半径有限,不能原地掉头(除非是特殊车辆)
  • 交通规则约束:不能逆行、不能闯红灯、不能压实线
  • 道路边界约束:车辆必须在车道内行驶
  • 障碍物约束:路径不能穿过静态障碍物(建筑、护栏)

避坑指南:我曾经在建模时忽略了“转弯半径”这个约束,结果规划出来的路径在纸面上完美无缺,但实际车辆根本执行不了——因为最小转弯半径不够。从那以后,我每次建模都会把运动学约束放在第一位检查。

1.3.5 完整的数学表述

把上面这些综合起来,全局路径规划可以表述为一个优化问题

给定:
  - 起点状态 s_start = (x₀, y₀, θ₀)
  - 终点状态 s_goal = (xₙ, yₙ, θₙ)
  - 路网图 G = (V, E)
  - 代价函数 J

求解:
  路径 P = {s₀, s₁, s₂, ..., sₙ}

使得:
  - J(P) 最小化
  - 满足所有运动学约束
  - 满足所有交通规则约束
  - 不穿过任何障碍物

嗯,这个表述看起来简单,但实际求解时,你会发现:路网图 G 可能包含几万个节点和几十万条边,代价函数可能是非线性的,约束条件可能是非凸的。所以,我们通常用图搜索算法(如 A*、Dijkstra)或者采样方法(如 RRT、PRM)来求解。

至于这些算法具体怎么实现,我们后面章节会详细讲。这里先记住一点:数学建模是规划算法的基石。模型建得不好,算法再牛也白搭。

重要提醒:不要试图一次性建一个“完美”的模型。我建议从最简单的模型开始(比如只考虑路径长度和障碍物),然后逐步增加约束和代价项。每加一项,都要验证它对规划结果的影响。否则,模型复杂度上去了,但你可能根本不知道问题出在哪。

好,这一章就到这里。下一章我们聊聊具体的图搜索算法——A* 和 Dijkstra,看看它们是怎么在路网上找最短路径的。