一、全局路径规划概述
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,看看它们是怎么在路网上找最短路径的。