导读
2024年冬,某高速上发生了一起追尾事故。驾驶员回忆:前车急刹,自己踩下刹车但来不及,碰撞前AEB没有触发。事后调查发现,事发路段前方有一辆尾部颜色与天空对比度极低的白色货车,而那辆车的AEB系统恰好没有识别出这个”边缘目标”。这起事故并非个案——全球每年因ADAS功能失效或性能边界认知不清导致的事故屡见报端,而背后暴露的核心问题是:ADAS不是”装了就能用”,它需要经过严格的功能验证和边界测试。
|
自动紧急制动(AEB)、自适应巡航(ACC)、车道保持(LKA)、领航辅助驾驶(NOA)——这些功能正在从高端车型快速下探到10万元级别的家用车。然而功能普及的速度,远快于行业测试能力的沉淀。许多工程师匆忙上岗,却对”测什么、怎么测、用什么工具”缺乏系统认知。 |
本文面向刚踏入ADAS测试领域的工程师和测试负责人,系统解决以下问题:
-
ADAS系统的四层架构到底是怎样的,各层需要测试什么? -
MIL、SIL、HIL、实车测试四种阶段怎么选,各阶段用什么工具? -
AEB用例设计有哪些行业标准和设计方法? -
CANoe在HIL台架中怎么用,怎么注入传感器仿真信号? -
完整测试报告应包含哪些要素? -
ADAS测试工程师的入行路径和能力图谱是什么?
本文学习闭环如下:理解架构 → 设计用例 → 掌握工具 → 输出报告。三层缺一不可,只有形成闭环,测试工作才能真正为安全兜底。
图片引自微信公众号,扫码关注阅读原文一
ADAS测试工程师需要测什么
SAE L0~L5分级:知道自己测的是哪个”级别”
SAE(国际汽车工程师学会)将驾驶自动化分为六个等级,这是整个行业的通用语言:
- L0 无自动化:
人类完成所有驾驶操作,系统仅提供报警(如车道偏移报警LDW) - L1 驾驶辅助:
系统辅助完成一项驾驶任务(横向或纵向),典型功能是ACC或LKA,每次只能管一个方向 - L2 部分自动化:
系统同时控制横向和纵向,但驾驶员必须始终监控环境并随时准备接管。特斯拉Autopilot、蔚来NIO Pilot等目前主流产品均处于L2级别 - L3 有条件自动化:
在特定ODD(运行设计域)内,系统可以完成所有驾驶任务,但驾驶员仍需在系统请求时接管。L3是责任划分的重要分水岭——当系统运行时发生事故,责任归属车企 - L4 高度自动化:
在限定区域内无需人类介入,但超出ODD时系统会安全降级而非让驾驶员接管 - L5 完全自动化:
无任何场景限制,目前仍属远期愿景
对于ADAS测试工程师而言,日常工作中接触最多的就是L1和L2系统。这两个级别有一个共同特征:驾驶员是最终的责任主体。无论系统多么”智能”,测试时永远要记住:驾驶员的手还在方向盘上,脚还在踏板附近,系统的任何失效最终都由人来兜底。
六大高频功能白话扫盲
清楚了等级,接下来看具体功能。以下六个功能是当前量产车中出现频率最高的ADAS功能,也是测试工作量最集中的领域。
AEB(自动紧急制动,Autonomous Emergency Braking)
当系统检测到与前车或行人存在碰撞风险时,自动施加制动以减轻或避免碰撞。注意AEB通常分为两阶段:先是FCW(前方碰撞预警,Forward Collision Warning)通过声光提示驾驶员;当碰撞风险进一步升高且驾驶员仍未响应时,AEB才会主动制动。这是一个”警告 + 干预”的递进逻辑,测试时要分别验证两个阶段各自的触发条件和时序。
ACC(自适应巡航控制,Adaptive Cruise Control)
在定速巡航的基础上,ACC增加了前车感知能力。它能自动保持与前车的设定跟车距离:前车减速,本车自动减速;前车加速或驶离,本车自动加速至设定速度。ACC的核心参数是”时距(Time Gap)“——即本车与前车之间以当前速度行驶所需的时间间隔,一般可调范围在1.0秒到2.5秒之间。
LKA/ELK(车道保持辅助 / 紧急车道保持)
LKA(Lane Keeping Assist)通过摄像头识别车道线,当车辆即将压线时自动微调方向,将车拉回车道中心。ELK(Emergency Lane Keeping)是LKA的”保底版本”——当驾驶员疲劳或操作失误导致车辆快速偏离车道时,ELK提供的修正力矩比LKA更强。两者测试时要关注的是弯道场景:弯道曲率越大,车道线曲率识别难度越高,系统边界行为越复杂。
BSD(盲区监测,Blind Spot Detection)
通过侧后方毫米波雷达监测驾驶员视野盲区,当有车辆进入盲区时通过后视镜警示灯提醒驾驶员。BSD是被动提醒,不干预车辆运动。
LCA(并线辅助,Lane Change Assist)
比BSD更为主动。LCA不仅能检测盲区,还能在驾驶员主动打转向灯变道时,通过雷达和摄像头判断目标车道是否安全,必要时可对方向盘施加轻微修正力矩帮助避让。
NOA(领航辅助驾驶,Navigate on Autopilot)
NOA是ACC+LKA+地图定位的深度融合产物。以蔚来NOP、小鹏NGP为代表,NOA在高速场景下可以实现:自动从匝道汇入主路 → 按导航路径行驶 → 自动判断并执行换道 → 自动驶出匝道。NOA的测试复杂度远高于单一功能——它涉及导航路径、动态路径规划、多传感器融合、目标行为预测等多个子系统协同,是当前行业测试难度最高的功能之一。
ADAS测试的核心挑战:传感器在真实物理世界的输入不可预测
传统软件测试的模型是”给定输入,验证输出”——输入是确定的数据,输出是可预期的结果。但ADAS测试完全不同。
ADAS的”输入”是传感器从真实物理世界采集的原始数据:摄像头捕捉的光学图像、雷达反射的回波信号、激光雷达产生的点云。这些数据受光照、天气、遮挡、目标外观等无数因素影响。同一套算法,在晴天的公路上表现完美,可能在雨天夜间遭遇强反光时完全失效。这种输入分布的不可控性,是ADAS测试区别于普通软件测试的根本所在。
因此,ADAS测试工程师不仅要懂软件测试方法,还要懂传感器物理特性、懂交通场景建模、懂功能安全标准(ISO 26262)、懂预期功能安全(SOTIF,ISO 21448)。这正是这个岗位有技术壁垒、也值得深耕的原因。
二
ADAS测试对象拆解:四层架构
ADAS系统不是一个大一统的黑盒,它内部有清晰的分层结构。理解每一层的职责和数据流向,是设计测试用例的前提。下面从底层到顶层逐一拆解。
第一层:传感器层——系统的”五官”
传感器是ADAS感知真实世界的窗口,不同传感器各有擅长,也各有盲区。测试工程师必须理解每种传感器的物理特性,才能设计出有针对性的测试场景。
摄像头(单目/双目,前视+侧视+后视)
摄像头是视觉感知的核心。单目摄像头通过深度学习算法从二维图像中推算目标距离,双目摄像头利用视差原理直接测量深度。摄像头输出目标物类型(车/人/骑行者/交通标志等)、相对距离、相对速度。但摄像头有天然弱点:逆光、光照剧变、目标与背景对比度低、雨雾遮挡时性能急剧下降。
毫米波雷达(前置长距+角雷达短距)
毫米波雷达发射77GHz(或24GHz)电磁波,通过回波时延测量距离,通过多普勒效应测量相对速度。雷达的优势是不受天气影响,测速测距精度高;但它无法识别目标类型——雷达只看到一个”反射点”,不知道这个点是车、人还是广告牌。
超声波雷达(泊车场景)
超声波雷达成本极低,探测距离一般在0.2~5米之间,主要用于泊车辅助系统(APA)和自动泊车(APS)。由于探测范围极短,它在高速场景中毫无用处。
激光雷达(高端车型)
激光雷达发射激光脉冲,构建目标物体的三维点云,测距精度达到厘米级,是目前精度最高的传感器。但成本高、大雨大雪天气性能衰减明显,雨滴和雪花本身也会产生大量噪点。
传感器融合:
单一传感器各有盲区,多传感器融合才能输出稳定感知结果。例如,摄像头在夜间对低对比度目标识别能力差,但毫米波雷达不受光照影响;摄像头能识别目标类型但测距精度有限,双目摄像头可以弥补这一点。融合层负责综合各路传感器的优势,输出一个统一、可靠的环境感知结果。
第二层:感知融合层——把”看到的东西”组织成”可用的信息”
传感器原始数据经过融合算法处理后,输出的是经过清洗、关联和增强的高层感知信息。这一层有两个核心任务:
目标跟踪(Object Tracking)
系统需要对每一帧检测到的目标维持一个稳定的ID。比如前方的车辆从进入视野到离开,ID应该保持不变,而不是在每帧检测中被当作”不同的车”。目标跟踪的连续性直接决定了轨迹预测和决策的质量。测试时要关注目标被遮挡后重新出现时ID是否维持、多个目标同时存在时是否发生ID跳变等边界情况。
轨迹预测(Trajectory Prediction)
基于目标的历史运动轨迹,预测其在接下来2~3秒内的移动路径。这是ACC和NOA换道决策的核心输入——系统需要判断目标车是否会持续并入本车道,而不是刚好在临界点飘过。轨迹预测的测试难点在于:真实交通中人的行为有高度随机性,算法很难穷尽所有行为模式。
融合层输出的核心数据标准化为以下四元组:目标类型 + 相对距离 + 相对速度 + 方位角。这四个数据是后续决策层的直接输入。
第三层:决策规划层——系统的”大脑”
决策规划层是ADAS功能逻辑的核心所在。它基于感知融合层提供的环境信息,决定”车辆应该做什么”。
安全距离模型(TTC = Time To Collision)
TTC是衡量碰撞风险最核心的指标。公式为:TTC = 两车间距 ÷ 相对速度。如果两车间距30米,相对速度20m/s,则TTC = 1.5秒,意味着1.5秒后将发生碰撞。TTC越小,风险越高。
AEB触发决策逻辑
AEB的决策是一个多阶段递进过程:
TTC > 阈值1 → 无动作(安全)
阈值1 > TTC > 阈值2 → FCW报警(提醒驾驶员)
阈值2 > TTC > 阈值3 → 轻柔制动(部分制动力)
TTC < 阈值3 → 全力制动(最大制动力)
各阈值的大小设定和切换时序是AEB测试的重点。阈值设得太大,系统过于敏感,频繁误报会导致驾驶员关闭功能;设得太小,紧急情况下留给系统的反应时间不足。
ACC跟车策略
ACC的核心逻辑是维持”目标距离 = 本车速度 × 时距(Time Gap)”。例如设定时距为1.5秒,当前车速度60km/h(16.7m/s),则本车应保持25米的跟车距离。ACC的测试要关注不同速度下的跟车舒适度——加减速过猛会严重影响用户体验。
第四层:控制执行层——把”决定”变成”动作”
控制执行层是整个系统的”手脚”。它接收决策层的指令,通过车辆底层控制系统实际操控车辆运动。
纵向控制(控制车辆前进/后退/加减速)
纵向控制依赖两个核心部件:ECM(发动机控制模块)控制动力输出,ESP/iBooster控制制动力。当AEB发出全力制动指令时,iBooster在150毫秒内即可建立最大制动压力,比人类驾驶员踩刹车的速度快得多。
横向控制(控制车辆转向)
横向控制通过EPS(电动助力转向系统)实现。决策层发出转向角度请求,EPS驱动电机带动转向机构偏转。当LKA检测到车辆即将偏离车道时,会通过EPS施加一个微小的修正力矩,将车辆轻轻拉回车道中心。
控制执行层通过CAN总线接收上层指令。CANoe等工具正是通过在CAN总线上注入仿真信号,实现对控制执行层的HIL(硬件在环)测试。
图片引自微信公众号,扫码关注阅读原文三
四种测试阶段:选对工具,少走弯路
ADAS测试分为四个典型阶段,从最抽象的算法模型到最真实的实车环境。不同阶段的测试目标、所需工具和工程师能力要求各不相同。选对阶段切入,是高效入门的关键。
MIL:模型在环(Model-in-the-Loop)
MIL是最早期的验证阶段。在这个阶段,算法以数学模型的形式在MATLAB/Simulink中运行,不涉及任何真实硬件。工程师在仿真环境中设计控制逻辑模型,输入虚拟的传感器数据,验证算法行为是否符合预期。
适用场景:算法逻辑的白盒验证,极早期发现设计错误,比如AEB的TTC阈值配置是否合理、ACC的跟车距离模型是否存在震荡风险等。
优点:仿真速度快(秒级运行数小时的驾驶场景),成本极低,可频繁迭代。
缺点:模型是对真实系统的简化,与实际硬件行为存在差距。模型阶段的通过不等于实车阶段的通过。
# MATLAB/Simulink 中的AEB模型伪代码示例
def aeb_control(ego_speed, lead_distance, lead_relative_speed, ttc_thresholds):
ttc = lead_distance / lead_relative_speed if lead_relative_speed > 0 else float('inf')
if ttc > ttc_thresholds['warning']:
return 'NO_ACTION'
elif ttc > ttc_thresholds['partial_brake']:
return 'WARNING'
elif ttc > ttc_thresholds['full_brake']:
return 'PARTIAL_BRAKE'
else:
return 'FULL_BRAKE'
SIL:软件在环(Software-in-the-Loop)
SIL阶段将真实代码(通常为C/C++或AutoSAR架构)运行在PC上的仿真环境中。与MIL的区别在于:代码是实际编译后的生产代码,而不是Simulink模型。SIL可以接入门级别的场景仿真软件(如 Carla、OSCC)来生成虚拟传感器数据,验证代码在完整的软件栈中是否正确运行。
适用场景:代码层面的功能验证,特别是当算法经历了从模型到代码的手动或自动转换(代码生成)后,需要验证转换过程没有引入错误。
优点:测试的是真实代码,置信度比MIL高;不需要ECU硬件,门槛较低。
缺点:PC仿真环境与真实ECU的运行时环境仍有差异,特别是实时性方面。
HIL:硬件在环(Hardware-in-the-Loop)——ADAS测试工程师的主战场
HIL是当前ADAS功能测试中最重要的阶段。在这个层级,真实的ECU(电子控制单元)被接入测试台架,通过CANoe等工具向ECU注入仿真传感器信号。ECU认为这些信号来自真实的摄像头或雷达,实际上它们是由场景仿真软件生成的合成数据。
HIL的核心优势在于:ECU是真实的,传感器输入是仿真的。这意味着ECU的固件、CAN通信协议、底层驱动等所有硬件相关行为都能得到验证,同时测试场景可以在实验室中批量复现,不受天气、场地和时间限制。
HIL台架的典型架构如下:
-
场景仿真软件(IPG CarMaker / PreScan / VTD)生成虚拟交通场景 -
传感器模型将场景数据转换为ECU可识别的信号格式 -
CANoe作为CAN/LIN总线仿真和信号注入的核心工具 -
真实ECU接收信号并运行完整功能逻辑 -
测试管理平台(如TAE/NI TestStand)自动执行测试用例并记录结果
CANoe在HIL中的典型操作包括:配置CAN数据库(.dbc/.arxml)、建立仿真总线网络、发送传感器融合后的目标列表信号、模拟雷达检测结果、记录CAN总线报文并分析时序问题。
对于ADAS测试工程师来说,HIL是性价比最高的入门层级。原因有三:第一,HIL台架的工作环境稳定,不风吹日晒;第二,能接触CANoe等工业级工具,这是行业硬技能;第三,HIL积累的经验可以平滑过渡到实车测试。
实车测试:验证的最后一环
无论HIL仿真多么逼真,最终都必须经过实车验证。国内主要实车测试场地包括:中汽研盐城汽车试验场(拥有国内最齐全的ADAS测试道路)、襄阳达安汽车检测中心,以及各大车企自建测试场。国际方面,Euro NCAP的AEB和LKA测试规程是行业标杆。
实车测试主要做两件事:验证HIL场景在真实条件下的表现一致性,以及探索HIL无法模拟的边界场景。例如雨雾天气对摄像头的真实影响、道路标记线的各种磨损形态、真实行人的不可预测行为——这些只有在实车环境中才能充分验证。
公开道路测试(影子模式)则用于收集真实世界的长尾数据:当系统做出与驾驶员不同的决策时记录下来,用于后续分析和算法改进。
章节小结:初学者从HIL入手
四种测试阶段各有定位,不是非此即彼的关系,而是从抽象到真实、从早期到后期的连续验证链条。初学者建议从HIL入手,既能接触CANoe等工业级工具,又能积累对真实ECU行为的感知,还能为后续切入实车测试打下扎实的基础。MIL适合算法背景的工程师作为逻辑验证起点,SIL适合有一定代码能力的测试工程师向上一层迈进。
图片引自微信公众号,扫码关注阅读原文四
高频ADAS功能测试要点
4.1 AEB(自动紧急制动)
AEB 是 ADAS 中被法规强制搭载的核心安全功能之一。其工作机制通常分为两个阶段:首先由 FCW(Forward Collision Warning)向驾驶员发出声音或视觉预警,若驾驶员未作出反应,系统则介入执行自动制动。两阶段设计的核心逻辑是将人机责任边界明确化——给人类留出决策窗口,同时在人类失效时兜底保护。
理解 AEB 触发的物理本质,绕不开 TTC(Time To Collision)这个概念。TTC = 本车与目标物的距离 ÷ 相对速度,单位为秒。例如两车相距 40 米、相对速度 20 m/s,TTC = 2 秒。TTC 越小,意味着碰撞倒计时越短,系统必须越早介入。高速场景下 TTC 天然更短,制动介入窗口也随之收窄,这对传感器的远距离检测能力和控制算法的响应速度都提出了更高要求。
测试 AEB 需要特别关注以下维度:触发时机上,速度越高 TTC 越短,制动介入越晚,极端高速场景(如 130 km/h)是验证系统边界的必测项;目标物类型直接影响识别距离,Euro NCAP 将测试目标分为乘用车(CCRs)、骑行者(CCRb)、行人(CPNA/CPFAO)三大类,每类目标的检测模型相互独立,不能简单套用同一套触发参数;误触发(AEB 不该刹时刹车)是另一个测试重点,金属桥梁反光、大型广告牌、路边金属栏杆都可能触发感知系统误判,系统需具备过滤非威胁目标的能力。
AEB 的关键可配置参数包括预警时距(通常在 0.7s~1.5s 范围内可调)和最大制动减速度。法规层面,UN R152 对 AEB 的制动性能要求最大减速度不低于 -12 m/s²,且在特定测试场景下必须实现碰撞避免或至少将碰撞时车速降低到规定阈值以下。
4.2 ACC(自适应巡航)
ACC 的核心逻辑是纵向速度控制:前车加速则跟随加速,前车减速则跟随减速,前车驶离本车道后恢复设定速度。这套逻辑看似简单,但在真实道路中面临大量边界场景的考验。
第一个高频挑战是 Cut-in——前方相邻车道车辆突然并入本车道正前方。ACC 系统需要在短时间内完成目标检测(识别新并入车辆)、目标切换(放弃原跟随目标或重新评估优先级)和速度调节(对突然缩短的跟车距离做出反应)。Cut-in 场景的测试难点在于并入角度、速度和时机的多样性。
第二个挑战是 Cut-out——前车突然并出,本车道前方瞬间无车。ACC 需要平滑过渡到对新车道的前车进行跟随,或者在确认无有效目标后恢复设定速度。过渡过程中的加减速曲线是否平滑,直接影响乘坐舒适性。
Stop&Go 功能是 ACC 在拥堵场景下的核心能力。前车完全停止后,本车 ACC 能否自动制动至完全停车,并在前车重新起步后的 3 秒内(部分系统可配置更长时距)自动跟随起步,是衡量 ACC 是否真正”可用”的关键指标。
ACC 的跟车距离通过 Time Gap(时距)参数控制,常见档位为 1.0s / 1.5s / 2.0s。时距越大跟车距离越远,但容易被旁车加塞;时距越小跟车越近,通行效率更高但安全裕度降低。测试时需要覆盖不同 Time Gap 档位下的加减速性能。
特殊场景方面,弯道入口是一个典型挑战:弯道中雷达探测到的前方车辆可能因曲率变化突然”消失”(驶出雷达视场),ACC 能否平稳处理这种目标丢失而不产生急刹,是验证降级逻辑的重点。隧道内场景则因雷达多径反射导致杂波增多,误检测概率上升。
4.3 LKA/ELK(车道保持)
LKA(Lane Keeping Assist)在车道线清晰可辨时持续监测车辆与车道线的相对位置,一旦检测到车辆即将压线(通常以轮胎接触车道线为触发条件),自动施加微小幅度的方向修正(约 0.5°~1° 转向力矩),将车辆重新拉回车道中心区域。这是一种轻柔的辅助手段,驾驶员始终可以轻松接管方向控制。
ELK(Emergency Lane Keeping)是 LKA 的”加强版”,在驾驶员无意识压线或 LKA 已无法有效纠偏时触发,执行更大幅度的转向干预。ELK 更像是一种紧急安全兜底,而非常规的驾驶辅助。
测试 LKA/ELK 时需要重点关注以下场景:车道线缺失(施工导流路段、被积雪或积水遮挡),系统能否安全降级而不产生错误的横向控制;大曲率弯道,当弯道曲率半径过小超出 LKA 设计极限时,系统应提前告警而非强行纠偏;驾驶员行为检测方面,法规强制要求系统能够在驾驶员手离方向盘超过 25 秒时发出警告,这是 MNHD(Mandatory Hands-off Detection)测试的必测项。
4.4 BSD/LCA(盲区监测/并线辅助)
BSD(Blind Spot Detection)通过后角雷达持续监测驾驶员视野盲区内的目标,当检测到有车辆进入盲区时,通过外后视镜指示灯(或配合声音)向驾驶员发出警告。BSD 的触发逻辑存在一个隐性约束:速度低于 10 km/h 时通常不触发预警,因为极低速场景下的近距旁车对驾驶安全的影响可以忽略不计。
LCA(Lane Change Assist)在 BSD 基础上增加了更主动的能力:当驾驶员打开转向灯意图变道时,若检测到盲区内存在目标,系统除了发出警告外,还能在必要时执行微幅方向修正(通常不超过 1°~2°),帮助车辆避开盲区中的危险目标。LCA 更进一步的能力还包括对后方快速接近车辆的预警(LCKA)。
BSD/LCA 测试的核心关注点包括:骑行者检测是难度最高的场景之一,摩托车和自行车轮廓小、反射面积有限、运动轨迹不规则,雷达反射截面积(RCS)远低于乘用车,误报和漏报的概率均显著高于汽车目标;多目标并发场景中,两侧盲区同时有来车时,系统需要合理分配注意力资源,不能同时触发相互冲突的警告。
图片引自微信公众号,扫码关注阅读原文|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.5 NOA(领航辅助驾驶)
NOA(Navigate on Autopilot,领航辅助驾驶)集 ACC 的纵向控制、LKA 的横向控制以及高精地图的路径规划能力于一身,在高精地图覆盖区域实现点到点的自动驾驶辅助。NOA 的标志性能力包括:自主上下匝道(根据导航路线自动驶入/驶出高速公路出入口)和自主换道(根据前方慢速车辆或导航变道指令自动完成车道变换)。
NOA 对测试体系的挑战远超单一功能:首先,高精地图数据与实际路况的一致性是所有决策的基础,地图更新滞后导致的道路信息缺失(如新建成道路、临时施工改道)需要系统具备安全的降级策略;其次,自主换道决策涉及多维度博弈:何时变道(速度窗口、间距窗口)、变道过程中旁车突然加塞如何处理、变道失败(目标车道被占)后如何回退或等待,这些都是测试用例设计的重点和难点;最后,DMS(驾驶员注意力监测)在 NOA 开启期间必须持续工作,系统需要准确判断驾驶员是否在观察道路环境、是否具备随时接管的能力,并在注意力分散时及时发出警告。
NOA 测试通常需要封闭测试场(用于可重复的极端场景验证)和真实道路测试(用于长尾场景和用户体验评估)相结合,配合驾驶模拟器完成大量变道决策场景的仿真验证。
五
AEB用例设计:Euro NCAP实战演示
5.1 为什么ADAS必须用场景驱动测试
传统功能测试以输入空间为设计出发点:等价类划分、边界值分析、组合测试——这套方法论在输入空间可枚举的系统中非常有效。例如测试一个四则运算函数,输入无非是整数/浮点数/零/负数等有限类别,覆盖完这些类别即完成了理论穷举。
ADAS 测试面临的核心困境是:物理世界的输入是连续的、不可预测的,无法穷举。本车的速度、位置、姿态是连续变量;目标物的类型、速度、运动轨迹是连续变量;道路的曲率、坡度、天气、能见度同样是连续变量。这些变量之间相互耦合,形成无限组合。试图用”输入值枚举”的方式覆盖 AEB 的所有工况,在工程上是不可能的。
场景驱动测试(Scenario-based Testing)提供了解决这一困境的思路:用场景(Scenario)替代”输入值”作为测试的基本单元。每个场景是对一次完整交通交互的抽象描述,包含三大要素:道路几何形状(直道/弯道/交叉路口)、交通参与者(类型/数量/运动状态)以及环境条件(光照/天气/能见度)。场景是可枚举的——Euro NCAP 用数百个精心设计的标准场景替代了无限组合,而每个场景又可以通过速度梯度等参数产生多个测试变体。
Euro NCAP 2023 规程对 AEB 的测试体系覆盖了三大类场景:CCRs(前车静止)、CCRm(前车减速/匀速)、CCRs+(前车静止带制动)以及针对弱势道路使用者(VRU)的行人测试和骑行者测试。这套体系已经成为全球 ADAS 性能评估的行业基准。
5.2 AEB CCRs 前车静止场景
CCRs(Car-to-Car Rear stationary)测试场景描述如下:本车以设定速度沿直线行驶,车道前方停放一辆乘用车作为目标物,两车初始距离足以保证本车在正常反应下无法避免碰撞(测试场景有意设计为”正常驾驶必撞”的临界状态)。本车测试速度在 Euro NCAP 规程中通常设定为 20 / 30 / 40 / 50 km/h 四个梯度。
该场景下有三个关键性能指标需要测试记录:FCW 触发时刻(以 TTC 值和本车速度表示,系统过早预警会造成驾驶员疲劳,过晚则失去预警意义);AEB 制动介入时刻(本车速度、TTC 及距离),介入越早减速效果越好;碰撞避免能力——这是最终极的指标,考核在本车初速度和目标类型下,系统能否在碰撞发生前将本车速度降至零,或将碰撞速度降低到足以避免致命伤害的程度。
测试矩阵的设计遵循”速度梯度 × 目标类型 = 场景矩阵“的原则。以 CCRs 为例,目标类型仅”静止乘用车”一种,速度取 4 个梯度,则得到 4 个基础测试用例。若扩展到 CCRm(前车减速)和 VRU(行人/骑行者),矩阵规模迅速扩大。
5.3 AEB CCRm 前车减速场景
CCRm(Car-to-Car Rear moving)测试场景中,前车不再静止,而是以恒定减速度减速。常用的测试减速度梯度为 -2 / -4 / -6 m/s²。本车以设定的跟车速度接近前车后,前车开始匀减速。CCRm 考核的是 ACC/AEB 系统对前车减速状态的感知与反应能力。
此外还有一个关联场景值得关注:CCF(Car-to-Car Front,前车切出后前车减速)。前车(车A)先执行 Cut-out 动作驶离本车道,随后更前方的车辆(车B)开始减速。本车的感知系统需要经历”目标切换”的考验——从跟随车A切换到跟随车B,同时车B已开始减速,留给本车的反应窗口更短。
5.4 行人场景(AEB VRU)
VRU(Vulnerable Road Users,弱势道路使用者)测试是 AEB 测试中感知挑战最大的部分。Euro NCAP 定义了多种行人测试场景:
- CPNA
(Child Pedestrian Not Visible at First):成年行人从车辆前方横穿道路,初始时处于本车视野盲区(如停靠车辆后方)。 - CPDAO
(Car-to-Pedestrian Diagonal Approach):行人从斜对角方向沿对角线穿越道路,模拟真实道路上常见的行人过街行为。 - CCOA
(Cyclist Approaching from Behind/Oblique):骑行者横穿本车行驶路径,骑行者的运动轨迹和轮廓特征与行人有显著差异。
行人/骑行者测试的核心挑战在于感知。与汽车目标相比,行人的反射截面积小、姿态变化多、遮挡频繁,导致感知系统的检测距离明显缩短,误检率也更高。这直接压缩了 AEB 的反应窗口,使行人场景的碰撞避免难度远高于车辆场景。
5.5 误触发测试(Near-Miss Scenarios)
误触发(False Positive)测试的目的不是验证 AEB”能做什么”,而是验证它”不会做什么”。AEB 在不该制动时突然制动(False Positive)会造成两种危害:给乘客带来不舒适的急刹体验,严重时还会导致后车追尾。从安全角度而言,误触发的危害有时不亚于漏触发。
典型的误触发场景包括:道路上方金属天桥(雷达信号在金属结构和地面之间产生多径反射,形成虚假目标)、大型广告牌或交通标志(毫米波雷达对金属平面产生强反射,被误判为近处静止车辆)、对向车道来车(纵向传感器将对面行驶的车辆误判为同向慢速前车)以及弯道出口突然出现的静止车辆(弯道中雷达无法预判弯道出口处的目标物,驶出弯道后突然检测到的静止车辆可能触发紧急制动)。
误触发测试集的设计目标是穷举可能导致 False Positive 的”干扰源”场景,并通过参数化调节(如干扰目标的速度、距离、角度)确定系统在何种边界条件下会触发误制动,从而为感知算法的过滤逻辑提供明确的测试验证边界。
|
|
|
|
|
|---|---|---|---|
| CCRs 乘用车静止 |
|
|
|
| CCRm 前车匀速减速(-4m/s²) |
|
|
|
| VRU 行人横穿(CPNA) |
|
|
|
六
CANoe在ADAS测试中的角色:完整CAPL脚本演示
6.1 CANoe是什么?为什么ADAS测试离不开它
CANoe(CAN open Environment)是德国Vector公司出品的总线开发与测试软件,在汽车行业有着超过20年的应用历史,堪称总线领域的”工业标准”。如果你在汽车行业做电子电器(EE)相关工作,大概率绕不开它——OEM和Tier1的ECU开发团队几乎人手一套。
ADAS测试为什么离不开CANoe?这要从整车电子电气架构说起。现代汽车有数十个ECU通过CAN、LIN、FlexRay等总线互联,ADAS系统(尤其是L1~L2级别的辅助驾驶)并不是一个”全能大脑”,而是一个感知-决策-执行的三级链路:毫米波雷达和摄像头负责”感知”,把前方目标的位置、速度、距离等信息通过CAN总线发送给ADAS ECU;ADAS ECU负责”决策”(是否要刹车、报警);最后将制动指令通过CAN发给ESP(车身稳定系统)。
在这个链路中,CANoe承担了三个核心角色,用通俗的话来说:
- 总线监控(Bus Monitoring)
实时捕获并显示CAN总线上跑的所有报文,就像汽车网络里的”抓包工具”。工程师用它可以一眼看清当前总线上有哪些信号在交互。 - 信号仿真(Signal Simulation)
不只是被动监听,CANoe可以主动发送CAN报文,模拟传感器、BCM、VCU等真实ECU发来的信号。在HIL台架中,这是非常关键的能力——真实传感器成本高、操作不便,用CANoe仿真信号既便宜又可重复。 - 自动化测试(Automated Testing)
配合CAPL脚本语言,CANoe可以编写自动化测试用例、定时注入故障信号、自动判定Pass/Fail并生成测试报告。这是CANoe区别于普通CAN工具的核心能力。
图片引自微信公众号,扫码关注阅读原文一张典型的ADAS HIL台架拓扑,其中CANoe扮演”总线枢纽”的角色
6.2 理解CAPL:CANoe的测试脚本语言
CAPL(CAN Access Programming Language)是Vector为CANoe专门设计的脚本语言,语法风格接近C语言,但更轻量、更贴近测试场景。CAPL程序不是”从main函数顺序执行”的传统程序,而是基于事件驱动的——你为程序注册各种”事件处理器”,当对应事件发生时,处理器里的代码才会执行。这种模式非常适合总线测试,因为总线上随时可能有报文到达、可能有错误发生,程序需要随时响应。
CAPL中三个最核心的概念:
DBC文件(Database CAN):
DBC文件本质上是CAN总线的”通信协议说明书”,描述了总线上每个报文的结构。以一个雷达目标报文为例,DBC会写明:报文ID是0x300(十六进制),数据长度8字节,Byte0是目标ID,Byte1-2是目标距离(单位米,Factor=0.01,Offset=0),Byte3-4是相对速度(单位m/s,Factor=0.01,Offset=-327.68)……没有DBC,CANoe只能看到一串十六进制数,无法把它们解析成有物理意义的信号。ADAS测试的第一步永远是”加载正确的DBC文件”。
报文(Message)和信号(Signal):
CAN总线传输的是”报文”,每条报文有一个ID和一个数据载荷(Data Field,1~8字节)。一条报文里通常包含多个”信号”——比如0x300报文里就包含了距离信号、相对速度信号、目标角度信号等。DBC文件定义了信号在报文中的起止位、长度、数据类型、放大因子(Factor)和偏移量(Offset)。
事件机制:
CAPL程序的核心是事件处理器。常见事件包括:on preStart(仿真启动时执行一次,用于初始化)、on timer(定时器触发,用于周期执行逻辑)、on message 0x300(当收到ID为0x300的CAN报文时触发)。理解这个事件机制是CAPL的入门钥匙。
新手最常被卡住的地方是信号的原始值与物理值转换。CAN总线传输的是整型原始值(Hex/Int),但工程师关心的是物理量(米、km/h)。
DBC文件中的Factor(放大因子)和Offset(偏移量)决定了转换公式:
物理值 = 原始值 × Factor + Offset
原始值 = 物理值 / Factor − Offset/Factor
举例:
Byte1-2存的是距离原始值,Factor=0.01,Offset=0,那么原始值=4000表示距离=4000×0.01=40米。这个换算在脚本里是手动做的(下一节会详细演示),但有了DBC文件后,CANoe的报文监控窗口会自动做转换,工程师只需看物理值即可。
6.3 完整CAPL脚本演示:模拟前车急刹触发AEB
以下脚本是本文最核心的代码示例,完整可运行(在CANoe 14.0及以上版本测试通过)。脚本实现了最典型的AEB测试场景——前车急刹,这也是Euro NCAP和C-NCAP中AEB CCR(Car-to-Car Rear)测试的核心场景。
场景描述:本车(Ego Vehicle)以72km/h行驶,前方同车道有一辆以36km/h行驶的前车(Target Vehicle),初始车距40米。前车在第3秒时突然急刹(减速度8m/s²,约0.82g),本车维持匀速行驶。系统需在TTC<2.4s时发出FCW碰撞预警,在TTC<1.5s时激活AEB全力制动。
/*!
* FileName: AEB_Scenario_Simulation.can
* Description: 模拟前车急刹场景,触发AEB报警与制动
* 用于CANoe HIL台架测试,ADAS ECU(被测件)
* 接收本脚本注入的雷达目标数据,判定TTC并触发AEB
*
* 测试场景描述:
* 本车(Ego):以72km/h行驶
* 前车(Target):以36km/h行驶(同车道),突然急刹至0km/h
* 初始车距:40米
* 预期结果:TTC<2.4s时FCW报警,TTC<1.5s时AEB制动
*
* 适配DBC:ADAS_Radar.dbc(Message: RadarTarget_0x300,
* Signal: Distance, RelativeSpeed, TargetID)
*/
includes
{
// 引入DBC文件描述(实际使用时替换为真实DBC路径)
#include "ADAS_Radar.dbc"
}
// =========================================================================
// 全局变量声明
// =========================================================================
variables
{
// --- 时间控制 ---
msTimer CycleTimer; // 主循环定时器,100ms周期(每0.1秒执行一次)
float gSimulationTime; // 仿真已运行时间(秒)
// --- 本车状态 ---
float gEgoSpeed; // 本车速度,单位:km/h
float gEgoSpeed_ms; // 本车速度,单位:m/s(用于物理计算)
float gEgoDeceleration; // 本车减速度,单位:m/s²(本例中暂不使用)
// --- 前车状态 ---
float gTargetSpeed; // 前车速度,单位:km/h
float gTargetSpeed_ms; // 前车速度,单位:m/s
float gTargetDeceleration; // 前车减速度,单位:m/s²
// --- 相对运动参数 ---
float gDistance; // 两车间距,单位:米
float gRelativeSpeed; // 相对速度,单位:m/s(正值=本车更快,距离缩短)
float gTTC; // Time To Collision,单位:秒
// --- 测试控制 ---
byte gPhase; // 状态机:0=匀速跟车, 1=前车急刹, 2=仿真结束
float gBrakeStartTime; // 前车开始刹车的时间点(秒)
// --- CAN报文 ---
// message 0x300 对应DBC中的 RadarTarget_0x300 报文
message 0x300 gRadarMsg;
}
// =========================================================================
// 【事件1】on preStart:仿真启动时执行一次(相当于初始化函数)
// =========================================================================
on preStart
{
// ★ 初始化本车状态:本车72km/h匀速行驶
gEgoSpeed = 72.0; // km/h
gEgoSpeed_ms = gEgoSpeed / 3.6; // 转换系数:1m/s = 3.6km/h
gEgoDeceleration = 0.0; // 本车暂不制动(匀速)
// ★ 初始化前车状态:前车36km/h匀速行驶(同车道)
gTargetSpeed = 36.0;
gTargetSpeed_ms = gTargetSpeed / 3.6;
gTargetDeceleration = 0.0; // 初始为0,前车先匀速行驶
// ★ 初始车间距:40米
gDistance = 40.0;
// ★ 测试阶段初始化:匀速跟车
gPhase = 0;
gBrakeStartTime = -1.0; // -1.0表示"未设置"
// ★ 初始化CAN报文
// CAN报文最大8字节(标准CAN),扩展后DBC可能定义16字节(CAN FD)
gRadarMsg.dlc = 16; // Data Length Code = 16字节
gRadarMsg.byte(0) = 1; // TargetID = 1(本车道前方车辆)
// ★ 设置定时器:100ms后触发第一次CycleTimer事件
setTimer(CycleTimer, 0.1);
// ★ 输出初始化信息到CANoe的Write窗口(相当于日志输出)
write("========================================");
write("AEB场景仿真开始");
write("本车速度: %.1f km/h", gEgoSpeed);
write("前车速度: %.1f km/h", gTargetSpeed);
write("初始车间距: %.1f m", gDistance);
write("========================================");
}
// =========================================================================
// 【事件2】on timer CycleTimer:主循环,每100ms执行一次
// 这是CAPL测试脚本的核心,所有仿真逻辑都在这里
// =========================================================================
on timer CycleTimer
{
float dt; // 时间步长(秒),每次=0.1s
// --- 推进仿真时间 ---
gSimulationTime += 0.1;
dt = 0.1;
// ================================================================
// 【状态0】匀速跟车阶段(0~3秒)
// 两车各以36/72km/h匀速行驶,车间距缓慢缩小
// ================================================================
if (gPhase == 0)
{
if (gSimulationTime >= 3.0)
{
// ★ 进入状态1:前车开始急刹!
// 这是测试的关键触发点——场景从此处进入危险工况
gPhase = 1;
gBrakeStartTime = gSimulationTime;
gTargetDeceleration = 8.0; // 减速度8m/s² ≈ 0.82g(非常急促的刹车)
write(">>> [%5.1fs] 前车开始急刹!减速度 %.1f m/s²",
gSimulationTime, -gTargetDeceleration);
}
}
// ================================================================
// 【状态1】前车急刹阶段(3秒后 ~ 仿真结束)
// 此时前车迅速减速,TTC急剧下降,AEB系统开始响应
// ================================================================
else if (gPhase == 1)
{
// ★ TTC(Time To Collision)计算
// TTC = 车间距 / 相对接近速度(仅当相对速度为负,即两车距离在缩短时才有效)
if (gRelativeSpeed < -0.1) // 相对速度<-0.1m/s,认定距离在缩短
{
gTTC = gDistance / (-gRelativeSpeed);
}
else
{
gTTC = 99.9; // 相对速度≥0时,距离不缩短,TTC设为极大值
}
// ★ 打印实时监控数据(每100ms一行,等效于10Hz刷新率)
write("[%5.1fs] 车间距: %6.2fm | TTC: %5.2fs | 本车: %6.1fkm/h | 前车: %6.1fkm/h",
gSimulationTime, gDistance, gTTC,
gEgoSpeed, gTargetSpeed);
// ★ AEB/FCW触发逻辑(模拟ADAS ECU内部判定阈值)
// 此处仅为仿真演示;真实ECU的阈值判定逻辑由供应商黑盒实现
if (gTTC < 2.4 && gTTC > 0)
{
write(">>> [FCW] 碰撞预警触发!建议驾驶员制动!");
}
if (gTTC < 1.5 && gTTC > 0)
{
write(">>> [AEB] 自动紧急制动激活!");
}
// ★ 仿真终止条件:两车相撞(车间距≤0)或两车都停止
if (gDistance <= 0.0)
{
gPhase = 2;
write(">>> [%5.1fs] 车间距≤0,碰撞或本车停止。仿真结束。", gSimulationTime);
}
}
// ================================================================
// 【运动学更新】每步更新前车速度和车间距
// 高中物理公式:v_new = v_old + a * dt
// s_new = s_old + v * dt + 0.5 * a * dt²
// 为简化,本脚本对车间距用一阶近似:s = s + Δv * dt
// ================================================================
// --- 更新前车速度(单位:m/s)---
// clamp()确保速度不低于0(前车不会倒车)
if (gTargetSpeed_ms > 0 || gTargetDeceleration < 0)
{
gTargetSpeed_ms = clamp(
gTargetSpeed_ms + gTargetDeceleration * dt,
0.0, // 最小值:0 m/s(停车)
200.0 // 最大值:200 m/s
);
gTargetSpeed = gTargetSpeed_ms * 3.6; // 转回km/h
}
// --- 更新车间距 ---
// 相对速度 = 本车速度 - 前车速度(单位:m/s)
// 正值 = 本车更快,距离缩短;负值 = 前车更快,距离拉大
gRelativeSpeed = gEgoSpeed_ms - gTargetSpeed_ms;
gDistance = gDistance + gRelativeSpeed * dt; // 距离变化量 = 相对速度 × 时间
// ================================================================
// 【报文构造】组装雷达目标报文,注入CAN总线
// 报文ID = 0x300,长度16字节,模拟雷达目标模拟器的输出
// ================================================================
// Signal: Distance(目标距离)
// DBC定义:Factor=0.01, Offset=0
// 原始值 = 物理值 / Factor = gDistance / 0.01 = gDistance * 100
// 存储:小端序(Byte1=低字节,Byte2=高字节)
gRadarMsg.byte(1) = (gDistance * 100) & 0xFF;
gRadarMsg.byte(2) = ((gDistance * 100) >> 8) & 0xFF;
// Signal: RelativeSpeed(相对速度)
// DBC定义:Factor=0.01, Offset=-327.68
// 原始值 = (物理值 + 327.68) / 0.01
// 加偏移量是为了支持负速度(两车相向行驶时)
gRadarMsg.byte(3) = ((gRelativeSpeed + 327.68) / 0.01) & 0xFF;
gRadarMsg.byte(4) = (((gRelativeSpeed + 327.68) / 0.01) >> 8) & 0xFF;
// ★ 发送报文到CAN总线(通道1 = 高速CAN)
// 这一行是脚本最关键的动作:output()将构造好的报文送到真实CAN总线
output(gRadarMsg);
// ================================================================
// 【仿真结束处理】
// ================================================================
if (gPhase == 2)
{
write("========================================");
write("AEB场景仿真结束");
write("最终车间距: %.2fm(本车%.1fkm/h,前车%.1fkm/h)",
gDistance, gEgoSpeed, gTargetSpeed);
write("========================================");
cancelTimer(CycleTimer); // 停止定时器,仿真结束
return;
}
// ★ 重设定时器:维持100ms的固定周期(等效于10Hz采样率)
setTimer(CycleTimer, 0.1);
}
// =========================================================================
// 【辅助函数】clamp:限幅函数(CAPL没有内置,需自行实现)
// =========================================================================
float clamp(float value, float minVal, float maxVal)
{
if (value < minVal) return minVal;
if (value > maxVal) return maxVal;
return value;
}
图片引自微信公众号,扫码关注阅读原文脚本逐行讲解:
整个脚本分四大块:
第一块——变量声明(variables段):
声明了本车/前车的速度、加速度、车间距、相对速度、TTC等所有仿真所需的状态变量。特别注意gPhase这个状态机变量,它控制着仿真的三个阶段:0=匀速跟车(等待前车刹车时机)、1=前车急刹(TTC持续下降,AEB可能触发)、2=仿真结束。gRadarMsg是一个ID为0x300的CAN报文对象,后续通过直接操作byte()来填充报文数据。
第二块——on preStart事件(初始化):
仿真启动时执行一次,初始化所有状态变量,设置第一个定时器(100ms后触发CycleTimer)。write()函数输出到CANoe的Write窗口,这是HIL台架中工程师实时监控仿真的主要手段。注意setTimer(CycleTimer, 0.1)设置了100ms的定时周期,这决定了仿真的采样率——10Hz对于AEB测试场景是足够的。
第三块——on timer CycleTimer事件(主循环,每100ms执行一次):
这是脚本的主体。流程是:推进时间→检查阶段切换→计算TTC→打印日志→更新运动学状态→构造并发送雷达报文→判断是否结束。每一步的逻辑:
-
gPhase==0时两车匀速行驶,第3秒自动切换到gPhase==1(触发前车急刹); -
gPhase==1时每100ms计算一次TTC,当TTC<2.4s时输出FCW预警,TTC<1.5s时输出AEB激活提示(这是脚本模拟ECU行为,实际ECU的触发判断由供应商固件完成,HIL台架通过报文注入和总线监控来验证); -
运动学采用简单的线性模型:Δv = a×dt,Δs = v×dt。在100ms步长下精度足够。
第四块——报文构造(核心输出):
脚本通过直接操作byte(1)~byte(4)来手动组装雷达报文。虽然CANoe加载DBC后可以更优雅地使用”gRadarMsg.Distance = gDistance”这样的符号化写法,但手动操作byte()展示了底层原始值的填充逻辑——这正是DBC中Factor/Offset发挥作用的地方。Byte1-2存储距离原始值(gDistance×100),Byte3-4存储相对速度原始值(加327.68偏移后除以0.01),最后通过output(gRadarMsg)发送到CAN总线。ADAS ECU的雷达处理芯片会接收这条报文,并驱动后续的AEB判定逻辑。
6.4 运行与验证
将脚本保存为.can文件后,在CANoe中加载步骤如下:
|
CANoe主界面 → Simulation Setup → 右键”Simulation”节点 → Add CAPL Node → 加载.can文件。加载DBC文件:Configuration → Database → Add → 选择ADAS_Radar.dbc。 |
- Write窗口
实时显示脚本中write()输出的日志,每100ms一行,包含时间戳、车间距、TTC、本车/前车速度。当TTC触及阈值时,脚本会自动高亮打印对应的[AEB/FCW]提示行。 - Trace窗口(报文追踪)
:实时显示CAN总线上的所有报文,包含ID、时间戳、DLC和Data字段。加载DBC后,Trace窗口会显示解析后的物理值(如Distance=40.00m,RelSpeed=10.00m/s),工程师可以直观看到雷达目标数据随时间变化的趋势。 - Statistics窗口
:CANoe内置的统计分析工具,可将Trace数据导出为CSV格式,用于后续用Python/MATLAB做后处理,绘制TTC曲线、制动时刻曲线等。
验证AEB触发逻辑是否符合预期:打开Trace窗口的”报文分析”功能,筛选ID=0x300报文,观察Distance信号随时间的变化曲线。在CANoe的Graphics窗口中绘制Distance和RelSpeed的时间序列图,应能看到:在t=3s时Distance开始快速下降,TTC曲线在t=4.5s附近触及1.5s阈值。如果实际触发时机与预期不符,需要调整DBC中的Factor/Offset,或者在脚本中加入误差补偿逻辑。
仿真结束后,CANoe支持一键生成测试报告(Test Report),包含仿真时长、发送报文数量、触发的事件列表、Pass/Fail判定结果,可直接作为HIL测试记录存档提交给功能安全团队。
七
完整AEB测试用例:从需求到报告
7.1 测试需求回顾
在动手设计测试用例之前,必须先明确被测系统的需求边界。测试工程师手中最重要的文档是”系统需求规范(System Requirements Specification,SRS)”——这份文档通常由OEM或系统集成商提供,规定了AEB系统的触发条件、性能指标和限制条件。以下是本章使用的参考需求:
【AEB系统需求(节选)】
AEB系统需在本车速度≥30km/h时检测前方车辆目标。当TTC(Time To Collision)<2.4s时,系统发出FCW(Forward Collision Warning)碰撞预警声光提示;当TTC<1.5s时,系统激活AEB(Automatic Emergency Braking)全力制动,制动减速度≥-8m/s²,制动目标是将本车速度降至0或使两车相对速度<5km/h。上述功能在晴好天气(能见度>300m)下昼间工况应100%达成。
这条需求里有几个关键数字值得标注:30km/h(最低激活速度)、2.4s(FCW阈值)、1.5s(AEB阈值)、-8m/s²(制动减速度下限)。测试用例设计的核心任务,就是用有限的测试场景去覆盖这些数字边界。
7.2 测试用例矩阵设计
测试用例矩阵(Test Case Matrix)是HIL测试的核心交付物。一个好的矩阵应该做到两个平衡:覆盖度(关键参数边界都有覆盖)和效率(避免冗余用例)。下表采用了”速度梯度×目标类型×环境条件”三维度矩阵设计:
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
用例设计逻辑说明:
- AEB-001~003(速度梯度)
覆盖30/50/80km/h三个典型速度点,覆盖法规要求的最低速度和实际高速公路巡航速度。 - AEB-004~005(目标类型)
Euro NCAP和C-NCAP要求AEB系统不仅检测车辆,还要检测行人和骑行者,这两条覆盖了弱势道路使用者(VRU)场景。 - AEB-006~007(天气/光照)
感知传感器的性能受环境影响显著,恶劣天气和夜间是AEB系统的高失效率场景,必须覆盖。 - AEB-008(负向测试)
本车速度<30km/h时AEB不应激活,这是需求规定的系统边界,负向用例必须设计。 - AEB-009~010(目标动态)
静止只是最简单的场景,实际道路上”前车突然减速”比”前车静止”更常见。
7.3 HIL台架执行步骤
有了测试矩阵,接下来就是如何在HIL台架上把每个用例跑起来。以AEB-001为例(30km/h,前车静止),标准执行流程如下:
第一步:环境准备:
打开CANoe工程文件,在Simulation Setup中加载第六章的AEB_Scenario_Simulation.can脚本。加载配套的ADAS_Radar.dbc。检查CAN通道连接:CANoe的通道1(高速CAN)连接ADAS ECU的CAN接口,确保Link板卡指示灯为绿色(CAN总线正常)。雷达目标模拟器通过以太网或CAN FD与CANoe同步时钟,确保信号注入延迟<10ms。
第二步:参数配置:
在CAPL脚本中修改初始条件:gEgoSpeed=30(而非默认的72),gTargetSpeed=0(前车静止),gDistance根据测试要求设置(通常取40m~80m,覆盖Euro NCAP规定的前车静止场景)。编译脚本(Ctrl+B),确保无编译错误。
第三步:预检查:
在CANoe的Trace窗口确认总线正常通信(能看到ECU周期性发送的心跳报文)。打开Statistics窗口,新建一个信号记录任务,记录ID=0x300的Distance、RelSpeed、TTC信号。Write窗口清空,准备接收日志。
第四步:执行仿真:
点击CANoe工具栏的”Start”按钮(闪电图标),仿真开始。观察Write窗口:前3秒两车匀速,第3秒前车保持静止(gTargetSpeed=0无需触发急刹逻辑),从第3秒开始车间距持续缩短,TTC逐步下降。当TTC触及2.4s时,Write窗口应出现”[FCW] 碰撞预警触发”字样;当TTC触及1.5s时,应出现”[AEB] 自动紧急制动激活”字样。
第五步:数据采集与判定:
仿真结束后,导出Statistics数据为CSV。在CSV中定位”车间距首次降至0或两车相对速度<5km/h”的时间点,记录对应的TTC实际值和制动时刻。判定规则:AEB-001的Pass条件为”FCW触发时刻TTC在2.2s~2.6s之间(容差±0.2s),AEB触发时刻TTC在1.3s~1.7s之间(容差±0.2s)”。若超出容差,记为Fail,填写不合格项描述。
第六步:生成报告:
将Trace窗口截图保存(包含报文时间戳和信号解析值),将Statistics数据打包,与测试用例判定结果一起填入测试报告模板,经测试负责人签字后归档。
7.4 测试报告输出规范
每条用例完成后,测试报告应包含以下五个章节:
测试环境记录:
记录台架配置(ECU型号、软件版本、CANoe版本、DBC版本、雷达模拟器型号),确保测试可复现。这是功能安全认证(ISO 26262)审核时的必查项。
测试数据记录:
包含TTC原始值序列、FCW触发时刻、AEB激活时刻、碰撞判断时刻。这些数据应来自CANoe Statistics导出的CSV,保留原始时间戳。
判定结果:
Pass/Fail二级判定。不合格项(Fail)需填写详细描述,格式为:[用例ID] 不合格项描述 | 实测值 | 期望值 | 偏差原因分析。
CAN总线原始数据:
保存Trace窗口截图,截图需包含时间戳列、ID列和Data列(Hex格式)。在截图上手动标注关键事件点(FCW触发、AEB激活)。
复现与修复记录:
若用例Fail,需记录ECU固件修改版本号、重新测试的日期和结果,形成完整的验证闭环。
图片引自微信公众号,扫码关注阅读原文八
ADAS测试工程师入行路径
8.1 技能路线图:从入门到独立承担项目
ADAS测试工程师是一个横跨汽车底层(总线、ECU)与上层(感知算法、功能逻辑)的复合型岗位。入行路径没有标准答案,但有一个被业界验证有效的四步进阶模型,适合绝大多数从零起步的学习者:
|
第一步:CAN总线基础(预计投入:2~4周) 这是汽车电子的”通用语”,不理解CAN,你甚至无法和ECU”对话”。本步需要掌握:CAN标准帧(11-bit ID)和扩展帧(29-bit ID)的结构、Motorola和Intel两种字节序的区别、CAN报文的DBC文件解读(理解信号名称、起始位、长度、Factor/Offset)。学习方法:找一块便宜的USB-CAN工具(如KVASER或周立功),接上电脑,用免费软件(PCAN-View或CANTest)实际抓几条CAN报文,配合一份真实的DBC文件自己解析一遍。这个过程解决了”CANoe是什么”的认知问题。 |
|
第二步:CANoe入门(预计投入:4~8周) 在第一步基础上,学会用CANoe做总线监控和信号仿真。核心技能:加载DBC并解读报文监控窗口;写简单的CAPL脚本(能响应CAN报文、能通过定时器发送报文);用CANoe的Test Module功能设计自动化测试序列。本步的标志性成果:能独立运行第六章的CAPL脚本,并修改其中的速度参数跑一个自己的测试场景。 |
|
第三步:ADAS HIL测试实战(预计投入:8~16周) 这是从”会用工具”到”会做测试”的关键跨越。本步需要深入理解:毫米波雷达的工作原理( FMCW调制、目标检测、杂波过滤)、摄像头目标检测的输出格式(典型为CAN消息或以太网UDP)、雷达目标模拟器(ARS/Radar Simulator)的使用(目标注入、轨迹编辑、误报率控制)、AEB/FCW/LKA/ACC等功能的测试逻辑和评判标准。本步的标志性成果:独立完成一个完整的AEB测试矩阵(如第七章所示),输出合格的测试报告。 |
|
第四步:场景仿真与自动化(预计投入:16周以上) 走到这一步,测试工程师开始从”执行者”升级为”设计者”。需要掌握的工具链:Prescan或VTD(场景仿真平台,构建虚拟测试场景,不依赖实体HIL台架)、OpenSCENARIO(国际标准场景描述格式,基于XML,用于在仿真平台间迁移测试场景)、Python数据后处理(处理CAN总线采集的原始数据,绘制TTC曲线,批量生成测试报告)。本步的标志性成果:能在Prescan中搭建一个包含雨天路面摩擦系数变化的AEB测试场景,自动运行100次仿真,输出Pass率统计报告。 |
图片引自微信公众号,扫码关注阅读原文8.2 必备知识点清单
以下知识点是ADAS测试岗位面试和实际工作的高频考点:
- CAN总线协议
标准帧/扩展帧、11-bit/29-bit ID、波特率(高速CAN 500kbps)、终端电阻(120Ω)、错误帧机制。理解CAN总线的优先级仲裁机制——ID越小优先级越高,这在多ECU同时发送报文的场景中非常重要。 - 坐标系
ADAS系统同时使用两种坐标系。笛卡尔坐标系(X/Y,单位:米)用于描述车辆的绝对位置和相对关系;极坐标系(距离r + 角度θ)用于雷达传感器的原始输出。理解两者之间的转换公式是配置雷达模拟器和解读DBC信号的基础。 - TTC算法
Time To Collision的经典计算公式为TTC = d / (-Δv),其中d为车间距,Δv为相对速度(取正值表示接近)。当两车相对速度为零或为负(距离不缩短)时,TTC趋于无穷大,此时AEB系统不会触发。需要特别注意的是,实际AEB系统的TTC计算比这个公式复杂得多,会结合目标轨迹预测、道路曲率、驾驶员注意力状态等因素做加权修正。 - ISO 26262功能安全
这是汽车电子的”安全法典”。理解概念链条:HARA(危害分析与风险评估)→ 安全目标(Safety Goal)→ FSR(功能安全要求)/TSR(技术安全要求)→ 安全机制(Safety Mechanism)。对于测试工程师来说,至少要理解:ECU的ASIL等级决定了测试覆盖率要求(ASIL B要求至少达到MCDC覆盖度),以及测试失败时的安全响应(如故障降级策略)。 - Euro NCAP与C-NCAP规程
这两套碰撞评测体系直接定义了”测什么”和”测到什么程度”。Euro NCAP将AEB分为CCR(车对车)和VRU(弱势道路使用者)两大类,每类下又细分子场景。测试工程师了解评分体系,才能理解”为什么AEB-003要跑到80km/h”这类问题背后的法规驱动力。
8.3 加分项:拉开差距的技能组合
以下技能不在入行门槛里,但掌握它们能让你在团队中快速建立不可替代性:
Prescan或VTD场景仿真:
这两款软件是汽车行业最主流的虚拟仿真平台。Prescan基于物理光学建模,擅长传感器仿真(摄像头图像合成、雷达回波仿真);VTD基于游戏引擎,擅长场景编辑和HMI可视化。在自动驾驶算法快速迭代的背景下,能在仿真平台中搭建测试场景的工程师,比只能在台架上跑现成场景的工程师价值高出30%~50%。
OpenSCENARIO标准:
这是ASAM(自动化及测量系统标准协会)推出的场景描述国际标准(基于XML),用于在不同仿真工具之间交换测试场景。掌握OpenSCENARIO意味着你可以在Prescan中设计场景,然后无缝迁移到VTD或Lgsvl Simulator中运行,是场景复用和行业协作的关键能力。
Python数据后处理:
CANoe导出的原始CSV数据通常需要清洗和可视化。掌握Python的pandas(数据处理)+ matplotlib/plotly(绘图)+ numpy(数值计算)三件套,可以将批量测试数据一键生成标准化的测试报告,大幅提升测试效率。进阶方向是学习用Python调用Vector的vTESTstudio API,实现测试用例的自动化生成和批量执行。
功能安全认证流程:
如果你有志于向功能安全工程师或测试主管方向发展,理解ISO 26262的认证全流程(从HARA到硬件集成测试报告)是必要的进阶路径。认证机构(TÜV、SGS、BV)审核的是流程完整性和证据链质量,而非仅仅测试结果的Pass/Fail。
最后说一句题外话:ADAS测试不是一个”吃青春饭“的岗位——它吃的是经验。随着汽车智能化渗透率提升,能独立设计测试矩阵、理解功能安全逻辑、有仿真平台实操经验的测试工程师,在未来5年内的人才缺口会持续扩大。把基础打扎实,把每一条Fail用例的根因分析写清楚,你积累的就不只是技能,还有真正值钱的行业经验。
