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 在自动驾驶仿真工具链中的定位 场景库 / 测试用例 功能场景 · 逻辑场景 · 具体场景 OpenSCENARIO 动态场景描述(XML) OpenDRIVE / OpenCRG 静态路网 · 路面信息 仿真器 / 场景引擎 解析 · 调度 · 物理求解 · 传感器渲染 被测算法 感知 / 决策 / 控制 评价与判定 碰撞 · 舒适 · 合规 测试报告 回归 · 覆盖率 核心价值:场景可交换 · 工具可互操作 · 测试可复现 · 结果可对比 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>

四、方法流程:从需求到可执行场景

  1. 明确测试目标:例如验证 AEB 对前车急刹的响应。
  2. 抽象功能场景:确定道路类型、交通参与者、触发条件。
  3. 参数化逻辑场景:把车速、距离、反应时间设为变量。
  4. 生成具体场景:用 OpenSCENARIO 编写 XML,绑定 OpenDRIVE 地图。
  5. 仿真执行与评价:运行仿真器,采集碰撞、TTC、减速度等指标。
  6. 回归与场景库沉淀:将有效场景纳入版本管理,持续复用。

五、案例场景:前车紧急制动

以“本车 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 是自动驾驶仿真工程中的“通用语言”。掌握它,意味着你可以在不同工具链之间迁移场景资产,把测试从一次性脚本变成可管理、可复现、可扩展的工程能力。