场景理论:场景的定义、场景的分类与六层模型

做SOTIF实车验证,绕不开一个核心问题——场景到底是什么?

我见过不少团队,一上来就堆测试用例,结果跑完一轮发现:该覆盖的危险场景没覆盖,不该测的重复场景测了上百遍。说白了,就是没把场景这件事想清楚。

这一章,咱们把场景的定义、分类和六层模型掰开揉碎讲透。你理解了这个框架,后面的场景设计才有根。

2.1 场景的定义

先问个问题:什么是场景?

ISO 21448里给的定义比较学术——场景是描述一段持续时间内,车辆、交通参与者、环境、基础设施等元素的状态与行为。但我个人习惯用一个更直白的说法:场景 = 谁 + 在哪 + 干什么 + 周围有什么 + 天气怎么样。

举个例子:

  • 「一辆白色轿车在雨天的高速路上,以120km/h行驶,前方50米有一辆货车突然变道」——这就是一个场景。
  • 「一辆车在开」——这不是场景,信息太少了。

我在项目中遇到过一个问题:测试工程师写场景时,只写了「前车减速」,结果路测时发现,前车减速的时机、减速度、路面附着系数都不一样,同一个场景跑出来的结果天差地别。所以,场景必须包含足够的信息粒度。

我的经验:定义场景时,至少回答5个W——Who(谁)、Where(在哪)、When(何时)、What(做什么)、With what(伴随什么环境条件)。少一个,场景就可能失真。

2.2 场景的分类:三个层次

场景不是铁板一块。学术界和工业界普遍把场景分成三个层次:功能场景、逻辑场景、具体场景。这三个层次,说白了就是抽象到具体的递进关系。

层次 定义 特点 典型用途
功能场景 用自然语言描述的场景概念 抽象、定性、无参数 需求分析、早期设计
逻辑场景 用参数空间描述的场景范围 参数化、有边界、可组合 测试设计、参数探索
具体场景 参数取具体值的场景实例 确定、可执行、可复现 实车测试、仿真运行

2.2.1 功能场景

功能场景是最上层的抽象。它用自然语言描述「系统应该处理什么情况」,不涉及具体数值。

比如:

  • 「车辆在高速路上遇到前方静止障碍物」
  • 「行人从路边停放的车辆后方突然横穿马路」
  • 「夜间对向车辆远光灯导致摄像头过曝」

功能场景的好处是——沟通成本低。产品经理、系统工程师、测试工程师坐在一起,用功能场景就能对齐认知。但坏处也很明显:没法直接用来测试,因为太模糊了。

注意:功能场景不是随便写写的。我见过有人把「车辆正常行驶」也当成功能场景——这太宽泛了,等于没说。好的功能场景应该包含触发条件和预期系统响应。

2.2.2 逻辑场景

逻辑场景在功能场景的基础上,给关键参数划定了范围。它描述的是参数空间,而不是单个点。

举个例子,把上面的功能场景「车辆在高速路上遇到前方静止障碍物」展开成逻辑场景:

  • 自车速度:80~130 km/h
  • 障碍物类型:乘用车 / 货车 / 锥桶
  • 障碍物静止位置:车道中心 / 车道偏左 / 车道偏右
  • 路面附着系数:0.3~0.85
  • 光照条件:白天 / 黄昏 / 夜间

你看,逻辑场景定义了一个参数组合的边界。测试时,你可以在这个边界内采样,生成大量具体场景。

我个人习惯用逻辑场景来做覆盖率分析。比如,自车速度范围是80~130,那低速工况(比如60km/h以下)是不是没覆盖到?如果有,说明场景设计有缺口。

避坑指南:我曾经在一个项目里,逻辑场景的参数范围设得太宽——自车速度0~200km/h都算。结果采样时,大量样本落在极端值附近,反而忽略了中间区域的典型工况。建议:参数范围要基于ODD(运行设计域)来定,别拍脑袋。

2.2.3 具体场景

具体场景是逻辑场景中参数取具体值后的一个实例。它是可执行的、可复现的。

比如从上面的逻辑场景中,取一组参数:

  • 自车速度:100 km/h
  • 障碍物类型:乘用车
  • 障碍物静止位置:车道中心
  • 路面附着系数:0.7
  • 光照条件:白天

这就是一个具体场景。你可以把它输入到仿真软件里跑,也可以在实车测试时复现。

具体场景的数量可以非常大。一个逻辑场景,如果有5个参数,每个参数取10个值,理论上就能组合出10⁵ = 10万个具体场景。所以,怎么从逻辑场景中高效采样,是场景设计的关键技术之一。

2.3 场景的六层模型

光有分类还不够。场景本身是一个多维度的复杂系统,怎么把它结构化?业界用得比较多的是六层模型(Six-Layer Model),最早由德国PEGASUS项目提出,后来被ISO 21448采纳。

六层模型把场景拆成六个独立的层,每一层关注不同的维度:

场景六层模型结构 L1: 道路层 道路几何、车道数量、车道宽度、路肩类型、中央隔离带 L2: 交通设施层 交通标志、信号灯、护栏、标线、路侧单元(RSU) L3: 临时操作层 施工区域、临时路障、事故现场、临时交通管制 L4: 动态物体层 车辆、行人、骑行者、动物、其他交通参与者及其运动状态 L5: 环境条件层 天气(雨/雪/雾/晴)、光照(白天/夜间/黄昏)、温度、湿度 L6: 数字信息层 V2X通信、高精地图更新、云端指令、GPS信号质量 说明:六层模型从静态到动态、从物理到数字,逐层覆盖场景的全部要素。设计场景时,每一层都不能遗漏。

六层模型的核心思想是:场景不是一维的,而是多维的。你设计场景时,不能只盯着动态物体(比如前车),而忽略了道路几何、交通设施、环境条件这些静态或半静态因素。

我举个例子你就明白了:

同样是「前车急刹」这个场景——

  • 在干燥柏油路上,自车能稳稳刹住;
  • 在湿滑路面上,可能就滑出去了;
  • 如果再加上夜间、对向远光灯,摄像头可能根本看不清前车刹车灯。

你看,同一个动态事件(L4),因为环境条件(L5)和道路层(L1)不同,系统的表现完全不同。所以,六层模型是场景设计的检查清单——每一层你都得问自己:这个场景里,这一层有没有特殊之处?

关键认知:六层模型不是理论摆设。我在做实车验证时,每次设计场景都会拿六层模型逐层过一遍。L1~L3是静态或半静态,L4是动态核心,L5是环境变量,L6是信息交互。缺了任何一层,场景都不完整。

2.4 三个层次 × 六层模型 = 场景设计矩阵

把场景的三个层次和六层模型结合起来,就形成了一个场景设计矩阵。这个矩阵是我个人做场景设计时的核心工具。

六层模型 功能场景 逻辑场景 具体场景
L1 道路层 高速路直道 车道数: 2~4; 曲率半径: ≥500m 3车道, 曲率半径800m
L2 交通设施层 有限速标志 限速值: 80~120 km/h 限速100 km/h
L3 临时操作层 有施工区域 施工占道: 1~2条; 长度: 50~200m 占1条车道, 长度100m
L4 动态物体层 前车急刹 前车减速度: 3~8 m/s²; 初始距离: 30~80m 减速度6 m/s², 距离50m
L5 环境条件层 雨天 降雨强度: 轻/中/重; 路面水膜厚度: 1~5mm 中雨, 水膜3mm
L6 数字信息层 GPS信号弱 定位误差: 1~10m 定位误差5m

这个矩阵怎么用?

  1. 先写功能场景:用自然语言描述,每层写一句话。
  2. 再展开逻辑场景:给每层的参数划定范围。
  3. 最后采样具体场景:从逻辑场景中取具体值,生成可执行的测试用例。

这样做的好处是——场景设计有层次、有结构、可追溯。你随时可以问:这个具体场景是从哪个逻辑场景来的?那个逻辑场景覆盖了哪些功能场景?

避坑指南:我曾经见过一个团队,直接跳过了逻辑场景,从功能场景一步跳到具体场景。结果呢?具体场景之间大量重复,关键边界却没覆盖到。后来我帮他们补了逻辑场景层,用参数空间做覆盖率分析,才发现原来有30%的危险工况根本没设计进去。所以,逻辑场景这层不能省。

2.5 小结

这一章我们讲了三个核心概念:

  • 场景的定义:不是随便一个「车在开」就叫场景,要有足够的信息粒度。
  • 场景的三个层次:功能场景(抽象)→ 逻辑场景(参数化)→ 具体场景(可执行),层层递进。
  • 六层模型:L1道路层、L2交通设施层、L3临时操作层、L4动态物体层、L5环境条件层、L6数字信息层——每一层都不能遗漏。