ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

自动驾驶仿真测试场景设计:概念、方法与工程实践

自动驾驶仿真测试场景设计:概念、方法与工程实践 简介PDF文档围绕自动驾驶仿真测试场景设计展开面向自动驾驶测试工程师、算法开发人员及智能汽车相关专业学生用于理解基于场景的仿真测试方法并解决传统实车测试成本高、边缘场景难覆盖等问题。资源为1个PDF文件共1.11MB内容源自科学技术创新期刊介绍了OpenX系列标准下的场景设计框架并重点剖析AEB自动紧急制动功能场景、逻辑场景和具体场景的逐级映射过程。文中以表格形式给出城市道路路况描述、主车状态、交通参与者横穿速度及相对位置等具体参数取值示例同时覆盖功能安全与预期功能安全视角下的误触发场景验证思路帮助读者从抽象场景定义落到可执行的测试用例设计。已有448人学习该资料适合作为自动驾驶仿真测试领域的方法论参考与实践指导。1. 场景设计在自动驾驶仿真测试中的定位最早我拿到《自动驾驶仿真测试场景设计.pdf》这份文档时第一反应是“终于有人把这一摊子事系统性地梳理出来了”。做自动驾驶测试的人多少都有过这种经历算法在仿真里跑得好好的一上实车就露馅今天这个场景能过明天换了个天气模型就翻车——根子往往不在算法本身而在场景设计不够扎实。仿真测试在整个自动驾驶研发链条里承担的角色是“用可控成本去覆盖不可控的真实世界”。实车路测一公里成本高、周期长而且很多危险场景压根不敢在公开道路上复现比如前车急刹、行人鬼探头、极端雨雾天气。仿真测试的价值就在这里把真实世界里出现过的、可能出现的、甚至极端但合规的交通情况抽象成可配置、可回放、可量化的数字场景让算法在虚拟环境里先撞够“南墙”。而场景设计就是这套体系里最核心也最容易被低估的一环。场景设计不是简单地在仿真软件里摆几个车、画几条路它需要回答几个关键问题被测车辆会遇到什么类型的危险这些危险出现的频率和分布是怎样的怎样用有限的场景数量去覆盖尽量多的可能性以及最重要的——怎么证明这些场景设计得足够充分这份文档我看下来核心价值就在于它把场景设计从一个“凭经验拍脑袋”的活儿拆成了一个有方法论、有分类体系、有评价指标的工程流程。对于刚入行做测试工程、算法部署或者正在搭建仿真平台的朋友来说理解场景设计的目标和方法比多跑几千公里仿真里程更有意义。因为场景设计直接决定了你的测试结论可不可信、算法漏洞能不能暴露、安全冗余有没有被验证到。没有好的场景库仿真平台做得再溜跑出来的也只是一堆自欺欺人的“通过”。2. 场景设计的基本概念与分类体系2.1 场景的术语定义与层级关系在深入设计方法之前先把术语统一一下否则后面沟通全是坑。文档里沿用了国际标准ISO 21448SOTIF预期功能安全和ASAM自动化和测量系统标准化协会体系里常用的三层场景概念功能场景、逻辑场景、具体场景。这三者的关系可以打个比方功能场景是剧本梗概逻辑场景是分镜脚本具体场景是每一个镜头的精确参数。功能场景是最抽象的一层用自然语言或半结构化语义描述比如“主车在高速公路上巡航前方车辆突然切入本车道”。这一层不做具体参数定义主要用于需求分析和测试策划阶段让产品、算法、测试三方对齐“要测什么”。逻辑场景则进一步细化把关键参数和参数范围定义出来比如前车切入时的纵向距离范围30到80米、主车巡航速度为100到120公里每小时、切入车辆的横向加速度范围等等。这一层的关键是定义参数空间而不是具体值。具体场景是为参数空间里的每个变量取确定值生成可以放进仿真软件直接运行的文件。一个逻辑场景通过组合不同的参数取值可以衍生出成百上千个具体场景。理解了这个层级关系你就明白为什么场景设计是一项系统的工程——它不是写几个测试用例而是在构建一棵从“测什么”到“怎么测”的参数树。2.2 自然驾驶数据与标准法规场景的互补逻辑场景来源是另一条绕不开的主线。目前业内场景库的构建主要有三类来源标准法规场景、自然驾驶数据集、事故重建数据。标准法规场景是最成熟、最“刚性”的一类来源于各国新车评价规程和安全标准。比如ISO 3888-2的蛇形穿行测试、中国C-NCAP里的AEB自动紧急制动测试工况、欧盟Euro NCAP的弱势道路使用者保护场景。这类场景的最大价值是可持续性——每个季度新车要送检要拿同一个标准去横向对比不同厂家的系统表现。但它的短板也很明显法规场景只能覆盖最低限度的安全要求远远覆盖不了真实道路的复杂度。自然驾驶数据集则是从海量真实驾驶数据中挖掘出来的高价值场景。现在业内常用的大规模数据集比如Waymo的开放数据集、nuScenes、Argoverse等都提供了丰富的真实交通流数据。通过在数据里做结构化提取和聚类分析可以找到“高频率场景”和“高风险场景”。举个例子从1000小时的高速数据里统计出最常见的车距保持场景参数是前车间距40米、相对速度5公里每小时那这就是逻辑场景参数空间的一个重要聚类中心。事故重建数据则补充了自然驾驶数据里“低频但致命”的空档。很多危险场景在自然驾驶中很难采集到比如对向车道车辆跨越实线迎面驶来、夜间高速上突然出现的静止障碍物。这类场景数量少但安全影响权重极大必须依靠事故数据来针对性重建。三类来源的综合使用方式我建议按照“法规场景保底线、自然驾驶数据覆盖高频、事故数据补极端”的思路来做场景库的层次化构建。这三者的比例没有统一标准但考虑到计算资源和测试时间约束可以参考一个粗放的分配法规场景占20%到30%自然驾驶场景占50%到60%事故重建场景占10%到20%。3. 仿真场景的关键参数与设计要素3.1 静态环境要素的建模与配置场景设计拆开来看主要围绕三类要素展开静态环境、动态交通参与者、环境条件天气和光照。静态环境要素是指道路结构、路面标识、交通设施、路侧建筑等不随时间变化或变化极慢的对象。这一块在仿真中的建模精度直接决定了传感器仿真的可信度。以摄像头仿真为例车道线的磨损程度、路面的反射率变化、交通标志牌的逆反射系数都会影响视觉感知算法对车道线和标志牌的检测效果。如果仿真里的路永远是崭新的、标线永远清晰、路面永远干燥那训练出来的算法一到真实世界立刻掉链子。静态环境建模还需要注意图层划分和语义信息标注。很多仿真平台里道路几何是一个图层车道级别拓扑关系是另一个图层路面材质和道路标线又是独立图层。设计场景时不仅要配置这些图层的模型还要给每个图层附加语义标签。比如车道边界线的虚线实线类型、路沿高度、人行横道位置等。这些语义信息会被感知算法、规划控制模块用作先验约束如果标注错误算法就会在仿真里学到错误的关联关系。具体到工具配置静态环境的参数至少应该覆盖以下几个方面道路几何曲率、坡度、超高、道路拓扑交叉口类型、车道数量、车道宽度、路面状态附着系数、粗糙度、积水程度、交通设施标志牌位置、信号灯配时方案、路侧遮挡物护栏、绿化带、建筑物的位置和高度。这里要特别提醒一个容易被忽视的点——路侧植被和建筑物的建模精度。很多场景设计为了省事把路边物体都建模成简单的盒子但这会导致毫米波雷达仿真的多径反射特征失真也会丢失视觉传感器被遮挡时的真实感知盲区。3.2 动态交通参与者与行为模型动态交通参与者是指主车周围的车辆、行人、两轮车等移动物体它们的运动状态和行为意图是场景设计的核心变量。按照SAE J3016的驾驶自动化分级仿真中的动态参与者从控制方式上可以分为预设轨迹式、路线规划式、智能驾驶模型式三类。预设轨迹式最简单直接定义参与者的位置一时间序列适用于重复性测试。缺点是交通参与者的行为无法根据主车状态做出响应场景的真实感较差。路线规划式则给它一条参考路径和速度曲线参与者沿着路径行驶遇到障碍物可以做一些初步绕避。智能驾驶模型式是最高级的它给交通参与者配置感知、决策、控制模块让它像一个真正的驾驶员一样对周围环境做出反应。在设计交通参与者行为时有一个核心参数必须重点把控——跟车模型和切入模型的时间间隙分布。真实人类的驾驶行为存在明显的个体差异有的驾驶员跟车距离近、反应快有的则保守得多。仿真里如果把交通参与者的行为都建模成一个“完美的机器人驾驶员”那主车的决策规划算法就会在仿真中养成依赖性到了真实道路上遇到人类驾驶员不可预测的行为就猝不及防。以典型的低速城区场景为例主车在单车道直行前方有行人从停靠车辆后方走出。这个场景的关键参数包括行人初始步行速度通常设定为1.2到1.5米每秒行人现身时与主车的纵向距离建议覆盖10米到30米的区间停靠车辆的长度和位置主车当前速度通常设定为30到50公里每小时。这些参数的排列组合会产生完全不同的测试严酷度比如行人晚出现、主车速度快、初始距离近这种情况下即便是人类驾驶员应对都会很吃力算法就更容易暴露缺陷。3.3 天气、光照与传感器物理仿真天气和光照条件属于场景要素里“环境条件”维度直接影响传感器物理特性。摄像头在逆光、黄昏、夜间无路灯环境下的成像质量差异巨大激光雷达在雨雾天气下会产生大量噪点有效探测距离大幅缩短毫米波雷达对雨水反射敏感对金属物体和人体反射特性差异明显。做天气光照相关的场景设计有一个关键认知必须建立传感器仿真不是追求“视觉上好看”而是追求“物理特征分布上真实”。换句话说虚拟环境里下的雨视觉上像那么回事还不够雨滴对激光雷达点云产生的噪声分布和真实雨天的统计特征要匹配。现在主流的商用仿真平台比如Carla和VTD都支持雨量、雾气能见度、光照强度、时间变化、太阳高度角等参数的连续配置重点是要根据传感器的物理模型去校验这些参数映射到传感器输出的统计特性是否合理。场景设计时还需要特别关注“传感器极限条件”即环境条件恰好处于传感器正常工作范围的边缘。比如摄像头在夜间近光灯条件下能检测的距离大约在60到80米如果主车在这个距离内遭遇静止障碍物留给系统的反应时间就非常紧张。这类场景比常规的白天场景更容易暴露算法在时间同步和感知融合上的短板。4. 实操用开源工具搭建一个完整测场景4.1 工具选型为什么推荐从CARLA和Scenic切入当前可用的仿真工具大致分两类商用一体化的VTD、SCANeR studio和开源生态的CARLA、SUMO、Gazebo等。对于刚开始搭场景设计能力的技术团队我更推荐从CARLA加场景描述语言Scenic的组合切入原因有三。第一CARLA基于Unreal Engine具备高质量的传感器仿真和灵活的场景加载能力支持通过Python API灵活控制场景中所有元素的状态。第二Scenic是一种概率性场景描述语言它的设计哲学就是“用紧凑的代码定义整个逻辑场景的参数空间”很适合把我们在文档里看到的场景设计方法论直接落地成代码。第三这套组合不依赖商业授权场景设计团队可以放开手试错迭代。但CARLA也有短板比如动力学模型精度和商用工具相比还有差距高精地图生态也远不如VTD成熟。如果项目已经进入量产阶段需要做CarMaker级别的车辆动力学仿真那就得在CARLA前端接CarMaker的动力学后端或者直接上VTD加高精地图的组合。工具没有绝对的好坏只有适不适合你当前的研发阶段。4.2 一辆主车与前方切入车辆的完整配置过程实际操作中一个最简单的“前车切入”场景可以这样配置。用CARLA 0.9.15版本环境Python 3.8以上版本通过以下核心代码来定义场景中的关键要素以下为关键片段示意完整代码可按需扩展import carla # 连接仿真服务使用默认地图Town05含高速公路路段 client carla.Client(localhost, 2000) client.set_timeout(10.0) world client.get_world() # 获取地图中的生成点选择一个车道直行、视野开阔的位置作为主车出生点 spawn_points world.get_map().get_spawn_points() ego_spawn spawn_points[15] ego_bp world.get_blueprint_library().find(vehicle.tesla.model3) ego_vehicle world.spawn_actor(ego_bp, ego_spawn) # 生成切入车辆并设定初始终纵向位置相对主车后侧10米、相邻左侧车道 cutin_bp world.get_blueprint_library().find(vehicle.audi.a2) cutin_spawn ego_spawn.transform cutin_spawn.location.x - 10.0 cutin_spawn.location.y 3.5 cutin_vehicle world.spawn_actor(cutin_bp, cutin_spawn) # 打开自动驾驶模式让切入车辆按车道保持行驶 cutin_vehicle.set_autopilot(True)这里需要注意两个容易踩坑的细节。一是地图的选择CARLA默认地图的布局差异很大Town01是训练场风格Town03有城市快速路Town05包含高速场景不同地图的可测试信息密度完全不同。我做切入类场景时优先用Town05因为它有连续的高速公路段便于设置较高的主车巡航速度。二是主车出生点和切入车辆出生点之间的横向距离设定。真实高速公路上车道宽度是3.5到3.75米所以切入车辆初始位置在主车相邻车道中线的横向偏移大约3.5米。如果横向偏移设置得过小车辆会从一开始就处于碰撞状态设置过大则不符合真实道路几何约束。车辆生成后还要给切入车辆编写行为控制逻辑。最便捷的方式是使用CARLA的Traffic Manager模块设置车辆的自动导航目标行为但如果你需要精确控制切入行为的起始时刻和切入的横向加速度曲线我建议直接接管车辆控制在每一个仿真时间步长里根据预设的轨迹点计算转向和油门这个层面需要自己写轨迹规划。实际的切入段纵向速度可设定为80公里每小时匀速横向加速度则设为2到3米每二次方秒切到本车道中线后沿车道行驶。4.3 从逻辑场景生成批量具体场景当单个场景跑通后下一个核心能力是从逻辑场景批量生成具体场景。这是场景设计方法论在工程落地中最关键的一环。继续以前车切入为例逻辑场景的参数空间可以定义为主车巡航速度V_ego100到120公里每小时、切入车辆初始纵向间隙D_init30到80米、切入横向加速度A_lat1.5到3.5米每二次方秒、切入持续时间T_cut2到5秒。在Scenic中这个逻辑场景可以这样定义示意代码param ego_speed Uniform(100, 120) # km/h param init_gap Uniform(30, 80) # m param lat_accel Range(1.5, 3.5) # m/s^2 ego Car at (0, 0, 0), with speed ego_speed cutin_car Car at (init_gap, -3.5, 0), with speed ego_speed ...然后利用Scenic的采样器在参数空间里均匀采样或按权重采样生成成百上千个Inject脚本批量在CARLA里执行。采样策略这里有一个重要的方法论问题是均匀网格采样还是有针对性的重点采样。我个人的做法是先用均匀采样跑一遍看哪些参数组合条件下主车的安全距离余量最小、哪些区域存在性能突降再在这些关键区域做局部加密采样。这样做既能保证参数空间的覆盖度又能把计算资源集中在最容易出问题的参数组合附近。批量执行时要注意仿真的时间同步设置。CARLA有两个关键的时间模式固定时间步长Fixed Time-step和实时模式Real-time。场景测试中我强烈建议使用固定频率20到50Hz的固定时间步长。固定步长的核心价值在于可复现性——同一个场景文件在同一版本仿真器上多次运行结果一致。如果使用实时模式仿真速度受到渲染性能影响同一场景每次跑出来的帧率不同传感器数据的时序关系就会发生变化测试结果不可比。时间同步这个环节很多团队初期都不够重视等到要做回归测试、对比不同算法版本时才发现同一个场景跑两次结果不一样回头排查全是时间同步的锅。5. 场景设计中的常见问题与实操避坑5.1 传感器模拟失真的“同场景不同结果”这是我在实际测试中遇到最多的一类问题同一个场景文件在传感器配置相同的情况下换个显卡或者调整了渲染分辨率传感器的感知结果出现明显变化。对于摄像头而言渲染分辨率直接影响图像中远处目标的像素密度检测距离边界就会出现漂移对于激光雷达而言点云密度和仿真器内部的射线采样算法有关如果射线数配置不当同一场景下目标物的点云数量会剧烈波动。排查思路分三步走。先确认仿真器版本和渲染设置是否锁定不同版本对同一材质的光照响应可能不同再确认传感器参数的物理单位是否正确比如激光雷达的垂直视场角和角分辨率是否与实际传感器型号一致最后检查传感器是否受到场景中其他物体的遮挡尤其是保险杠位置安装的毫米波雷达很容易被车辆自带的金属结构遮挡。5.2 行人模型碰撞体积与动画状态异常很多场景设计里需要设置行人在特定时刻横穿马路。仿真平台中行人的碰撞体积模型通常是一个胶囊体或圆柱体这个体积在站姿和走路状态下略微不同。如果行人的动画状态和移动逻辑切换不当行人可能在横穿到一半时突然站住或者移动速度出现跳变导致主车的AEB系统判断时出现误触发。这个问题我在实际项目中踩过坑。当时测试一个行人横穿场景行人以1.4米每秒的速度横穿主车以40公里每小时接近按理论计算AEB应该在距离行人15米左右触发。但实际仿真中AEB触发距离变成了11米排查后发现是行人动画状态切换时碰撞体积模型一瞬间发生了微小偏移毫米波雷达检测到的目标点位置出现了跳变。解决办法是在行人出发前强制锁定动画状态并在整个横穿过程中保持动画状态一致移动只通过位置更新驱动不做动画混合。5.3 超车场景中时间窗口控制失效在超车场景设计里常会遇到“对向车辆”和“被超越车辆”之间的距离及时间窗口计算不准的问题。比如设计一个双向双车道场景主车需要借对向车道超越前方慢车。如果对向来车的出现时机过晚主车已经完成超车回到本车道这个场景就测不到规划算法在时间压力下的决策能力如果对向来车出现得过早主车会在一开始就被迫放弃超车动作同样达不到测试目的。控制这个时间窗口的关键是计算主车从开始借道到完成超越回到原车道需要多少时间再在这个时间基础上留出安全余量来设置对向来车的位置。以主车超车时相对被超车辆速度差20公里每小时、超车动作总耗时6到8秒为典型的场景参数那么对向车辆在场景开始时的纵向位置设置为主车道前方约250到350米处并让对向车以80公里每小时驶来这样才能在主车完成超车动作的临界点附近形成真正的测试压力。这个时间窗的计算建议做成一个自动化脚本每次生成场景时都校验一遍避免手工计算时忽略主车初始速度变化带来的时间窗口偏移。5.4 大规模场景库的高效筛选策略当成百上千个具体场景在仿真平台上跑完面对堆积如山的测试报告下一步的筛选工作至关重要。推荐的方法是先统计每个场景下主车的最小TTCTime-to-Collision碰撞时间和最小安全距离余量把那些“过于安全”的场景最小TTC大于5秒聚合成一类这些场景在回归测试时可以周期性抽样运行而不是全量运行把“接近失效边界”的场景最小TTC小于2秒且没有触发系统的有效干预单独标记出来人工检查是场景设计过于苛刻还是算法确实有缺陷。有一个容易被忽视的筛选维度是“覆盖度分析”。当新的算法版本发布后你需要确认是否已有场景覆盖了它新增的功能边界。比如新版本增加了对异形车的识别支持就需要检查场景库里是否包含足够多的货车、挂车、工程车辆案例。否则新功能测了等于没测。建立场景库与功能特性的映射矩阵是规模化阶段最值得投入的一件事情。6. 后续可以继续扩展的方向场景设计做到一定程度后单纯靠人工标注、手工设计场景的边际收益会越来越低。接下来更高效的路径是结合场景挖掘技术从大规模路采数据里自动提取场景片段再通过场景泛化、参数变换生成更丰富的测试集。我在实际做车载数据的轨迹级场景标注时通常会把原始传感器数据先做目标级信息提取再做帧间匹配最后按时间窗口切出“核心场景片段”这样后期场景重构时的数据量会小很多也更容易复现同一个场景的逻辑链条。如果团队成员熟悉算法开发还可以用深度强化学习中的对抗生成方法来探索参数空间里的“边缘场景”。简单来说就是不盲目均匀采样而是把摄像机当成一个攻击者通过奖励函数引导它发现能让主车决策系统出错的状态组合。举一个实际案例在一个路口左转场景中让对向直行车的速度、加速度和主车的启动时机形成对抗关系几分钟训练后就能找出多组“对向车突然加速、主车刹车过晚”的边缘参数组合。这种场景靠人脑的经验枚举几乎不可能覆盖完整但对抗生成可以在较短时间内补齐这个盲区。当然这类数据驱动的方法和算法生成方法都对团队的算法能力和仿真平台的开放性提出更高要求。如果目前团队还不具备这样的条件先把手工场景设计的方法论沉淀好、把场景库的规范建起来就已经比大多数公司领先了。场景设计这条路最怕的不是做得慢而是方向错了还跑得飞快。本文还有配套的精品资源点击获取
返回列表