← 自动驾驶主线

第 6 章 · 共 8 章

规划与轨迹生成(控制接口)

把汇入意图变成可执行轨迹,并交给底层控制

约 9 分钟阅读

决策说"先低速探出,条件满足后汇入"。这句话离方向盘还差一整章。


路径不是轨迹

先分清两个词。路径回答"车从空间的哪里走"——一条线。轨迹回答"每个时刻车在哪里、速度多少、加速度多少"——一条带时间戳的线。决策交下来的"探出后汇入"连路径都不是,只是意图加一组约束;底层控制需要的是轨迹,而且是一条避开障碍、守住交规、车辆物理上做得出来、乘客坐着不难受的轨迹。

这一章讲三条把意图变成轨迹的经典路线——搜索、采样、优化——以及它们共同的失效边界怎么把我们逼向第四条路。顺带说清楚规划的终点:它到底把什么交给底层控制。


搜索:A* 为什么开不了车

最容易想到的方法:把地图打成格子,用 A* 搜一条最短路。问题马上出现——A 不管车辆运动学*。它搜出来的折线可能要求车原地转向 90 度,而真实车辆的前轮转角有上限、转弯有最小半径。路径几何上存在,物理上开不出来。

Hybrid A* 的"Hybrid"就是修这个:节点扩展用连续的车辆运动学模型(从当前状态按离散的几个前轮转角各滚动一小段,长出来的每个后继都是车真能到达的状态),代价计算仍用离散栅格。再配两个工程加速件:一是提前终止——随时试着用 Dubins/Reeds-Shepp 曲线(曲率受限下连接两个位姿的最短曲线族,允许倒车的 RS 曲线一共 48 种)直连目标,无碰撞就收工;二是双启发函数——一个只管运动学不管障碍,一个只管障碍不管运动学。课件用四张对比图说明它们各有一类盲区:前者会把目标朝向不对的代价算漏,后者会把死路的代价算漏,两个各补对方的短板,所以要同时用。

Hybrid A* 擅长非结构化场景——停车场、掉头、狭窄空间。结构化道路上,有更快的路线。


采样:一条定理撑起一个流派

结构化道路的第一步是换坐标系。Frenét 坐标沿参考线展开,把运动拆成纵向位移 s 和横向偏移 l——因为车辆几乎从不垂直于道路移动,这么一拆,"沿路开"变成了两个近似独立的一维问题。

然后是整个采样流派的理论支柱,一条五次多项式定理:最小化 jerk(加加速度,舒适性的核心度量)平方积分的最优轨迹,是五次多项式。这条定理的实际价值是降维:本来"找最优轨迹"是在无穷维函数空间里做泛函优化,现在变成——采样一批终止状态,每个终止状态配一条五次多项式,逐条算代价挑最好。可枚举、可并行、每条都自带平滑性。

纵向的终止状态按工况定义得很直白:跟车(目标位置 = 前车位置减去安全距离,安全距离 = 固定间距 + 时距×车速)、变道(取两车中点)、停车(目标速度恒为零)。横纵各自采样、组合、检查碰撞和加速度限幅,选联合代价最低的。

课件里有一处讲师标红的开放问题,值得记下:**横向和纵向分开采样再组合,怎么保证合成轨迹的曲率符合车辆约束?**没有干净的答案——这是解耦架构的裂缝之一,后面还会裂得更大。


优化:DP 画圈,QP 填线

第三条路线以 Apollo 的 EM Planner 为代表,结构是解耦 + 两段式:路径和速度分开规划,每一边都先动态规划(DP)、后二次规划(QP)。

这里有一个容易看错的架构要点。看框图会以为 DP 的输出是"一条粗糙路径",其实 DP 真正的产物是三件套:粗解、可行走廊(Feasible Tunnel)、离散决策。SL 空间里的 DP 在决定"从障碍物左边绕还是右边绕"(nudge 决策),同时圈出一条凸的可行域;QP 随后在这个凸走廊里求平滑解。DP 负责在非凸世界里做离散选择、画出凸空间,QP 负责在凸空间里精细求解——一句话:"DP 生成凸空间,QP 在凸空间求解"。

速度侧的舞台是 ST 图:横轴时间,纵轴沿路纵向位移。他车的预测轨迹在这张图上投出一条条斜的占用带,自车的速度曲线要从带子的缝隙里穿过去——从障碍带下方过是让行,从上方过是超车。所谓"速度决策",就是选择从每条带子的哪一侧通过;DP 选侧并画出可行域,QP 把折线磨成平滑曲线。


解耦的失效边界,正好落在我们的路口

EM Planner 的总结页自己写了缺点:需要横向纵向联合动作的场景搞不定,例如窄道会车——那种场景里,你走哪条线取决于你什么时候到,什么时候到又取决于你走哪条线,先定路径再配速度的架构天生给不出答案。

回到我们的汇入口:这正是一个强耦合场景。从哪个空间位置切进主路(横向),取决于切入车和后车让出的间隙什么时候出现(时间);反过来,你选择的切入点又改变了通过时机。先画线再配速的规划器在这里会反复给出"路径可行但时机冲突"的答案。

解法是不再解耦:时空联合规划。把 s-l 平面沿时间轴拉成三维 s-l-t 空间,规划直接在这个空间里做。这个空间有一个漂亮的几何直觉:静止障碍物是一根竖直的柱(位置不随时间变),运动障碍物是一片斜面(位置随时间平移)。规划就是在柱和斜面之间找一条三维曲线——空间绕行和时间避让第一次变成了同一个问题的两个投影。

代价也很直接:搜索的动作空间从"转角"变成"转角 × 加速度"的笛卡尔积,维度乘上去了。所以时空联合的工程化版本都在想办法把空间砍小,其中最成体系的是 SSC。


SSC:先修走廊,再铺轨迹

SSC(时空语义走廊)是上一章 EPSILON 的运动规划层——决策与规划在这里合龙:MPDM 选出语义行为并前向仿真出一串期望状态,SSC 沿这串状态在 s-l-t 空间里修一条走廊,再在走廊里优化轨迹。

修走廊分四步:沿仿真状态撒种子点;把每个种子膨胀成时空立方体;膨胀时受语义边界约束——车道线、红灯的时间窗、他车预测占用,撞上哪面墙,那个方向就不许再涨;最后松弛衔接。"语义"二字的含义就在这里:走廊不是纯几何的空腔,它的每一面墙都对应一条交通语义,所以走廊里的任何轨迹天然不压线、不闯灯、不撞预测占用。

轨迹优化用分段贝塞尔曲线 + QP,其中藏着一个非常优雅的技巧:贝塞尔曲线有凸包性质——整条曲线必然落在其控制点的凸包内。于是"轨迹上无穷多个点都要在走廊内"这个没法直接写的约束,变成了"有限个控制点在走廊内"的线性约束。无穷变有限,QP 才解得动。


规划交付什么:控制接口

走到这里,汇入口的完整规划是这样落地的:决策给出"探出"策略后,规划器在 s-l-t 空间检查切入车和后车的占用,生成一条低速越过停止线、任何时刻都能在可见距离内刹停的探出轨迹;确认间隙后,再接一段汇入曲线,湿滑路面下目标加速度取得更低、制动余量留得更大。每个规划周期重算一次,预测一更新,旧轨迹作废。

最终交给底层控制的是一份格式严格的交付物:带时间戳的参考轨迹(每个点含位置、朝向、曲率、速度、加速度)、目标速度与控制约束、轨迹的有效期和重规划触发条件——外加一份双方必须对齐的"合同":坐标系是哪个、时间基准是什么、曲率怎么定义。接口对不齐,一条完美的轨迹会被底层执行成一次画龙。方向盘和制动力怎么产生是控制的事,三门课对控制本身没有展开,本线也止步于这个接口。

至此,模块化链路走通了:像素进来,轨迹出去。下一章换一个问题:当这条链路上的结构化接口一层层丢掉信息、每个模块各自优化却无法联合训练时——端到端拿什么重组这一切。


本章速查

概念 一句话
路径 vs 轨迹 路径是空间的线,轨迹是带时间戳的线;控制只认后者
Hybrid A* 运动学模型扩展节点 + 栅格算代价;双启发函数各补对方盲区;擅长非结构化场景
Frenét 坐标 沿参考线拆成纵向 s + 横向 l,"沿路开"降成两个一维问题
五次多项式定理 最小化 jerk 的最优轨迹是五次多项式——把泛函优化降成"采终点 + 拟合"
DP + QP DP 在非凸空间做离散决策、画出凸可行走廊;QP 在走廊内求平滑解
ST 图 横轴时间、纵轴纵向位移;从障碍带下方过=让行、上方过=超车
解耦失效边界 窄道会车、汇入:走哪条线和什么时候到互相决定,先路径后速度给不出答案
s-l-t 空间 静止障碍是柱、运动障碍是斜面;空间绕行和时间避让合成一个问题
SSC 沿前向仿真状态修带语义墙的时空走廊;凸包性质把无穷点约束变有限控制点约束
控制接口 带时间戳的参考轨迹 + 约束 + 有效期,外加坐标系/时间基准/曲率定义的对齐

材料来源

课程 章节 页码 用在哪
C C-04a 路径与轨迹规划 p3-p12 A* 运动学缺陷、Hybrid A*、Dubins/Reeds-Shepp(48 种)、双启发函数互补
C C-04a 路径与轨迹规划 p14-p28 Frenét 坐标、五次多项式定理、跟车/变道/停车目标、曲率开放问题
C C-04a 路径与轨迹规划 p31-p44 EM Planner、DP 三件套(粗解/可行走廊/离散决策)、ST 图、窄道会车失效边界
C C-04b 时空联合规划 p3-p14 时空分离三步、s-l-t 栅格(柱与斜面)、时空 Hybrid A* 的动作空间代价
C C-04b 时空联合规划 p27-p40 SSC 四步生成、语义边界约束膨胀、贝塞尔凸包性质、与 MPDM/EPSILON 的衔接

继续深挖

02

Planner:一段式端到端怎样生成一条可执行轨迹

当感知、导航与自车状态已经被编码,一段式端到端究竟怎样用 Query、AR、Diffusion 或 Flow Matching 产生轨迹,并在实时预算内选出最后一条?