1. 课程导入

在自动驾驶与智能网联系统的研发流程中,仿真测试已经成为连接算法开发与实车验证的关键环节。ScenarioRunner 作为 CARLA 仿真生态中的核心场景执行引擎,承担着把抽象测试场景转化为可重复、可度量、可批量运行的仿真任务的重要职责。本课程围绕 ScenarioRunner 自动场景测试工程展开,目标是帮助学习者从零建立一套完整的场景测试工程能力,而不是停留在“会跑一个示例脚本”的层面。

本课程的核心目标可以概括为三句话:能理解场景描述与执行引擎之间的关系;能独立编写、调试并扩展场景测试用例;能把单场景测试组织成可回归、可统计、可集成的自动化测试工程。

一、为什么需要 ScenarioRunner:核心价值

传统实车测试成本高、周期长、危险场景难以复现。一个“前车急刹导致追尾”的边缘场景,在真实道路上可能几个月都遇不到一次,但在仿真环境中可以按需构造、反复执行、精确控制变量。ScenarioRunner 的价值正体现在这里:它把场景定义、参与者行为、触发条件、评价指标统一到一套可编程框架中,使测试从“人工驾驶观察”转变为“自动执行与判定”。

具体而言,ScenarioRunner 提供了以下关键能力:

  • 场景原子化: 将复杂交通行为拆解为可复用的场景元素,如车辆、行人、红绿灯、路径点与触发条件。
  • 执行自动化: 通过脚本批量加载场景、启动仿真、控制参与者并收集结果。
  • 评价标准化: 基于碰撞、偏离车道、超速、到达目标等指标自动判定通过或失败。
  • 工程可集成: 可接入 CI/CD 流程,形成每日回归测试与版本质量门禁。

因此,学习 ScenarioRunner 不仅是学习一个工具,更是学习一种“把测试需求工程化”的方法。

二、整体知识框架:从场景到工程的五层结构

本课程的知识体系可以划分为五个层次,它们之间是逐层支撑的关系。下图展示了从底层仿真平台到上层测试工程的整体结构,以及各层之间的数据与控制流向。

ScenarioRunner 自动场景测试工程知识框架 第5层 · 测试工程与集成 批量执行 · 结果统计 · 回归测试 · CI/CD 质量门禁 第4层 · 评价与判定 碰撞检测 · 车道偏离 · 超速判定 · 到达目标 · 通过/失败标准 第3层 · 场景执行引擎 场景加载 · 触发器调度 · 参与者控制 · 行为树 · 状态机 第2层 · 场景描述与配置 XML 场景定义 · 参数配置 · 地图与路径 · 参与者角色 第1层 · 仿真平台基础 CARLA 服务端 · Python API · 世界坐标 · 传感器与车辆控制 工程层 判定层 执行层 描述层 平台层 数据流:场景描述 → 执行引擎 → 仿真世界 → 评价指标 → 测试报告 控制流:测试工程 → 批量调度 → 场景实例 → 参与者行为 → 结果回传

这五层结构贯穿整个课程。前几章会从平台层和描述层入手,帮助学习者建立对 CARLA 与场景 XML 的基本认识;随后进入执行引擎与评价体系;最后把单场景测试组织成完整的自动化测试工程。

三、实战路线图:从单场景到回归测试

为了让学习路径清晰可执行,本课程设计了一条由浅入深的实战路线。下表列出了各阶段的主要任务、关键产出与常见难点,学习者可以对照自己的进度进行自检。

阶段 主要任务 关键产出 常见难点
阶段一:环境与基础 搭建 CARLA 与 ScenarioRunner 运行环境,跑通第一个示例场景 可运行的仿真环境与示例日志 版本匹配、Python 依赖、端口冲突
阶段二:场景描述 理解 XML 场景结构,编写简单车辆与行人场景 自定义场景 XML 文件 坐标系统、触发条件、参与者角色
阶段三:执行与调试 加载场景、控制参与者、观察行为并定位异常 可稳定复现的场景执行脚本 时序竞争、同步模式、帧率设置
阶段四:评价与判定 配置碰撞、偏离、超速等评价指标,输出通过/失败结论 带判定结果的测试报告 指标阈值设定、误报与漏报
阶段五:工程化集成 批量运行场景集,接入 CI/CD,形成回归测试 自动化测试流水线与统计报表 资源调度、并行执行、结果聚合

四、典型场景案例:前车急刹测试

为了把抽象框架落到具体对象上,这里给出一个贯穿课程的典型案例:前车急刹测试。测试目标是验证自车在跟车过程中,当前车突然减速时能否及时制动并保持安全距离。

场景要素:
- 地图:Town04 高速公路
- 自车:vehicle.ego,初始速度 60 km/h
- 前车:vehicle.lead,位于自车前方 30 m
- 触发条件:仿真时间 5 s 时,前车以 -6 m/s² 减速至停止
- 评价指标:最小车距 > 5 m,无碰撞,自车减速度不超过 -8 m/s²
- 判定结果:PASS / FAIL

这个案例看似简单,却覆盖了场景描述、触发调度、参与者控制、评价判定四个核心环节。后续章节会逐步拆解它的实现方式,并在此基础上扩展出切入、变道、行人横穿等更复杂的场景。

建议学习者在每个阶段都保留自己的场景文件与运行日志。场景测试工程的价值很大一部分来自“可追溯”:当某个版本出现回归问题时,能够快速定位是哪个场景、哪个触发条件、哪个评价指标发生了变化。

五、常见误区与学习建议

初学者在学习 ScenarioRunner 时,容易陷入几个典型误区。第一,把 ScenarioRunner 当成单纯的“脚本运行器”,忽视场景描述与评价体系的工程意义;第二,只关注场景能否跑通,不关注结果是否可复现、可统计;第三,在单场景上反复调试,却没有建立批量执行与回归测试的意识。

需要特别注意的是:仿真测试的结论只有在“场景可复现、指标可量化、结果可回归”的前提下才具有工程参考价值。否则,跑通一百个场景,也可能只是得到一百份无法比较的日志。

因此,本课程建议的学习方式是:每学完一个模块,就把该模块的能力接入到自己的测试工程中。例如,学完场景描述后,不只写一个 XML,而是写一组参数化场景;学完评价判定后,不只输出一个 PASS,而是输出结构化结果文件。这样,课程结束时,学习者得到的不是零散知识点,而是一套可以继续扩展的自动场景测试工程。

接下来的章节将按照上述五层框架和实战路线逐步展开,从环境搭建与第一个场景运行开始,进入 ScenarioRunner 的完整工程世界。