第三章 场景定义与抽象:场景六层模型与抽象方法

各位同学,今天我们来聊聊场景定义与抽象。说实话,这是整个仿真测试里最容易被忽视、但也是最关键的一环。我见过太多团队,仿真平台搭得漂漂亮亮,结果场景定义一塌糊涂,最后测试结果根本没法用。

为什么会这样?因为场景太复杂了。你想想看,一个真实的交通场景,有路、有车、有人、有信号灯,还有天气、光照、甚至路边广告牌上的信息。怎么把这些乱七八糟的东西组织起来?

嗯,业内有个好用的框架——场景六层模型。我个人习惯用这个模型来拆解场景,百试不爽。

3.1 场景六层模型

这个模型把场景拆成六个层次,从底向上依次是:

  1. 道路层:路网结构、车道线、路肩等
  2. 交通设施层:信号灯、标志牌、护栏等
  3. 临时操作层:施工区域、临时改道、事故现场
  4. 目标物层:车辆、行人、动物、障碍物
  5. 环境层:天气、光照、路面状态
  6. 数字信息层:V2X消息、高精地图、交通广播

我刚开始做自动驾驶测试时,总觉得分层是多余的。后来有一次,我们测试一个左转场景,怎么跑都出问题。排查了半天,发现是道路层和交通设施层没对齐——路口的车道线画错了,导致感知模块误判。从那以后,我再也不敢跳过分层了。

核心要点:六层模型不是学术概念,是实战工具。每一层都可以独立修改、组合、复用。

3.1.1 道路层

道路层是最底层,也是最基础的。说白了,就是车跑在哪里的问题。

包括:

  • 道路几何形状(直道、弯道、环岛)
  • 车道数量与宽度
  • 车道线类型(实线、虚线、双黄线)
  • 路肩、中央隔离带
  • 坡度、曲率

我记得有一次测试高速汇入场景,仿真里跑得好好的,一上路就出问题。后来发现,仿真里的匝道曲率比真实道路小太多。嗯,这就是道路层没抽象好。

小技巧:做道路层抽象时,建议直接从高精地图里提取数据。别自己手画,容易漏细节。

3.1.2 交通设施层

这一层管的是路上的「规矩」——信号灯、标志牌、标线。

关键要素:

  • 信号灯相位与配时
  • 标志牌类型与位置
  • 地面标线(停止线、导向箭头)
  • 护栏、防撞桶

你想想看,如果信号灯的配时和真实路口不一样,那测出来的决策逻辑能准吗?肯定不能。

3.1.3 临时操作层

这一层很有意思。它描述的是「临时变化」。

比如:

  • 施工区域(锥桶、围挡)
  • 临时交通管制
  • 事故现场
  • 临时改道指示

我在项目中遇到过最头疼的场景,就是施工区域。因为每个工地的布置都不一样,很难抽象成通用模板。后来我们干脆做了一个「施工区域参数化模板」,把锥桶间距、围挡高度、车道封闭数量都做成可调参数。这才算解决了问题。

注意:临时操作层最容易出bug。因为它是「临时」的,很多团队会忘记在仿真里加这一层。结果就是——仿真里永远没有施工,上路后天天遇到施工。

3.1.4 目标物层

这一层大家最熟悉——路上的各种「东西」。

包括:

  • 乘用车、卡车、公交车
  • 行人、自行车、电动滑板车
  • 动物(狗、猫、鹿)
  • 静态障碍物(石墩、垃圾桶)

这里有个坑:目标物的行为模型。我曾经见过一个团队,仿真里的行人只会直线过马路,从不回头、从不犹豫。结果实车测试时,遇到一个站在路边看手机的行人,系统直接懵了。

所以,目标物层不仅要定义「有什么」,还要定义「怎么动」。

3.1.5 环境层

环境层影响的是传感器的「感知质量」。

关键参数:

  • 天气:晴天、雨天、雪天、雾天
  • 光照:白天、黄昏、夜晚、逆光
  • 路面:干燥、湿滑、结冰、积雪

我个人习惯把环境层分成「轻度」「中度」「重度」三个等级。比如雨天,轻度是小雨(雨刷间歇档),中度是中雨(雨刷连续档),重度是暴雨(雨刷最快档)。这样组合起来,能覆盖大部分真实场景。

3.1.6 数字信息层

这一层是自动驾驶特有的——车与外界的信息交互。

包括:

  • V2V(车车通信)
  • V2I(车路通信)
  • 高精地图更新
  • 交通广播/云平台信息

嗯,这里要注意:数字信息层很容易被忽略。很多团队只测「纯感知」场景,不测「信息交互」场景。但实际路上,V2X消息延迟、丢包、甚至被篡改,都是真实风险。

3.2 场景抽象方法

有了六层模型,接下来就是怎么把真实场景「抽象」成可仿真的场景。

说白了,抽象就是「去粗取精」——保留关键要素,去掉无关细节。

3.2.1 参数化抽象

这是最常用的方法。把场景中的每个要素变成参数。

举个例子,一个「前车急刹」场景:

场景:前车急刹
参数:
  - 自车速度:60 km/h
  - 前车速度:50 km/h
  - 前车减速度:-6 m/s²
  - 初始距离:30 m
  - 车道类型:直道
  - 路面摩擦系数:0.8
  - 天气:晴天

你看,一个真实场景就被抽象成一组参数。改一个参数,就是一个新场景。

经验之谈:参数化时,别贪多。我见过有人一个场景列了50个参数,结果组合爆炸,根本测不完。建议先抓关键参数(5-8个),跑通了再慢慢加。

3.2.2 逻辑场景 vs 具体场景

这里有个重要概念:逻辑场景和具体场景。

  • 逻辑场景:用参数范围描述的场景。比如「自车速度 40-80 km/h,前车减速度 -4 到 -8 m/s²」。
  • 具体场景:参数取具体值的场景。比如「自车速度 60 km/h,前车减速度 -6 m/s²」。

逻辑场景是「模板」,具体场景是「实例」。测试时,我们通常先定义逻辑场景,然后从中采样出多个具体场景来跑。

我曾经犯过一个错误:只定义了具体场景,没定义逻辑场景。结果测试报告出来,别人问我「为什么选这个速度?为什么选这个减速度?」我答不上来。嗯,从那以后,我每次都会先写逻辑场景文档。

3.2.3 场景组合方法

六层模型的好处是:每一层可以独立抽象,然后自由组合。

比如:

  • 道路层:直道 + 弯道 + 环岛
  • 目标物层:前车急刹 + 行人横穿 + 自行车切入
  • 环境层:晴天 + 雨天 + 夜晚

组合一下,就是 3×3×3 = 27 个场景。如果再考虑交通设施层、临时操作层,组合数量会爆炸。所以,实际项目中要按「风险优先级」来组合。

我的建议:先做「高覆盖度」的轻量组合(每个层选2-3个典型值),跑通后再做「边界值」的深度组合。

3.2.4 抽象粒度控制

抽象到什么程度?这是个好问题。

太粗:场景不够真实,测不出问题。

太细:场景太多,测不完。

我个人习惯用「二八原则」:80%的场景用中等粒度抽象,20%的场景用细粒度抽象。

比如,普通跟车场景,我只抽象「速度」「距离」「加速度」三个参数。但如果是「鬼探头」场景,我会把行人速度、遮挡物位置、行人起步时机都抽象出来。

避坑指南:我曾经把一个「行人横穿」场景抽象得太细,加了20多个参数。结果组合出来几万个场景,跑了三个月还没跑完。后来砍到8个关键参数,两周就搞定了。所以,抽象粒度要跟测试目标匹配。

3.3 实战:从真实场景到仿真场景

最后,我们走一遍完整的流程。

假设我们要抽象一个「雨天高速跟车」场景:

  1. 采集真实数据:从路测数据里找雨天高速跟车的片段。
  2. 六层分解
    • 道路层:高速直道,3车道,车道宽3.75m
    • 交通设施层:限速牌120km/h,无施工
    • 临时操作层:无
    • 目标物层:自车+前车(轿车),初始距离50m
    • 环境层:中雨,路面湿滑,摩擦系数0.6
    • 数字信息层:无V2X
  3. 参数化:提取关键参数(速度、距离、雨量、摩擦系数)。
  4. 定义逻辑场景:自车速度80-100km/h,前车速度70-90km/h,雨量5-15mm/h。
  5. 生成具体场景:采样出10个具体场景,覆盖边界值。
  6. 导入仿真:在仿真平台里搭建场景,开始测试。

你看,整个过程并不复杂。关键是每一步都要想清楚:为什么要这么抽象?有没有漏掉关键要素?

好了,这一章的内容就到这里。下一章我们聊聊场景库的构建与管理——怎么把抽象好的场景组织起来,形成可复用的资产。

记住:场景抽象不是一次性的工作。随着测试深入,你会发现需要调整抽象粒度、增加新参数。这是正常的。保持迭代,别想着一步到位。