4. 场景决策基础
在自动驾驶行为规划中,“场景”不是简单的“路况描述”,而是决策系统对当前驾驶任务、环境约束、交互对象和风险来源的一次结构化抽象。Apollo 的行为规划器之所以能够从感知结果中推导出“该跟车、该让行、该变道还是该停车”,核心就在于它先把连续、嘈杂的世界切分成可判断、可推理、可验证的场景单元。理解场景的定义、分类以及场景决策的基本问题,是后续学习 Scenario、Stage、Task 三层决策框架的前提。
一、场景的定义:从感知世界到决策语义
在 Apollo 中,场景可以定义为:在特定道路结构、交通规则和动态交互条件下,自车为完成某一驾驶目标而需要采取的一组决策语义与行为约束的集合。它至少包含四个要素:
- 静态环境:车道线、路口拓扑、停止线、人行横道、限速标志、障碍物位置等。
- 动态对象:其他车辆、行人、骑行者、施工锥桶等,以及它们的速度、朝向、意图。
- 自车状态:位置、速度、加速度、航向、当前车道、目标路线。
- 决策目标:保持车道、跟车、避让、变道、通过路口、靠边停车等。
因此,场景不是“看到了什么”,而是“在当前条件下,自车应该以什么语义去行动”。例如,同样是前方有车,在高速跟车场景中决策目标是保持安全距离,而在无保护左转场景中决策目标可能是寻找对向车流间隙并完成转弯。
二、场景分类:按决策语义划分
Apollo 的场景分类通常围绕“驾驶任务”和“交互复杂度”展开。常见分类如下表所示:
| 场景类别 | 典型子场景 | 核心决策问题 | 主要风险 |
|---|---|---|---|
| 车道保持类 | 直行跟车、巡航、车道内避障 | 纵向速度与距离控制 | 追尾、压线、舒适性差 |
| 变道类 | 主动变道、强制变道、汇入汇出 | 目标车道选择与间隙判断 | 侧向碰撞、后车冲突 |
| 路口类 | 信号灯路口、无保护左转、右转 | 通行权判断与冲突消解 | 抢行、死锁、转弯碰撞 |
| 弱势交通参与者类 | 行人横穿、骑行者占道 | 让行与减速策略 | 碰撞、急刹、误判意图 |
| 特殊区域类 | 施工区、收费站、停车场、窄路 | 限速、绕行、停车 | 空间不足、规则冲突 |
| 异常与降级类 | 传感器遮挡、定位漂移、接管请求 | 安全停车或降级运行 | 失控、误决策 |
这种分类方式的价值在于:每一类场景都对应一组相对固定的决策目标和约束条件,便于 Apollo 用 Scenario 插件进行管理。例如,LANE_FOLLOW 场景负责车道保持,LANE_CHANGE 场景负责变道,STOP_SIGN 场景负责停止标志处理。
三、场景决策的基本问题
场景决策要回答的核心问题可以归纳为四个:
- 我现在处于什么场景?即场景识别问题。需要根据地图、感知、定位和路由信息,判断当前应激活哪个 Scenario。
- 这个场景下我有哪些可行行为?即行为空间生成问题。例如跟车场景下可选减速、保持、轻微加速;变道场景下可选等待、加速切入、放弃变道。
- 哪个行为最优且安全?即决策选择问题。需要综合安全性、合法性、舒适性、通行效率进行权衡。
- 决策如何随时间保持稳定?即状态维持与切换问题。避免场景频繁跳变导致车辆“犹豫不决”。
下面用一段简化的伪代码说明场景决策的基本流程:
输入:地图、感知障碍物、自车状态、路由
1. 场景识别:根据道路类型、交通标志、障碍物分布判断当前 Scenario
2. 场景进入条件检查:是否满足进入阈值
3. 生成 Stage:将 Scenario 拆分为若干阶段
4. 执行 Task:每个 Stage 内运行具体任务,如跟车、避让、停车
5. 输出决策:目标速度、目标加速度、目标车道、转向意图
6. 场景退出判断:条件满足则退出或切换 Scenario
四、场景决策面临的挑战
场景决策并不只是“分类 + 选择”,它在真实道路上面临多重挑战:
- 场景边界模糊:跟车与变道、路口与跟车之间没有绝对分界,阈值设置不当会导致频繁切换。
- 动态对象意图不确定:行人是否会让行、前车是否突然刹车、旁车是否强行并线,都难以精确预测。
- 多目标冲突:安全、效率、舒适、合法之间可能互相矛盾,需要合理优先级。
- 规则与现实的差距:交通法规给出通行权,但实际交通中常出现博弈和妥协。
- 长尾场景:施工区、事故现场、临时交通指挥等场景数据稀少,难以覆盖。
- 实时性约束:决策必须在毫秒级完成,不能依赖过重的在线推理。
五、案例:无保护左转场景的决策拆解
以无保护左转为例,Apollo 通常将其归入路口类场景。其决策过程可以拆解为:
- 场景识别:自车位于左转车道,前方为无保护路口,路由要求左转。
- Stage 划分:接近路口 → 等待间隙 → 执行左转 → 完成转弯。
- Task 执行:在等待阶段,持续评估对向直行车辆的距离和速度;在间隙足够时,生成左转轨迹并控制速度。
- 退出条件:自车完成左转并进入目标车道,场景退出。
这个案例说明,场景决策的关键不是“识别出左转”就结束,而是要把左转拆成可执行、可监控、可退出的阶段和任务。
六、复盘:如何设计一个可用的场景决策模块
结合 Apollo 工程实践,设计场景决策模块时应重点关注:
- 场景定义要清晰:每个 Scenario 必须有明确的进入条件、退出条件和优先级。
- 分类要覆盖主要驾驶任务:至少覆盖车道保持、变道、路口、弱势参与者、特殊区域和降级场景。
- 决策要可解释:每个决策输出应能追溯到场景、阶段和任务。
- 切换要稳定:引入迟滞、最小持续时间、优先级仲裁,避免频繁跳变。
- 验证要场景化:用仿真和路测数据覆盖典型场景与边界场景,持续回归。
总的来说,场景是行为规划的“语义入口”,场景分类是决策模块的“组织方式”,而场景决策的基本问题与挑战则决定了系统能否在复杂交通中保持安全、稳定和可解释。掌握这些基础,才能进一步理解 Apollo 中 Scenario、Stage、Task 的分层决策机制。