4. 场景与决策概览
自动驾驶车辆在开放道路上面临的交通环境具有高度动态性和不确定性。从结构化高速公路到复杂的城市交叉口,不同场景对感知、预测、决策与规划模块提出了截然不同的挑战。轨迹规划并非在真空中运行,其输入直接来源于决策模块输出的语义意图(如“向左变道”“在停止线前停车”),而决策模块的合理性又依赖于对场景的准确分类与状态机管理。本章将系统梳理Apollo框架下的场景分类体系,深入剖析决策与轨迹规划之间的耦合关系,并给出工程实践中的关键要点与常见误区。
4.1 场景分类体系与核心原理
场景分类是自动驾驶系统的顶层语义抽象,它将连续、高维的传感器数据流映射为离散的、可管理的驾驶情境。Apollo采用分层场景管理架构:首先由场景管理器(Scenario Manager)根据道路拓扑、交通规则和自车状态识别当前所处场景;然后由状态机(State Machine)在场景内部进行子状态迁移;最后由行为决策器(Behavior Decider)生成具体的驾驶意图。
场景分类的核心原理基于三个维度:道路结构(车道线、交叉口、匝道)、交通参与者(车辆、行人、骑行者)、自车状态(速度、位置、意图)。分类粒度直接影响规划问题的复杂度——过粗的分类会导致规划器面对混合约束难以求解,过细的分类则会造成状态爆炸和策略碎片化。
| 场景类别 | 典型特征 | 规划难点 | Apollo对应模块 |
|---|---|---|---|
| 车道保持 | 结构化道路、车道线清晰、无强交互 | 曲率连续、横向控制精度 | LaneFollowScenario |
| 变道 | 目标车道有间隙、转向灯激活 | 动态间隙选择、安全距离评估 | LaneChangeScenario |
| 交叉口 | 多方向交通流、信号灯/标志 | 冲突消解、时间窗规划 | IntersectionScenario |
| 避障 | 静态/动态障碍物侵入当前车道 | 绕行路径生成、速度协同 | AvoidanceScenario |
| 停车/掉头 | 低速、空间受限、多阶段操作 | 几何约束、多段规划 | Parking/UTurnScenario |
4.2 决策与轨迹规划的耦合机制
决策与轨迹规划的耦合是Apollo系统架构中最关键的接口之一。决策模块输出的是语义级意图,例如“保持当前车道”“准备向左变道”“在停止线前停车”;而轨迹规划模块需要将这些意图转化为数值级轨迹——即一系列带有时间戳的路径点(x, y, θ, v, a)。
耦合的核心在于参考线(Reference Line)的生成。决策模块根据场景和意图选择或生成参考线,规划模块在参考线的Frenet坐标系下进行SL(横向-纵向)和ST(速度-时间)解耦规划。这种耦合方式带来了三个关键优势:
- 降维处理:将二维路径规划问题分解为横向偏移和纵向速度两个一维问题,大幅降低求解复杂度。
- 语义可解释:决策结果可以被人类理解和审计,便于调试和安全性验证。
- 模块解耦:决策器不关心轨迹的具体数值,规划器不关心场景的完整语义,两者通过明确定义的接口通信。
耦合接口的关键数据结构:
// 决策输出(DecisionResult)
struct DecisionResult {
enum Intent { LANE_KEEP, LANE_CHANGE_LEFT, LANE_CHANGE_RIGHT,
STOP, GO, YIELD, OVERTAKE };
Intent intent;
double target_speed; // 目标速度(m/s)
double time_buffer; // 安全时间裕量(s)
std::vector<ObstacleDecision> obstacle_decisions;
};
// 规划输入(PlanningInput)
struct PlanningInput {
const ReferenceLine& reference_line;
const std::vector<const Obstacle*>& obstacles;
const DecisionResult& decision;
const VehicleState& ego_state;
};
4.3 典型场景案例拆解:城市交叉口左转
我们以一个典型的城市交叉口左转场景为例,完整展示场景分类、决策与轨迹规划的耦合过程。该场景位于某城市主干道与次干道交汇处,有交通信号灯,双向四车道,存在对向直行车辆和过街行人。
场景识别阶段:感知模块检测到前方200米处存在交叉口,地图模块提供交叉口几何信息(停止线位置、车道连接关系),场景管理器判定进入IntersectionScenario。状态机初始化为APPROACH(接近)状态。
决策阶段:行为决策器综合信号灯状态(绿灯)、对向车辆距离(80米,速度12m/s)、行人位置(人行道等待)后,输出以下决策:
- 意图:
GO(通过交叉口) - 目标速度:8m/s(限速40km/h,考虑转弯安全)
- 让行策略:对向直行车辆优先,预计通过时间窗为3.5秒后
- 参考线:选择左转车道中心线,曲率半径约25米
轨迹规划阶段:规划器接收决策结果后,在Frenet坐标系下进行解耦规划:
- SL规划:生成从当前车道到目标左转车道的平滑横向偏移曲线,最大横向加速度限制为0.3g,确保乘客舒适。
- ST规划:在ST图中绘制障碍物轨迹,对向直行车辆在t=3.5s时通过冲突点,规划器生成速度曲线,在t=2.8s时到达停止线前减速至5m/s,待对向车辆通过后加速至8m/s完成转弯。
- 轨迹合成:将SL和ST结果合成二维轨迹,进行碰撞检测和曲率校验,最终输出一条时长6.2秒、包含62个轨迹点的完整轨迹。
结果与复盘:实际运行中,系统成功完成左转,最大横向偏差3.2cm,乘客主观舒适度评分8.5/10。但发现一个问题:当行人突然进入人行横道时,决策模块需要0.3秒才能更新意图为YIELD,导致规划器紧急制动。后续优化中,在决策模块增加了行人意图预测(基于行人速度和位置预测其轨迹),将响应时间缩短至0.15秒。
风险提示:在交叉口场景中,决策模块的“犹豫”比“错误”更危险。如果决策器在GO和YIELD之间频繁切换,会导致规划器输出抖动轨迹,严重时可能引发后车追尾。工程实践中应引入决策锁定时间(如1秒内不允许重复切换),并设置最小决策间隔。
4.4 常见误区与工程复盘
在Apollo的实际部署和调试中,我们发现以下高频误区值得特别注意:
| 误区 | 现象 | 根因 | 解决方案 |
|---|---|---|---|
| 场景分类过细 | 状态机频繁切换,规划器来不及响应 | 将连续变化的环境硬切为离散状态 | 引入场景置信度和平滑迁移机制 |
| 决策与规划完全解耦 | 决策输出不可行的意图(如目标速度过高) | 决策器未考虑车辆动力学约束 | 在决策器中加入可行性预检 |
| 参考线更新滞后 | 弯道中轨迹偏离车道中心 | 参考线生成频率低于规划频率 | 采用双缓冲参考线,提前预生成 |
| 忽略场景上下文 | 雨天/夜间场景参数未调整 | 场景分类未包含环境条件维度 | 增加天气/光照条件作为场景参数 |
工程复盘建议:在开发过程中,建议为每个场景建立独立的仿真测试矩阵,覆盖正常、边界、故障三类情况。例如对于变道场景,至少测试:目标车道无车、目标车道有慢车、目标车道有快车接近、目标车道有并行车、变道过程中目标车道出现新障碍物等至少20种子场景。同时,建立决策-规划一致性日志,记录每个控制周期内决策意图与规划轨迹的匹配度,当偏差超过阈值时自动告警。
经验之谈:在Apollo中调试场景相关问题时,建议首先检查scenario_manager的日志输出,确认场景切换时机是否符合预期。其次,使用planning_vis工具可视化参考线和决策边界,这比直接看轨迹曲线更容易定位问题。最后,善用replay模式,用真实路采数据回放,可以大幅提升问题复现效率。
场景分类与决策-规划耦合是自动驾驶系统从“能开”到“开得好”的关键分水岭。一个设计良好的场景体系应当具备完备性(覆盖所有合法驾驶情境)、互斥性(同一时刻只属于一个场景)、可扩展性(新场景可以低成本接入)。而决策与规划的耦合设计则需要在语义抽象与数值精确之间找到平衡点——过度抽象会让规划器失去灵活性,过度精确则会让决策器陷入计算泥潭。在实际工程中,建议采用“决策粗粒度、规划细粒度”的分层策略,并通过充分的场景测试来验证耦合的鲁棒性。