2. SOTIF基础
做仿真测试场景库,第一步不是写代码,而是搞清楚一件事——场景里到底有哪些东西。
我刚开始带团队的时候,大家各拆各的。有人把路灯算成静态要素,有人算成设施要素,还有人干脆漏了。结果场景库建到一半,发现对不齐,返工量巨大。后来我们统一了一套拆法,就是今天要聊的三要素框架:静态、动态、环境。
核心原则:任何场景,都能拆成这三类。拆得越干净,场景库的可复用性就越高。
静态要素:道路与设施
静态要素,说白了就是不会动的东西。它们构成了场景的“骨架”。
我个人习惯把静态要素分成两大类:
- 道路要素:车道线、路沿、交叉口、坡度、曲率、路面材质
- 设施要素:交通信号灯、标志牌、护栏、路灯、路侧单元(RSU)
这里有个坑。我记得有一次做城市快速路场景,团队把“护栏”归到了动态要素里,理由是“它会影响车辆轨迹”。但你想,护栏本身不会移动,它只是静态约束。如果把它当动态要素处理,场景参数化的时候就乱套了。
判断标准:一个要素在场景持续时间内,位置和状态是否变化?不变,就是静态。
道路要素里,我特别想强调车道线类型。很多场景库只区分“有/无车道线”,但实际测试中,虚线、实线、双黄线、导流线,对自动驾驶的行为影响完全不同。我建议至少区分 5 种:
| 车道线类型 | 典型场景 | 测试关注点 |
|---|---|---|
| 白色虚线 | 城市道路、高速 | 变道、超车 |
| 白色实线 | 隧道、桥梁 | 禁止变道检测 |
| 黄色实线 | 双向两车道 | 越线预警 |
| 双黄线 | 城市主干道 | 压实线违章 |
| 导流线 | 匝道、交叉口 | 路径规划 |
动态要素:车辆与行人
动态要素是场景里的“演员”。它们会动,会交互,是测试中最难建模的部分。
我一般把动态要素拆成三个层级:
- 主车(Ego):被测车辆,它的传感器配置、控制策略是固定的
- 交通参与者:其他车辆、行人、自行车、动物
- 交互行为:跟车、变道、抢行、礼让、急刹
这里有个经验。很多团队只关注“其他车辆”的数量和位置,忽略了行为意图。我曾经遇到一个案例:场景里放了 5 辆车,但全是匀速直行,结果被测系统轻松通过。换到真实路测,第一辆车突然减速,后面就追尾了。
避坑指南:动态要素不能只配“静态轨迹”。一定要给每个交通参与者配一个行为模型,哪怕很简单——比如“前车在 3 秒后以 2m/s² 减速”。
行人这块,我建议特别关注弱势道路使用者(VRU)。儿童、老人、推婴儿车的、撑伞的,他们的运动特征差异很大。我见过一个场景库,所有行人都按 1.4m/s 匀速走,结果测试系统在真实场景里对“突然跑出来的小孩”完全没有反应。
环境要素:天气与光照
环境要素是场景的“滤镜”。它不直接参与交互,但会严重影响传感器的感知能力。
我个人习惯把环境要素分成两组:
- 天气:雨、雪、雾、霾、强风
- 光照:白天、黄昏、夜晚、逆光、隧道出入口
这里有一个常见的误解:很多人觉得“天气就是下雨下雪”。其实,光照变化比天气更频繁,也更难测。我记得有一次做隧道场景测试,白天进隧道,光照从 100000 lux 瞬间降到 500 lux,摄像头直接过曝,系统失效了。这个场景里没有雨也没有雪,但光照就是核心环境要素。
关键指标:环境要素的参数化很重要。比如“雨”不能只写“有雨”,要写降雨强度(mm/h)、能见度(m)、路面附着系数。
我建议每个环境要素至少配 3 个等级:
| 要素 | 轻度 | 中度 | 重度 |
|---|---|---|---|
| 降雨 | 0.5 mm/h | 5 mm/h | 25 mm/h |
| 雾 | 能见度 500m | 能见度 200m | 能见度 50m |
| 光照 | 黄昏 1000 lux | 夜晚 50 lux | 无照明 1 lux |
三要素的关系:一张图说清楚
下面这张图是我自己画的三要素关系框架。你看一眼就能明白它们怎么配合:
拆解实操:一个完整的例子
光说理论不够。我拿一个真实场景来拆一遍,你就明白了。
场景描述:城市双向四车道,黄昏时分,下着小雨。主车在中间车道直行,右侧非机动车道有一辆自行车突然左转切入主车前方。
按三要素拆解:
| 要素类别 | 具体内容 | 参数化要点 |
|---|---|---|
| 静态 | 双向四车道、白色虚线、路沿、非机动车道 | 车道宽度 3.5m、路沿高度 15cm |
| 动态 | 主车(50km/h)、自行车(15km/h 左转切入) | 切入角度 30°、切入时间 3s、主车反应延迟 0.5s |
| 环境 | 黄昏(500 lux)、小雨(2mm/h) | 路面附着系数 0.6、能见度 300m |
我的习惯:每次建新场景,先拿一张纸,画三个格子,把要素填进去。填不满的,就是场景定义有遗漏。
嗯,这里要注意。三要素不是孤立的。静态要素决定了动态要素的活动范围,环境要素又影响动态要素的感知能力。比如雨天,路面附着系数降低,车辆的制动距离变长——这个信息必须同步到动态要素的行为模型里。
我曾经犯过一个错:静态要素里配了“湿滑路面”,但动态要素里的前车制动模型还是干路面的参数。结果仿真跑出来,前车刹住了,主车没刹住。排查了半天,才发现是要素之间没联动。
避坑指南:要素拆解完成后,一定要做一次交叉检查。静态要素的变化,是否影响了动态要素的参数?环境要素的变化,是否需要更新传感器的噪声模型?
好了,三要素的拆解方法就聊到这里。记住这个框架,后面建场景库的时候,你会感谢今天花时间搞清楚了这件事。