2. 轨迹规划基础
在自动驾驶系统中,规划模块承担着“决策大脑”的角色。许多初学者容易将路径规划与轨迹规划混为一谈,但二者在数学表达、求解维度与工程落地上存在本质差异。本章将从核心概念出发,厘清路径与轨迹的边界,并深入解析Frenet坐标系、SL与ST语义以及轨迹的时空表示方法。这些基础概念是理解后续优化算法(如二次规划、样条曲线、EM Planner)的基石,也是工程调试中定位问题(如“为什么车辆在换道时抖动”或“为什么规划轨迹会穿越障碍物”)的关键入口。
上图展示了本章核心概念之间的逻辑关系:路径规划是轨迹规划的空间子集,而Frenet坐标系为两者提供了统一的语言框架,SL与ST则分别从空间和时空两个维度对规划问题进行解耦。下面我们逐一展开。
2.1 路径规划与轨迹规划:从几何到时空的跃迁
核心原理
路径规划(Path Planning)解决的是“在哪里走”的问题,其输出是一条无碰撞的几何曲线,通常表示为一系列离散点或参数化曲线(如多项式、B样条)。路径本身不携带时间信息,也不包含速度、加速度等运动学属性。例如,A*算法在栅格地图上搜索出的最短路径,或Hybrid A*在连续空间中生成的满足车辆运动学约束的曲线,都属于路径规划范畴。
轨迹规划(Trajectory Planning)则进一步解决“何时以多快的速度到达”的问题。轨迹是路径的时间参数化,即每个路径点都关联一个期望到达时刻、速度、加速度甚至加加速度(Jerk)。轨迹规划必须满足车辆动力学约束(如最大加速度、转向速率)、舒适性约束(如Jerk限制)以及动态障碍物的时空避让要求。
判断方法
在实际工程中,判断一个模块属于路径规划还是轨迹规划,可以看其输出数据结构:
- 若输出为
std::vector<PathPoint>,其中PathPoint仅包含x、y、heading、kappa(曲率),则为路径规划。 - 若输出为
std::vector<TrajectoryPoint>,其中TrajectoryPoint包含x、y、heading、kappa、v、a、relative_time,则为轨迹规划。
此外,从求解维度看,路径规划在二维空间(x-y或s-l)中搜索,而轨迹规划在三维空间(s-l-t)中搜索。Apollo中,路径规划器(如PublicRoadPlanner)生成候选路径,而轨迹规划器(如LatticePlanner、EMPlanner)在候选路径基础上生成带速度信息的轨迹。
案例拆解:换道场景中的路径与轨迹
假设车辆以72km/h(20m/s)行驶在高速公路上,前方500m处有一辆慢车以15m/s行驶,自车需要向左换道超越。
- 路径规划阶段:生成一条从当前车道中心线平滑过渡到左侧车道中心线的几何曲线。该曲线需满足曲率连续、不超出道路边界、不与静态障碍物(如护栏)碰撞。此时,路径上每个点只有位置信息,没有时间标签。
- 轨迹规划阶段:在已生成的路径上,分配时间信息。例如,前2秒内完成横向偏移,同时纵向速度从20m/s逐渐调整到25m/s以完成超车。轨迹上每个点都包含期望到达时间、速度、加速度。若在t=3s时,左侧车道后方有一辆快速接近的车辆,轨迹规划器需要调整速度曲线,避免时空碰撞。
这个案例说明,路径规划只关心“线形是否安全”,而轨迹规划关心“按这个速度走是否安全”。一个常见的工程误区是:只做路径规划而不做轨迹规划,导致车辆在弯道中速度过快或过慢,或者无法应对动态切入的障碍物。
总结复盘
| 维度 | 路径规划 | 轨迹规划 |
|---|---|---|
| 输出维度 | 空间几何(x,y,heading,kappa) | 时空状态(x,y,heading,kappa,v,a,t) |
| 约束类型 | 几何约束、静态障碍物 | 动力学约束、动态障碍物、时间窗 |
| 典型算法 | A*, Hybrid A*, 样条拟合 | Lattice, EM Planner, 二次规划 |
| 调试关注点 | 曲率突变、边界越界 | 速度抖动、加速度超限、碰撞时间 |
2.2 Frenet坐标系:让规划问题“道路化”
核心原理
Frenet坐标系是一种以参考线(通常是道路中心线或车道中心线)为基准的曲线坐标系。它由两个正交方向组成:s方向(纵向,沿参考线的弧长)和l方向(横向,垂直于参考线的偏移距离)。在Frenet坐标系中,车辆位置表示为(s, l),其中s表示车辆在参考线上的投影点对应的弧长,l表示车辆到投影点的有向距离(左侧为正,右侧为负)。
Frenet坐标系的核心优势在于:它将车辆运动分解为纵向运动(沿s方向)和横向运动(沿l方向),使得道路边界、车道线等约束可以简单地表示为l的上下界。例如,车道宽度为3.5m,则l的约束为[-1.75, 1.75](以车道中心线为0)。这种解耦大大简化了优化问题的建模。
坐标转换
实际应用中,车辆状态通常由笛卡尔坐标(x, y, heading, curvature)表示,而规划算法在Frenet坐标系中工作,因此需要频繁进行坐标转换。Apollo中提供了CartesianFrenetConverter工具类,核心转换公式如下:
// 笛卡尔转Frenet
s = s0 + ∫(cos(θ - θr) / (1 - κr * l)) ds
l = (x - xr) * sin(θr) - (y - yr) * cos(θr)
// Frenet转笛卡尔
x = xr - l * sin(θr)
y = yr + l * cos(θr)
θ = arctan( (l' * cos(θr)) / (1 - κr * l) ) + θr
其中,下标r表示参考线上的投影点,κr为参考线曲率,θr为参考线航向角。需要注意的是,当参考线曲率较大或车辆横向偏移较大时,转换误差会增大,因此需要定期重新投影。
实战场景:弯道中的横向控制
在高速弯道中,如果使用笛卡尔坐标直接规划,道路边界约束会变成复杂的非线性不等式。而在Frenet坐标系中,道路边界约束简化为l_min ≤ l ≤ l_max,同时曲率约束可以表示为κ = (l'' - (κr + l * κr^2) * tan(θ - θr)) / ...。这使得优化求解器能够高效处理。
一个典型的工程问题是:当车辆从直道进入弯道时,参考线的曲率发生突变,导致Frenet坐标下的l方向出现跳变。解决方法是使用平滑的参考线(如经过平滑处理的道路中心线),并在转换时采用迭代投影算法(如牛顿法)保证投影点收敛。
2.3 SL与ST语义:空间与时空的解耦表达
SL语义(空间域)
SL图(Station-Lateral)以s为横轴、l为纵轴,将道路展开为二维平面。SL图是路径规划的核心工具,它直观地展示了车辆沿道路纵向位置与横向偏移的关系。在SL图中,静态障碍物被投影为占据一定s和l范围的矩形区域,道路边界表现为l的上下包络线。路径规划的目标就是在SL图中寻找一条从起点(s0, l0)到终点(s1, l1)的曲线,满足避障和边界约束。
SL语义的关键优势在于:它将三维空间问题降维为二维问题,使得动态规划(DP)或样条拟合等算法可以高效求解。Apollo的EM Planner在SL阶段使用动态规划生成粗略路径,再用二次规划进行平滑。
ST语义(时空域)
ST图(Station-Time)以t为横轴、s为纵轴,描述车辆纵向位置随时间的变化。ST图是速度规划的核心工具。动态障碍物的轨迹被投影为ST图中的障碍区域(通常为平行四边形或梯形),表示在特定时间段内,该s区间被障碍物占据。速度规划的目标是生成一条s(t)曲线,避开所有障碍区域,同时满足速度、加速度限制。
ST语义将“何时能走”的问题从空间避障中解耦出来。例如,前方车辆在t=2s到t=4s之间位于s=100m到s=120m区间,则自车的s(t)曲线必须避开这个时空窗口,可以选择减速等待(s曲线在t=2s时低于100m)或提前变道(在SL阶段解决)。
对比与协同
| 维度 | SL图 | ST图 |
|---|---|---|
| 坐标轴 | s(横)、l(纵) | t(横)、s(纵) |
| 主要用途 | 路径几何规划 | 速度/时间规划 |
| 障碍物类型 | 静态障碍物、低速动态障碍物(近似静态) | 动态障碍物(含速度信息) |
| 输出 | l = f(s) 路径曲线 | s = f(t) 速度曲线 |
| 典型算法 | DP + QP | DP + QP 或 样条拟合 |
在Apollo的EM Planner中,SL与ST是串行执行的:先通过SL规划确定路径几何,再在固定路径上通过ST规划确定速度曲线。这种解耦策略大幅降低了求解复杂度,但也带来一个固有限制——当动态障碍物与路径强耦合时(如障碍物横跨多个车道),SL阶段无法准确建模,需要依赖更高层的决策模块(如换道决策)来切换参考线。
2.4 轨迹的时空表示:从离散点到连续函数
核心原理
一条完整的轨迹在数学上可以表示为时间t的函数:状态向量 = [s(t), l(t), v_s(t), v_l(t), a_s(t), a_l(t)]。在实际工程中,轨迹通常以离散点序列存储,每个点包含时间戳、位置、速度、加速度等信息。Apollo的DiscretizedTrajectory类就是这种表示的典型实现,它内部维护一个std::vector<TrajectoryPoint>,并提供插值查询接口。
轨迹的时空表示需要满足以下性质:
- 时间一致性:相邻点的时间间隔应均匀(如0.1s),便于控制模块按固定周期采样。
- 运动学连续性:位置、速度、加速度在相邻点之间应连续,避免突变导致控制抖动。
- 可执行性:轨迹上的每个点都应满足车辆动力学约束(如最大转向角、最大加速度)。
轨迹评估指标
在轨迹生成后,需要从多个维度评估其质量:
- 安全性:与所有障碍物的最小距离是否大于安全阈值(如0.5m)。
- 舒适性:最大Jerk(加加速度)是否小于舒适阈值(如2m/s³)。
- 效率:到达目的地的时间或平均速度是否满足任务要求。
- 可行性:轨迹是否满足车辆运动学约束(如曲率不超过最大转向曲率)。
案例拆解:十字路口左转轨迹
假设车辆在十字路口需要左转,路口宽度为30m,自车以10m/s减速进入路口。轨迹规划器需要生成一条从当前车道到目标车道的时空轨迹。
- SL阶段:在SL图中,规划出一条平滑的左转路径,s从0增长到约50m(含转弯半径),l从0变化到-3.5m(进入目标车道)。
- ST阶段:在ST图中,检测到对向直行车辆在t=3s时通过路口中心,因此自车的s(t)曲线需要在t=3s时避开冲突区域,选择减速至5m/s等待,待对向车辆通过后再加速。
- 轨迹合成:将SL路径与ST速度曲线合成,得到完整的时空轨迹。每个轨迹点包含时间戳、笛卡尔坐标、速度、加速度。
在实车调试中,一个常见问题是:轨迹在转弯处出现速度波动,原因是ST规划中速度曲线与SL路径的曲率耦合不足。解决方法是引入曲率-速度耦合约束,即在曲率较大的区域限制最大速度。
常见误区与总结
- 误区一:将路径规划等同于轨迹规划。忽略时间维度会导致动态避障失效。
- 误区二:在笛卡尔坐标下直接施加道路边界约束。这会导致非线性优化求解困难,应转换到Frenet坐标系。
- 误区三:SL与ST完全独立。实际上,路径的曲率会影响速度规划的上限,需要迭代或耦合优化。
- 误区四:轨迹点越密越好。过密的点会增加计算和通信开销,且对控制模块无显著收益,通常0.1s间隔即可。