3、场景分析入门:场景的定义与要素、运行场景与运行设计域(ODD)、场景分析工具介绍
各位同学,欢迎来到场景分析入门这一讲。
说实话,做SOTIF(预期功能安全)这些年,我最大的感触就是:场景分析是整件事的基石。你想想看,如果连车会在什么情况下跑、会遇到什么情况都说不清楚,那后面的危害分析、风险评估,说白了就是空中楼阁。
我个人习惯,每次接手一个新项目,第一件事不是翻代码,而是拉着系统工程师和测试团队,先把场景聊透。为什么?因为场景决定了你的ODD(运行设计域),ODD又决定了你的功能边界。边界划不清楚,后面全是坑。
3.1 场景的定义与要素
先问大家一个问题:什么是场景?
很多人觉得场景就是「车在路上开」。嗯,这个说法没错,但太粗糙了。做SOTIF分析时,我们需要把场景拆成几个核心要素。
场景的五大要素(我个人总结的):
- 道路结构:直道、弯道、匝道、十字路口、环岛……
- 交通参与者:其他车辆、行人、自行车、动物、甚至掉落的货物
- 环境条件:白天/黑夜、晴天/雨/雪/雾、光照角度、路面湿滑程度
- 自车状态:车速、转向角、加速度、传感器视野是否被遮挡
- 时间因素:季节、时间段、交通流密度
我记得有一次做港口无人集卡的场景分析,我们漏掉了「海鸥」这个要素。结果呢?测试车在码头被一群海鸥挡住,传感器误判为障碍物,直接急刹。你说这算不算场景要素?当然算!
所以,场景的定义可以这样理解:场景是某一时刻,自车与周围环境、交通参与者之间所有相关信息的快照。它不是静态的,而是一个动态变化的过程。
3.2 运行场景与运行设计域(ODD)
搞清楚了场景的要素,接下来我们聊聊两个容易混淆的概念:运行场景和运行设计域(ODD)。
说白了,运行场景是「实际发生了什么」,而ODD是「我们允许系统在什么条件下运行」。
举个例子:
- 运行场景:一辆车在夜间暴雨中,行驶在无路灯的乡间小路上,前方突然出现一个行人。
- ODD:系统设计时声明「本系统仅在白天、晴朗天气、有清晰车道线的城市道路上运行」。
你看,如果实际场景超出了ODD的边界,系统就不应该被激活,或者必须安全地退出。这就是SOTIF的核心逻辑之一——明确边界,守住边界。
避坑指南:
我曾经在一个项目中,团队把ODD写得特别宽泛,什么「城市道路」就完了。结果测试时发现,系统在隧道里表现很差——因为隧道里GPS信号弱,而且光照突变。后来我们学乖了,ODD里必须写明:「有GPS信号覆盖」、「光照强度不低于X lux」。越细越好,别怕啰嗦。
ODD的描述通常包含以下几个维度:
| 维度 | 示例描述 |
|---|---|
| 道路类型 | 高速公路、城市主干道、封闭园区道路 |
| 速度范围 | 0-60 km/h |
| 天气条件 | 无降水、能见度 > 200m |
| 光照条件 | 白天(照度 > 1000 lux) |
| 通信条件 | GPS信号强度 > -130 dBm |
| 交通参与者 | 无行人、无非机动车 |
你想想看,如果ODD写得不够细,测试团队怎么设计测试用例?验证团队怎么判断系统是否安全?所以,ODD不是写给别人看的,是给自己用的。
3.3 场景分析工具介绍
聊完了理论,咱们看看实际干活时用什么工具。我这些年用过不少,挑几个有代表性的说说。
3.3.1 六层场景模型(6-Layer Model)
这是PEGASUS项目提出来的,现在基本是行业标准。它把场景分成六层:
- 道路层:车道线、路沿、标志牌
- 交通基础设施层:红绿灯、护栏、路障
- 临时操作层:施工区域、临时封路
- 物体层:车辆、行人、动物
- 环境层:天气、光照、路面状态
- 数字信息层:V2X消息、高精地图更新
我个人习惯,做HARA时直接用这个模型来「过一遍」场景,确保没有遗漏。比如分析一个十字路口场景,我会一层一层问:道路层有没有特殊标线?基础设施层有没有故障的红绿灯?临时操作层有没有施工?……这样结构化的方式,不容易漏。
3.3.2 场景分类工具:功能场景、逻辑场景、具体场景
这个分类方法也很实用:
- 功能场景:用自然语言描述,比如「车辆在高速公路上跟车行驶」。
- 逻辑场景:用参数范围描述,比如「车速60-120 km/h,跟车距离20-100m」。
- 具体场景:用具体数值描述,比如「车速80 km/h,跟车距离50m」。
做SOTIF分析时,我们通常从功能场景出发,然后通过参数组合生成逻辑场景,最后用具体场景来设计测试用例。这个流程,说白了就是「从抽象到具体」的过程。
注意:
千万不要跳过逻辑场景直接跳到具体场景。我见过有人直接写「车速60km/h,跟车距离30m」就开始分析,结果漏掉了车速80km/h、跟车距离20m这种更危险的组合。逻辑场景的作用就是帮你系统地覆盖参数空间,而不是拍脑袋选几个点。
3.3.3 OpenSCENARIO / OpenDRIVE
如果你做仿真测试,这两个格式是绕不开的。
- OpenDRIVE:描述道路网络(路网结构、车道线、坡度等)
- OpenSCENARIO:描述动态场景(车辆轨迹、交通参与者行为、环境变化等)
举个例子,一个简单的OpenSCENARIO片段长这样:
<Scenario>
<Entities>
<Entity name="Ego" />
<Entity name="Target" />
</Entities>
<Storyboard>
<Init>
<Action name="Ego_Speed">
<Private>
<LongitudinalAction>
<SpeedAction>
<Target>50 km/h</Target>
</SpeedAction>
</LongitudinalAction>
</Private>
</Action>
</Init>
</Storyboard>
</Scenario>
嗯,这里要注意,写OpenSCENARIO时最容易犯的错误是忘记定义初始状态。比如你只写了目标车怎么动,但没写它一开始在哪、速度多少,仿真器就会报错或者行为异常。我刚开始用的时候,光调试这个就花了两天。
3.4 本章知识体系总览
为了让大家更直观地理解本章的内容结构,我画了一张图:
这张图把本章的核心内容串起来了。从场景定义出发,到ODD的边界划分,再到具体的分析工具,最终都指向一个目标——为SOTIF的HARA提供扎实的输入。
好了,场景分析入门就讲到这里。记住一句话:场景分析不是一次性工作,而是贯穿整个开发周期的持续活动。项目初期要分析,中期要更新,后期要验证。别想着一次搞定,那是不可能的。