1. 课程导入

在自动驾驶研发从“单车功能验证”走向“系统级安全论证”的过程中,仿真验证的规模、效率与可重复性成为决定迭代速度的关键因素。CARLA 作为开源自动驾驶仿真平台,具备高保真传感器建模、可编程交通流、灵活的场景编排与 Python 接口等能力,非常适合构建大规模场景批量验证工程。本课程围绕“如何把零散的 CARLA 脚本,升级为可批量、可度量、可复现的验证流水线”这一主线展开,帮助学习者建立从场景生成、批量执行、指标采集到结果分析的完整工程能力。

本课程的核心命题不是“会不会用 CARLA 跑一个场景”,而是“能否让成百上千个场景在受控条件下自动跑完,并给出可信的验证结论”。

一、学习目标:从单场景脚本到批量验证工程

本课程的学习目标分为四个层次。第一层是环境与接口能力:能够独立完成 CARLA 服务端与客户端的部署,理解同步模式、固定时间步、地图加载与交通管理器等基础机制。第二层是场景编排能力:能够使用 ScenarioRunner、OpenSCENARIO 或自定义 Python 脚本描述车辆、行人、天气、道路与触发条件。第三层是批量执行能力:能够设计任务队列、参数矩阵与并行调度策略,让大量场景在有限算力下稳定运行。第四层是验证分析能力:能够定义碰撞率、脱离率、最小距离、舒适度等指标,并对批量结果进行统计、归因与回归对比。

这四个层次对应一条清晰的实战路线:先跑通单场景,再抽象为参数化场景模板,然后接入批量调度与日志采集,最后形成可重复执行的验证报告。课程中的每个章节都会围绕这条路线中的一个关键环节展开,避免停留在 API 罗列层面。

二、核心价值:为什么需要“批量验证工程”

单场景验证只能回答“这个场景下系统表现如何”,而自动驾驶安全论证需要回答“在一大类场景分布下,系统是否稳定可靠”。两者的差距体现在三个方面:覆盖度、可重复性与可度量性。批量验证工程通过参数化场景空间,把天气、光照、交通密度、切入角度、行人行为等变量组合成可管理的测试矩阵,从而提升覆盖度;通过固定随机种子、同步步进与容器化环境,保证同一场景在不同时间、不同机器上结果一致;通过统一指标采集与日志格式,让结果可以被统计、对比和追溯。

从工程收益看,批量验证能够显著降低回归测试的人力成本。当算法版本更新时,只需重新提交场景矩阵,即可获得与基线版本的差异报告。这种“场景即资产、验证即流水线”的思路,正是本课程希望传递的核心工程价值观。

三、整体知识框架:五层结构

为便于理解,本课程将知识体系归纳为五层结构,如下图所示。底层是仿真环境与运行保障,之上是场景描述与参数化,中间是批量调度与执行引擎,再上是数据采集与指标计算,最上层是验证分析与回归决策。五层之间通过标准接口与统一数据格式衔接,任何一层的薄弱都会影响整体验证效率。

CARLA 大规模场景批量验证工程 · 五层知识框架 验证分析与回归决策 指标统计 · 基线对比 · 失败归因 · 报告生成 · 版本准入 L5 数据采集与指标计算 传感器数据 · 碰撞/脱离事件 · 最小距离 · 舒适度 · 日志标准化 L4 批量调度与执行引擎 任务队列 · 参数矩阵 · 并行进程 · 超时重试 · 资源隔离 L3 场景描述与参数化 OpenSCENARIO · ScenarioRunner · 参数模板 · 随机种子 · 触发条件 L2 仿真环境与运行保障 CARLA 服务端 · 同步模式 · 固定步长 · 地图/天气 · 交通管理器 L1 数据 向上 汇聚 配置 向下 下发 下层提供运行基础,上层产出验证结论;配置向下、数据向上形成闭环

四、实战路线图:从环境到报告的四阶段

为了让学习路径更具体,本课程将实战过程划分为四个阶段,每个阶段都有明确的交付物与验收标准。

阶段 关键任务 交付物 验收标准
阶段一:环境打通 部署 CARLA、配置 Python API、跑通同步模式单场景 可复现的单场景脚本 固定种子下两次运行轨迹一致
阶段二:场景参数化 抽象场景模板,定义参数空间与触发条件 参数化场景库 同一模板可生成不少于 50 个变体
阶段三:批量执行 构建任务队列、并行调度、日志与异常处理 批量运行流水线 100 场景无人值守完成率 ≥ 95%
阶段四:验证分析 指标计算、基线对比、失败归因与报告输出 验证报告与回归看板 可定位到具体场景与参数组合

五、典型场景与常见误区

一个典型的批量验证任务是“城市路口切入场景回归”。场景模板中固定路口拓扑,参数化主车速度、切入车初始距离、切入角度、天气与光照,共生成 200 个变体。批量执行后,系统输出每个变体的最小距离、碰撞标志与制动舒适度,并与上一版本基线对比。若某组参数下碰撞率上升,则可快速定位到具体场景文件与随机种子,复现并分析算法决策日志。

初学者常见的误区有三类。第一,忽视同步模式与固定步长,导致结果不可复现,批量验证失去意义。第二,把场景写成硬编码脚本,无法参数化,场景数量一多就难以维护。第三,只关注“跑完”而不关注“指标”,批量执行变成日志堆积,无法支撑验证结论。课程后续章节会针对这些问题给出可落地的工程方案。

建议在学习过程中始终维护一个最小可运行示例:一个场景模板、一个批量脚本、一份指标输出。所有新知识都尽量挂接到这个示例上,避免知识碎片化。
批量验证对算力与稳定性要求较高,务必在早期就引入超时控制、进程隔离与失败重试机制,否则后期排查成本会急剧上升。

下面是一个批量验证任务配置的示意片段,后续章节会逐步展开其完整实现:

{
  "scenario": "urban_cut_in",
  "carla": {
    "host": "127.0.0.1",
    "port": 2000,
    "sync_mode": true,
    "fixed_delta_seconds": 0.05
  },
  "matrix": {
    "ego_speed": [8, 12, 16],
    "cut_in_distance": [15, 25, 35],
    "weather": ["clear", "rain", "fog"]
  },
  "metrics": ["collision", "min_distance", "jerk"],
  "output_dir": "./results/urban_cut_in"
}