1. 课程导入
在自动驾驶研发链条中,感知、决策、控制算法都需要在真实道路之外完成大规模验证。真实路测成本高、周期长、极端场景难以复现,因此基于场景的仿真测试成为工程闭环中的关键环节。OpenSCENARIO 正是为解决“场景如何被机器描述、交换与执行”这一问题而诞生的开放标准。它用 XML 描述动态交通场景,让不同仿真器、不同工具链之间可以共享同一份场景定义。
一、起源:从 ASAM 标准体系到 OpenSCENARIO
OpenSCENARIO 由 ASAM(Association for Standardisation of Automation and Measuring Systems)组织制定,属于自动驾驶仿真标准族的一部分。它与 OpenDRIVE、OpenCRG 共同构成“道路—路面—动态场景”的描述体系:OpenDRIVE 描述静态路网,OpenCRG 描述路面曲率与起伏,OpenSCENARIO 描述车辆、行人、信号灯等动态实体的行为与交互。
早期各仿真厂商使用私有场景格式,导致场景无法复用、测试结果难以对比。ASAM 在 2018 年前后发布 OpenSCENARIO 1.0,随后迭代到 1.1、1.2,并推出 2.0 版本。1.x 以 XML 为核心,强调与 OpenDRIVE 配合;2.0 引入领域模型与更灵活的 DSL 思路,面向更复杂的场景编排与工具互操作。本课程以工程落地最广泛的 1.x 为主线,同时说明 2.0 的演进方向。
二、在自动驾驶仿真中的定位
OpenSCENARIO 不负责渲染、不负责物理求解,也不直接生成传感器数据。它位于“场景定义层”,向下被仿真器解析执行,向上承接测试用例与场景库管理。可以把它理解为动态场景的“乐谱”:仿真器是乐团,OpenDRIVE 是舞台,OpenSCENARIO 规定谁在什么时候、以什么方式、做什么动作。
三、核心原理:场景描述的三层结构
OpenSCENARIO 文件通常由三大部分组成:RoadNetwork 引用 OpenDRIVE 路网;Entities 定义车辆、行人等实体及其属性;Storyboard 描述行为序列,包括 Init、Story、Act、Maneuver、Event、Action 等层级。执行时,仿真器按 Storyboard 的时间轴推进,触发条件满足后执行动作。
<OpenSCENARIO>
<RoadNetwork>
<LogicFile filepath="highway.xodr"/>
</RoadNetwork>
<Entities>
<ScenarioObject name="Ego">
<Vehicle name="car" vehicleCategory="car"/>
</ScenarioObject>
</Entities>
<Storyboard>
<Init>...</Init>
<Story name="cut_in">
<Act>
<ManeuverGroup>
<Actors><EntityRef entityRef="Ego"/></Actors>
<Maneuver name="lane_change">
<Event name="start">
<Action><LaneChangeAction/></Action>
</Event>
</Maneuver>
</ManeuverGroup>
</Act>
</Story>
</Storyboard>
</OpenSCENARIO>
四、方法流程:从需求到可执行场景
- 明确测试目标:例如验证 AEB 对前车急刹的响应。
- 抽象功能场景:确定道路类型、交通参与者、触发条件。
- 参数化逻辑场景:把车速、距离、反应时间设为变量。
- 生成具体场景:用 OpenSCENARIO 编写 XML,绑定 OpenDRIVE 地图。
- 仿真执行与评价:运行仿真器,采集碰撞、TTC、减速度等指标。
- 回归与场景库沉淀:将有效场景纳入版本管理,持续复用。
五、案例场景:前车紧急制动
以“本车 60 km/h 跟随前车,前车突然以 6 m/s² 减速”为例。场景中 Ego 与 Target 均为 Vehicle 实体,Target 的 SpeedAction 在触发条件“距离小于 30 m”时执行。仿真器解析后,Ego 的 AEB 算法接收传感器数据并决策。若 Ego 未在安全距离内减速,则判定失败。该场景可参数化距离、减速度、路面附着系数,形成场景矩阵。
| 要素 | OpenSCENARIO 对应 | 工程关注点 |
|---|---|---|
| 静态道路 | RoadNetwork / LogicFile | 与 OpenDRIVE 版本匹配 |
| 交通参与者 | Entities / ScenarioObject | 尺寸、动力学参数 |
| 初始状态 | Init / TeleportAction | 位置、速度、朝向 |
| 行为触发 | Storyboard / Condition | 时间、距离、速度阈值 |
| 动作执行 | Maneuver / Action | 换道、加减速、转向 |
学习建议:先读懂一个最小可运行场景,再逐步增加实体与触发条件。不要一开始就追求复杂场景,否则容易在 XML 层级中迷失。
常见误区:把 OpenSCENARIO 当成仿真器本身;忽略坐标系与 OpenDRIVE 的对应关系;触发条件写得过于理想化,导致场景在真实仿真中无法复现。
六、学习目标与课程框架
本课程围绕“能读懂、能编写、能调试、能集成”四个目标展开。整体分为:标准与语法基础、实体与行为建模、触发条件与参数化、场景库与工具链、工程实战与排障。完成学习后,你应能独立编写可执行的 OpenSCENARIO 场景,并把它接入常见仿真平台完成回归测试。
- 理解 OpenSCENARIO 与 OpenDRIVE、OpenCRG 的协作关系。
- 掌握 Storyboard 的层级结构与执行语义。
- 能够使用参数化方法批量生成场景变体。
- 能够定位场景不执行、实体不出现、触发不生效等常见问题。
OpenSCENARIO 是自动驾驶仿真工程中的“通用语言”。掌握它,意味着你可以在不同工具链之间迁移场景资产,把测试从一次性脚本变成可管理、可复现、可扩展的工程能力。