做自动驾驶测试的人,大多绕不开一个尴尬:纯实路测试太贵太慢,危险场景根本不敢反复做;纯数字仿真又太理想化,传感器模型做得再精细,也很难骗过真正的感知算法和域控制器。后来我在整车测试台架上深入接触了ViL,也就是整车在环(Vehicle-in-the-Loop)测试技术,才意识到这可能是当前工程落地价值被低估最严重的一种测试形态。
简单说,ViL就是把一辆能开的真车架在转鼓试验台上,让它的摄像头、毫米波雷达、卫星定位模块接收到的是虚拟交通场景信号,而车辆的转向、制动、加速却全部真实发生。这种“车是真的、世界是假的”的组合,让测试场景既可严格复现又不用承担实路风险,还能提前暴露整车级的集成问题。这篇内容是我从方案设计、台架搭建到场景实测全程梳理下来的系统性总结,适合正在搭建测试台的工程师、自动驾驶算法团队里的测试开发同学,以及想搞清楚各种“在环”到底差在哪儿的行业新人参考。
1. 为什么需要ViL:在“纯仿真”和“实路”之间找一个可信的中间态
1.1 四种主流测试手段的能力边界对比
我在做测试方案选型时,第一步永远是先盘清楚手头这些手段各自能回答什么问题。SIL(软件在环)、HIL(硬件在环)、ViL(整车在环)和实路测试,其实对应的被测对象和安全边界完全不同。
| 测试手段 | 被测对象 | 传感器环境 | 场景可控性 | 可重复性 | 成本量级 | 主要适用阶段 |
|---|---|---|---|---|---|---|
| SIL | 算法/模型 | 虚拟传感器模型 | 高 | 高 | 低 | 算法快速迭代 |
| HIL | 真实域控制器 | 电子信号级模拟 | 高 | 高 | 中 | 功能逻辑验证 |
| ViL | 真实整车 | 真实传感器+虚拟场景注入 | 高 | 高 | 较高 | 整车集成验证 |
| 实路测试 | 真实整车 | 真实交通环境 | 低 | 低 | 很高 | 最终验证与样本积累 |
SIL阶段的问题在于太“干净”了。感知算法拿到的是理想化的目标列表,没有图像噪声、没有多径反射、没有时延抖动,很多融合策略在SIL里跑得漂漂亮亮,一上真车就露馅。HIL比SIL进了一步,控制器的接口是真实的,但传感器信号仍然是用总线注入的模拟值,摄像头被替换成报文,雷达被替换成CAN上的目标列表,这种验证对底盘、制动、转向等执行系统的覆盖几乎为零。实路测试倒是什么都真实,但问题也摆在明面上:场景不可控、不可复现,一个极端危险的切入场景可能要跑几万公里才碰到一次,而且就算碰到了,出于安全和技术合规考虑,也不敢真的让它撞上去。
ViL恰好补上了这个空档。它把真实整车当作被测对象,把虚拟世界当作可控的“测试环境”,危险场景可以无限次重演,每次施加的干扰变量还能精确控制。如果只用一个标准来评价测试方法在工程链条里的价值,我会说:它能用更低的代价,提前暴露更接近真实车辆表现的缺陷。
1.2 ViL的核心理念:车是真的,世界是假的
“整车在环”这四个字,核心在“环”。真车停在转鼓/底盘测功机上,硬件在环中的“环”指的是控制器和仿真模型之间构成的信号回路,而ViL里,回路多了一层物理世界:车辆纵向动力真实作用于转鼓,转鼓把道路负载、坡道阻力实时反馈回车辆,转向系统通过转向机器人或驾驶员操作真实响应,整车的感知、决策、执行链条全部在一台完整的真车里面闭环。
打个比方,这就像把一位演员请进了一个虚拟摄影棚。演员是真的,他的身体反应、表情、动作都是真实的,但周围的环境、对手戏角色都是数字生成的。摄像头就是演员的眼睛,它看到的是虚拟的车辆和行人;域控制器是他的大脑,它做出的判断又真实地驱动了车辆加速、刹车和转向。关键就在于,演员自己完全不知道自己站在绿幕里,它以为自己在真正的马路上行驶。
这种设计带来的工程价值非常直接。第一,感知系统接收到的是真实光路、真实镜头、真实安装位置下的画面,摄像头镜头的脏污、振动、安装公差这些环境因素都会真实作用于算法;第二,决策和控制系统面对的不再是模拟信号,而是真实的CAN/CANFD/以太网通信负载和真实的整车电气环境;第三,执行层是真实的制动系统、ESP、转向系统在响应。这一点是HIL无论如何都替代不了的,因为VCU和底盘控制器的很多故障和性能衰减,只有在真实液压、真实负载、真实线束条件下才会暴露。
2. ViL测试系统总体架构与关键部件拆解
2.1 系统总体架构:五大子系统各司其职
一套完整的ViL台架,基于我参与的项目经验,通常可以拆成五个子系统,缺一个都可能让“环”跑不完整。
- 真实车辆系统:被测车辆本身,包含传感器、域控制器、执行器以及整车电气架构。车辆的供电推荐使用独立的直流电源或车载电池,很多台架会保留原车12V/48V供电,避免电网波动干扰测试结果。
- 底盘测功机系统:也就是转鼓试验台,负责模拟道路阻力、坡度、惯量。四驱车型用双轴转鼓,前驱车用单轴也够,但横纵向耦合场景建议配置双轴甚至四驱转鼓,不然前桥后桥的扭矩分配没法真实再现。
- 场景仿真平台:运行虚拟世界的“导演系统”。主流方案有基于专业驾驶仿真引擎(如VTD、CarSim、Prescan、51SimOne)的,也有基于游戏引擎自研渲染的。它不仅要生成动态交通流,还要输出传感器注入所需的信号。
- 传感器信号注入系统:包括视频注入单元、毫米波雷达目标模拟器、激光雷达目标模拟器、GNSS信号模拟器、V2X通信模拟器。这套系统的还原度,直接决定了ViL结果的可信度。
- 时间同步与数据采集系统:负责把所有子系统的时钟对齐,统一记录真值、CAN总线数据、传感器原始数据和仿真场景数据。这块做得不好,后续数据分析会变成一场灾难。
整个系统的工作链路可以这样理解:场景仿真平台生成一帧“虚拟世界”,把图像传给视频注入盒,让它把虚拟画面叠加或替换到摄像头信号里;同时把目标级信息传给雷达目标模拟器,让它在指定距离和角度上生成雷达回波;转鼓根据当前车辆速度和虚拟道路条件实时调整负载;车辆的真实状态又通过总线返回仿真平台。这个闭环一旦建立,车辆就像一个玩VR游戏的玩家,但它玩的不是手柄,而是自己的方向盘和油门刹车。
2.2 感知信号注入:ViL区别于HIL的核心所在
感知信号注入是ViL最有技术含量也最容易踩坑的部分。绝不能让传感器“感知”到自己在测试台上,否则一切测试结论都失去了意义。
先说视觉注入。摄像头是智能汽车的“眼睛”,ViL里眼睛看到的一定是虚拟世界的画面。工程上常用的做法是视频注入盒(Camera Injection Unit)把渲染引擎输出的图像,按摄像头的像素格式、分辨率、帧率、曝光参数处理后,直接送入摄像头的信号链路。实现方式分两种:一种是信号级替换,把真实摄像头的LVDS/同轴信号断开,把虚拟图像注入进去;另一种是屏显式,把虚拟画面显示在车辆前方特定距离的屏幕上,让摄像头直接拍屏幕。信号级替换是主流,因为屏显式在逆光、夜间、明暗突变场景下很难模拟真实光照细节。
视频注入的技术难点是延迟和同步。我常用的判断标准是:从仿真引擎渲染出一帧画面,到该帧被域控制器接收到,端到端延迟不应超过50毫秒,更严格的场景要求低于20毫秒。帧率必须和车辆摄像头匹配,通常做到30fps覆盖大多数测试场景,如果被测功能对运动模糊敏感,最好跑到60fps。还有一点容易被忽略:摄像头标定参数,包括内参(焦距、光心、畸变)和外参(安装位置、角度),注入画面的成像结果必须和实拍保持一致,否则感知算法里的空间映射关系全部错乱。
再说雷达回波注入。毫米波雷达目标模拟器(RTS)不是把目标列表发到CAN上,而是在射频层面生成真实的目标回波。雷达发射电磁波后,模拟器在设定的距离、径向速度、角度、RCS(雷达散射截面积)上返回仿真信号,雷达自己根本区分不了目标是真是假。这里的坑在于多目标、多普勒模糊和距离速度耦合的还原度,便宜设备在单目标场景勉强凑合,一到多目标密集场景就频繁掉目标,最后测试结论完全失真。
激光雷达的注入方案分成两种流派。一种是回波级模拟,用光反射或光学开关阵列模拟每个激光脉冲的返回信号,真实度最高,但设备贵、标定复杂;另一种是点云级注入,直接把仿真点云转换到激光雷达数据格式,从数据接口注入给感知算法。点云级方案成本低、用起来方便,但对设备本身的光学链路验证不够。GNSS信号模拟器则负责在虚拟场景里为车辆提供经纬度、航向、车速信息,支持GPS/BDS/GLONASS/Galileo多星座,能做多路径和信号遮挡仿真。V2X通信模拟器是给OBU喂假消息的,模拟前车发来BSM、路侧RSU发来SPAT信号等。
2.3 动力学与执行层交互:转鼓和转向机器人怎么配合
ViL不是把车架在滚筒上就完事,车辆的动力学闭环必须真实可信。底盘测功机的任务是用转鼓模拟车辆在道路上行驶时受到的各种阻力:滚动阻力、空气阻力、坡道阻力和加速惯性阻力。这与车辆在道路上行驶时发动机或电机需要输出的扭矩曲线一致。
转鼓系统的核心指标是阻力模拟精度和惯量模拟误差。工程上惯量模拟通常要求误差控制在±1%~2%。如果车辆和转鼓之间的惯性设定不匹配,车辆加速响应会明显失真,开起来感觉像载重和空载完全对不上,这时候测试出来的AEB触发点、ACC跟车平顺性都不会有可信度。
转向是ViL里比纵向控制更麻烦的一环。转鼓只能提供纵向自由度,车轮无法横向偏转,所以车辆无法在台架上有真实的横向运动。这一点必须正视。工程上的解决办法是配置转向机器人,模拟驾驶员或者控制系统的转向输入,然后让域控制器认为方向已经按指令转动。但对于某些强依赖横摆响应的功能,比如车道保持中的横向控制、紧急避障,纯靠转向机器人在零横向自由度条件下验证是有局限性的,此时要结合HIL或者实车验证做补充,或者采用带有横向自由度的转鼓/轮式平台方案。
3. ViL测试流程:从需求拆解到报告输出
3.1 测试需求分析与场景设计
ViL测试的第一步,不是开机,而是明确“你要验证什么”。我会把所有测试目标拆成三层:感知性能层、决策策略层、执行响应层,每层对应不同的场景设计和评价指标。
场景来源上,我建议优先级从高到低排列:第一是事故数据,国内有CIDAS(中国交通事故深入研究)数据库,里面有大量真实碰撞案例,从中提炼出来的典型危险场景说服力最强;第二是自然驾驶数据,切出来的关键片段可用于回归验证;第三是标准和法规场景,比如AEB相关的测试场景,虽然很多规程是基于目标物的,但移植到ViL后可以扩展更多车速组合和天气条件;第四是安全性分析(SOTIF/ISO 21448)推导出的边缘场景,这类场景实路极难遇到,恰恰是ViL最擅长复现的。
场景设计时要明确三个层级:功能场景是文字和参数范围描述,比如“本车以40-60km/h匀速行驶,前车静止,能见度下降”;逻辑场景是参数范围和概率分布,比如前车距离从20米到80米均匀采样;具体场景则是固定参数的单一用例,每个参数给一个确定值。我的习惯是先用逻辑场景做覆盖度分析,再自动生成一大批具体场景,每个具体场景对应一条ViL测试用例,批量排队执行。这样做的好处是测试报告出来之后,可以明确说“某个参数域的覆盖率达到了多少”,而不是给出一堆零散的通过率。
3.2 环境搭建与设备标定
场景设计完成后,进入台架准备阶段。这个阶段最容易被低估,很多项目就是在标定环节埋了雷。
第一件要做的事是转鼓参数设置。根据被测车辆的整备质量、轮胎规格、风阻系数、滚动阻力系数,在测功机里配置道路负载模型和惯量模拟参数。配置完成后,建议先跑一组自由滑行工况验证:车辆在空挡滑行,转鼓模拟出的减速度和实际道路经验值是否一致,误差超过2%就需要重新标定。
第二件是摄像头注入链路标定。把真实车辆停在转鼓上,打开注入设备,在仿真场景里放置一块棋盘格或路灯杆等特征明显的标志物,然后对比摄像头实际输出画面和预期投影位置。这一步是验证内参外参是否匹配、画面畸变是否一致的关键。很多感知算法在实车上表现正常,一站到ViL上就报位置偏移,80%的情况是注入画面和真实摄像头的视场角、畸变模型对不上。
第三件是多系统时间同步配置。整套台架的时间基准通常采用PTP(IEEE 1588)或IRIG-B,确保场景仿真、注入设备、数采系统都在同一个时间轴上。我在实践中会额外做一个“时间戳漂移检测”:把GNSS模拟器输出一个脉冲信号作为基准,连续运行2小时,检查各设备记录的时间戳与基准的偏差是否稳定在一个可接受范围内,通常要求小于1毫秒。
3.3 测试执行与数据采集
标定完成之后,进入自动化执行阶段。ViL的优势在于可以连续跑脚本,不需要每跑一个场景就重新部署车辆。我会把测试用例组织成批次任务队列,每个用例包含场景描述文件、初始车速、动态目标轨迹、天气条件、通过判据和需要采集的数据清单。
测试执行过程中,有一个非常关键的细节:通过判据的自动化。不要等测试跑完再人工看数据判断通过与否,应该在执行过程中实时计算。以AEB测试为例,通过判据是相对距离最小时刻的TTC不低于某个阈值,或者本车相对速度降到零时与前车的距离大于预期安全距离。实时判据的好处是自动化测试程序能立即决定是继续下一用例,还是复测当前用例,节省大量台架时间。
数据采集方面,至少要同时记录四路时间对齐的数据:仿真场景真值(目标位置、速度、加速度、相对距离)、车辆总线数据(CAN/CANFD报文里的车速、方向盘转角、制动主缸压力)、感知输出日志(目标列表、车道线、融合结果)、注入信号监测(视频帧序号、雷达目标ID对应关系)。这四路数据缺了任何一路,出现问题时都很难定位是场景问题、注入问题还是算法问题。
4. ViL测试常见问题与排查技巧实录
4.1 时间不同步导致的“灵异现象”
我遇到最多的问题就是:同一个场景,第一次跑功能正常触发,第二次跑完全不响应,第三次跑稍微延迟了300毫秒。排查到最后,几乎都是时间同步问题。
具体表现是,仿真引擎里的目标车已经制动减速了,但视频注入的画面里目标车的位置、雷达注入的目标速度却在时间轴上滞后了几帧。感知算法拿到的是“几帧之前”的世界,而决策模块拿到的车辆自身状态却是实时的,这种错位会让融合结果出现位置跳变,严重情况下直接导致AEB漏报。解决办法是先把PTP同步配置好,在各注入设备上做时间戳校准,然后跑一组“时间一致性测试用例”:场景里放一个规律运动的物体,比较视频帧、雷达目标、真值三者的时间戳曲线,偏差超过一帧就要处理。
4.2 视频注入延迟与丢帧问题
视频注入盒是高负载环节,场景复杂时渲染引擎要同时输出多路摄像头画面,再加上全局光照效果,帧率很容易掉。帧率一掉,视频链路就会出现丢帧,感知算法拿到的画面不连续,目标跟踪会断。
我在项目里踩过两个坑。一个是渲染引擎的实时性没优化好,GPU负载打满后渲染帧间隙不均匀,有的帧延迟40ms,有的帧延迟80ms。另一个是视频注入盒的缓存策略不合适,它会为了保持“不卡顿”而丢帧,但感知算法需要的是每一帧连续时间戳,与其丢帧不如稍微延迟。解决办法是,给渲染引擎预留30%左右的GPU性能余量,并强制关闭不必要的后处理效果,同时把视频注入盒设置为“排队不丢帧”模式,用系统时统控制帧输出节奏。延迟增加一点不要紧,只要稳定,感知算法能适配;最怕的就是延迟忽高忽低。
4.3 多传感器注入不一致,融合层“打架”
ViL里最头疼的问题,是摄像头看到了目标但雷达没有,或者摄像头和雷达都看到了目标但位置对不上。真实世界里,多传感器对同一目标的测量天然存在误差,这个误差是融合算法设计之初就考虑到的。但在ViL里,如果相机注入的目标位置和雷达回波注入的目标位置本身就不一致,而且是系统性地不一致,就会导致融合算法输出一个“跟着感觉走”的不稳定结果。
排查思路是这样:先把各传感器的感知输出单独拉出来看,确定是哪一路注入出了问题;然后用真值数据做基准,画出摄像头感知位置误差和雷达感知位置误差的时间曲线。如果雷达的误差是一条稳定直线,通常说明雷达目标模拟器的距离标定有偏差;如果摄像头误差随视角变化,说明注入画面的外参标定有问题。确认根因之后,重新标定对应注入链路,而不是去调被测算法的融合参数。这个原则我反复在团队里强调:ViL台架的职责是复现真实世界,不是帮算法“补课”。
4.4 转鼓设置异常导致的车辆“假反应”
转鼓参数设定错误,车辆会给出“假反应”。比较典型的是惯量设置过大,车辆加速时感觉像在后面拖了一台车,AEB触发后的减速过程也变得迟钝;惯量设置过小,车辆又显得轻飘,制动力稍微大一点就会触发ABS或ESP介入,但这种情况在真实道路上同款车根本不会触发。
排查这类问题时,不要一开始就怀疑整车控制系统,而是先做转鼓自由滑行和定速阻力校验。我的一般做法是,在车辆稳定匀速行驶时,通过整车总线读取实际的驱动扭矩,和转鼓显示出的阻力扭矩对比,二者偏差超过3%就需要重新校准。还有一个容易被忽略的问题:胎压和轮胎温度。车辆在转鼓上长时间跑,轮胎温度上升会导致滚动阻力下降,如果转鼓的阻力模型是静态配置的,测试到后半段就会出现纵向动力学响应漂移。因此长时间批测任务中,要定期插入一次校准工况来补偿。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查步骤 | 解决办法 |
|---|---|---|---|
| 同一场景两次结果不一致 | 时间同步漂移 | 检查PTP,比对时间戳曲线 | 重新对时,定期做时序校验 |
| AEB/ACC在ViL上表现异常 | 视频注入延迟/丢帧 | 观察帧率曲线和Cache策略 | 预留渲染性能,调整注入策略 |
| 融合目标位置跳变 | 多传感器注入不一致 | 分路输出感知误差曲线 | 标定对应注入链路 |
| 车辆加速无力/发飘 | 转鼓惯量/阻力异常 | 做自由滑行和定速阻力校验 | 重新配置道路负载模型 |
| GNSS定位漂移 | 天线安装/星历配置错误 | 静态定位精度测试 | 重新标定天线位置和线损 |
| 激光雷达感知异常 | 点云注入格式不匹配 | 对比真实点云与注入点云结构 | 调整数据接口转换层 |
5. ViL能测什么:典型应用场景与落地价值
5.1 典型功能测试场景举例
ViL真正能发挥价值的地方,是那些在实路上不敢做、做不了、做不起的场景。以我接触到的项目为例,AEB自动紧急制动测试是最高频的ViL应用场景。传统场地测试只能用假目标车,速度上限和撞击风险都有限制;在ViL里,目标车是虚拟的,可以从任何方向、以任何速度切入,本车则可以踩到真实道路工况下的高速,然后让真实制动系统完成紧急刹停。每次测试结束,转鼓刹车,系统重置,又可以马上跑下一个用例。
ACC自适应巡航测试同样是ViL的强项。前车是虚拟的,它的加减速行为、切入切出完全由场景脚本控制,可以精确复现“前车急刹后立刻脱离”这种在实路上极难稳定出现的组合操作。本车的加速、巡航、制动全是真实物理过程,发动机/电机扭矩、换挡逻辑、制动液压响应都在真实状态下被考核。APA自动泊车这类强依赖摄像头和超声波的场景也适合做ViL,虚拟车位、虚拟障碍物可以设计成各种极限角落,连续跑完几百个泊车用例,每个用例之间只需要几秒钟重置。
还有一个容易被低估的价值是软件OTA回归测试。整车OTA推送一个新版本感知模型或规控策略之前,用ViL把历史积累的典型场景库完整跑一遍,能提前发现实车才会暴露的集成问题。我参与过的项目里,就出现过新版本算法在SIL仿真里全部通过,但在ViL上因为图像色彩空间差异导致车道线检测率大幅下降的案例,这个bug如果不是在ViL阶段拦下来,上了实车推送后果不堪设想。
5.2 测试效率与成本账:ViL值不值
有人会问,ViL台架一套下来动辄几百万,值不值?单纯从设备成本上看确实不低,但算总账会发现它划算得很。拿AEB测试举例,实车场地测试一次完整场景布置加准备,通常需要15-30分钟,一天能跑的量有限,而且还要考虑假车维护和事故风险;ViL台架上,一个标准AEB场景从加载到执行完毕只需要2-3分钟,算上转鼓回位和系统重置,一天轻松跑300个场景。如果建一个1000条用例的回归场景库,实路大概要两个月,ViL只需要一周左右。而且它不需要加油、不需要场地协调、不依赖天气,夜间和雨雾场景在虚拟世界里一点就着。
从测试覆盖度的角度看,ViL能突破实路测试的物理限制。危险场景、极端天气、传感器脏污、通信干扰,这些条件在实路测试中要么复现成本极高,要么根本不具备复现条件,在ViL里都能按需构造。更重要的是,所有场景可以数字化存档,版本可控、可追溯,这对功能安全和SOTIF分析来说意义重大。
5.3 从ViL到“仿真+场地+道路”三位一体的测试体系
ViL不是来替代谁,而是把整个测试体系串起来。我在实际项目里运行最多的组合策略是:算法模型阶段用SIL快速迭代,覆盖量和参数扫描为主;功能逻辑验证用HIL,对控制器接口和软件逻辑做回归;整车级集成验证用ViL,把传感器真实接入、整车电气环境、执行器响应全部拉进来;最后只保留一小部分必要的实路测试,用于最终验收和合规样本积累。这样就可以把有限的实路测试里程,花在最必要的地方。
这种“三位一体”思路现在也逐步渗透到教育和竞赛领域。高校学生做智能汽车竞赛或者毕业设计时,由于场地和安全条件受限,很多团队开始搭建简化版的仿真-实车联合测试环境,用仿真场景驱动实体小车或者开发板,本质上就是ViL思想的小型化落地。对刚接触智能汽车测试的同学来说,从理解ViL这套“真假结合”的理念入手,比一上来就扎进实车上路测试要稳妥得多,踩坑成本也低很多。
根据我个人搭建台架和跑项目的经验,如果要从零开始上ViL,千万不要一开始就追求“大而全”。先选定一个具体功能场景,比如ACC或AEB,把纵向闭环跑通,再逐步扩展雷达、V2X、转向机器人这些子系统。每加一路注入,都要先把该路的标定和时间同步做得足够扎实再接下一步。这一行里没有捷径,台架不会骗人,你前期标定偷的懒,后面全都会变成排查问题的时间加倍还给你。最后再分享一个小技巧:测试过程中一定要常态化保留每个场景的“金标准”回灌数据,也就是把仿真真值、注入信号、车辆响应都存成标准化格式。等到算法或者台架设备有变动的时候,用同一批历史用例做回归,你会发现这套资产比新增十套设备还值钱。