ARTICLE DETAIL

资讯详情

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

基于MWORKS的虚拟驾驶舱:ADAS测试仿真建模与工程实践

基于MWORKS的虚拟驾驶舱:ADAS测试仿真建模与工程实践 1. 虚拟驾驶舱到底在解决什么问题1.1 从真车测试跑断腿到模型里先跑一万遍做ADAS高级驾驶辅助系统测试的人都有一个共同体会真车路测的成本高得离谱。一台测试车、一个驾驶员、一套传感器套件再加上场地费和人工一天下来少说几千块而且很多极端场景——比如前车突然急刹、行人鬼探头、暴雨天车道线模糊——根本没法反复复现。你不可能让真人去冒这个险也不可能每次都等到天时地利才测一次。虚拟驾驶舱的核心价值就在这儿把驾驶员、车辆、传感器、道路环境全部搬进仿真环境里用软件的方式复现这些场景想跑多少遍跑多少遍想改哪个参数改哪个参数。MWORKS这套工具链做虚拟驾驶舱本质上就是利用MWORKS.Sysplorer的物理建模能力加上ADAS传感器模型和车辆动力学模型搭出一个可以开的虚拟座舱。我最初接触这个方向的时候以为就是拿Simulink搭个车辆模型跑跑看。实际做下来才发现虚拟驾驶舱和普通的车辆仿真完全不是一回事。普通仿真你只关心车怎么动虚拟驾驶舱你得关心驾驶员看到了什么传感器感知到了什么系统决策对不对——这是一个闭环人、车、环境三者缺一不可。1.2 为什么选MWORKS而不是别的工具链市面上做车辆仿真和ADAS测试的工具不少CarSim、PreScan、CarMaker各有各的强项。但MWORKS的优势在于它是基于Modelica语言的多领域统一建模平台Sysplorer里可以同时搞定机械、电气、控制、热管理这些不同物理域的模型不用在多个软件之间来回导数据。举个例子你要做一个AEB自动紧急制动的虚拟测试车辆动力学用多体动力学建模制动系统用液压模型控制器用状态机传感器用雷达模型——这些在MWORKS里可以在同一个环境里搭出来通过标准接口互联。换成别的工具链你可能得在CarSim里建车、在Simulink里建控制、在另外的工具里建传感器光是接口调试就能耗掉大半时间。另外MWORKS是国产平台对于国内做ADAS开发的团队来说在技术支持、文档本地化、定制化需求响应上都有实际优势。我试过用MWORKS.Sysplorer搭一个简化的车辆模型从零开始到能跑直线加速大概半天时间就能搞定上手曲线比想象中平缓。1.3 这套虚拟驾驶舱适合谁来用如果你是在做ADAS功能开发、车辆电控系统测试、或者驾驶模拟器相关的研究这套东西值得花时间研究。具体来说ADAS算法工程师需要一个可重复、可配置的测试环境来验证AEB、ACC、LKA这些功能车辆动力学工程师想快速验证底盘控制策略在不同工况下的表现高校研究人员做驾驶行为分析、人机共驾、自动驾驶算法研究测试验证团队需要构建自动化回归测试流程替代部分实车测试不需要你精通Modelica语言但至少得理解基本的物理建模概念比如什么是因果建模、什么是非因果建模、方程和赋值有什么区别。如果之前用过Simulink过渡到MWORKS大概需要一两周的适应期。2. 拆解虚拟驾驶舱的四大核心模块2.1 车辆动力学模型不是越复杂越好车辆动力学模型是整个虚拟驾驶舱的身体。在MWORKS里建车辆模型你可以选择不同的复杂度模型层级自由度适用场景建模难度运动学模型3自由度路径跟踪、轨迹规划低单轨模型2自由度横向控制、稳定性分析低14自由度模型14自由度整车操控性、悬架分析中多体动力学模型20自由度精确动力学、联合仿真高我的建议是从单轨模型开始需要时再往上加复杂度。很多人一上来就想建一个完整的多体动力学模型结果参数标定就卡住了——弹簧刚度、阻尼系数、轮胎侧偏特性这些参数没有实验数据根本标不准。单轨模型虽然简化了但对于ADAS功能验证来说横向和纵向的基本特性已经够用了。在Sysplorer里建单轨模型核心方程就几个// 纵向动力学 m * der(v_x) F_x_front F_x_rear - F_aero - F_roll; // 横向动力学 m * (der(v_y) v_x * r) F_y_front F_y_rear; // 横摆动力学 I_z * der(r) a * F_y_front - b * F_y_rear;这几个方程看着简单但轮胎力的计算是难点。线性轮胎模型在侧偏角小的时候还行一旦接近附着极限就完全不对了。我一般用Pacejka魔术公式或者简化的刷子模型在Sysplorer里都有现成的轮胎模型库可以调用。注意轮胎模型的参数一定要用实际测试数据标定不要直接抄文献里的数值。不同轮胎的侧偏刚度能差一倍以上用错了模型后面所有测试结果都不可信。2.2 传感器模型雷达和摄像头怎么骗过算法虚拟驾驶舱里的传感器模型说白了就是用数学方式模拟真实传感器输出。ADAS算法需要的是目标列表——前方有什么、距离多少、相对速度多少。传感器模型的任务就是根据当前场景生成这些目标信息。毫米波雷达模型相对简单主要考虑探测距离和视场角比如77GHz雷达长距模式探测距离200m水平视场角±15°距离和速度测量精度通常距离精度±0.1m速度精度±0.1m/s虚警和漏检模拟真实雷达的检测概率不是所有目标都能100%检出摄像头模型就复杂多了。你要模拟镜头的内参外参、图像畸变、光照条件、天气影响。如果ADAS算法是基于视觉的那摄像头模型的质量直接决定了测试的有效性。我的做法是先用理想传感器验证算法逻辑再逐步加入噪声和干扰。一上来就搞一个带各种误差的传感器模型算法出了问题你都不知道是逻辑错了还是传感器太差。在MWORKS里传感器模型可以用Modelica的块Block来实现也可以用外部函数调用C代码。如果已经有成熟的传感器模型比如从其他工具导出的可以通过FMI接口集成进来。2.3 驾驶员模型人不是机器但可以近似虚拟驾驶舱里最容易被忽视的就是驾驶员模型。很多人觉得我就测ADAS功能驾驶员随便给个方向盘转角就行了。但实际测试中驾驶员的反应时间、跟车距离偏好、转向习惯都会显著影响ADAS系统的表现。常用的驾驶员模型有几种PID控制模型简单直接适合路径跟踪预瞄模型模拟人眼提前看前方一段距离然后决定怎么打方向最优控制模型假设驾驶员在优化某个目标函数比如最小化跟踪误差我一般用预瞄模型因为它最接近真实驾驶行为。预瞄距离这个参数很关键——设短了驾驶员反应太急方向盘来回晃设长了跟踪精度又不够。根据我的经验预瞄时间在1.0到1.5秒之间比较合理对应车速乘以这个时间就是预瞄距离。// 预瞄模型简化实现 preview_distance v_x * T_preview; target_lateral interpolate(path, s preview_distance); steering_angle K * (target_lateral - y_current) - K_d * der(y_current);驾驶员模型还需要考虑反应延迟。真实驾驶员的反应时间在0.3到1.5秒之间取决于年龄、疲劳程度、是否分心。在仿真里加一个纯延迟环节就能模拟这个效果。2.4 场景与道路模型把真实世界搬进来场景模型是虚拟驾驶舱的舞台。没有好的场景再精确的车辆模型和传感器模型也没用。场景建模包括几个层面道路几何直道、弯道、坡道、路口用坐标点和曲率来描述。OpenDRIVE格式是行业标准MWORKS可以通过接口导入。静态元素车道线、交通标志、信号灯、路沿、建筑物。这些主要影响摄像头和激光雷达的感知。动态元素其他车辆、行人、自行车。这些是ADAS系统真正要处理的目标。环境条件光照、天气、路面附着系数。雨天路面附着系数从0.8降到0.5制动距离直接增加60%。我通常用参数化的方式建场景把道路曲率、车道宽度、目标车位置这些做成可配置参数。这样跑回归测试的时候改几个参数就能生成成百上千个测试用例。比如# 场景参数化示例 scenarios [] for speed in [30, 50, 80]: for distance in [20, 40, 60]: for friction in [0.8, 0.5, 0.3]: scenarios.append({ ego_speed: speed, lead_distance: distance, friction: friction })这样三个参数各取三个值就是27个测试场景。如果再加上前车减速度、驾驶员反应时间这些参数轻松就能生成几百个用例。3. 在MWORKS.Sysplorer里把模型跑起来3.1 从零搭建一个最小可运行系统说了这么多模块实际动手的时候怎么开始我的建议是先搭一个最小可运行系统哪怕它很粗糙。具体步骤第一步建车辆模型。在Sysplorer里新建一个Modelica模型定义车辆的质量、转动惯量、轴距这些基本参数。先只考虑纵向运动用最简单的点质量模型。第二步加一个简单的控制器。比如定速巡航目标车速设成20m/s用PID控制油门和刹车。第三步加一个道路模型。先搞一条直道没有曲率变化。第四步跑起来看看。仿真10秒看车速能不能稳定在20m/s。这一步跑通了说明你的基本框架没问题。接下来就是往里面加东西加横向动力学、加传感器、加驾驶员模型、加场景元素。每加一个模块都单独测试一下确保它工作正常再集成。我见过太多人一上来就搭一个完整系统结果跑不起来几百个参数不知道哪个出了问题。增量式开发在仿真建模里同样适用。3.2 求解器配置别让数值问题毁了你的仿真Modelica模型建好后求解器配置是个容易被忽视但极其重要的环节。Sysplorer默认用DASSL求解器对于大多数车辆动力学问题都够用。但有些情况需要调整刚性系统如果模型里同时有快变和慢变动态比如液压系统车辆运动用Euler或者Runge-Kutta可能会很慢。这时候换成DASSL或者Radau求解器。间断问题轮胎模型在滑移和滚动之间切换、刹车片在接触和分离之间切换这些都会导致方程不连续。求解器需要能处理事件检测否则会卡在间断点附近反复迭代。实时仿真如果要做硬件在环HIL测试求解器必须满足实时性要求。这时候可能需要用定步长求解器步长根据CPU性能来定通常1ms左右。我踩过的一个坑模型在离线仿真时跑得好好的一上HIL就发散。后来发现是求解器步长太大漏掉了传感器采样的事件。把步长从10ms改成1ms就解决了。提示仿真发散的时候先别急着改模型。把求解器步长减小一半试试很多时候问题就出在数值积分上。3.3 用脚本实现自动化测试手动跑仿真效率太低。MWORKS支持用脚本Python或Julia调用仿真引擎实现自动化测试。基本流程是import mworks # 加载模型 model mworks.load(virtual_cockpit.mo) # 设置参数 model.set_parameter(ego_speed, 30) model.set_parameter(lead_distance, 50) # 运行仿真 result model.simulate(stop_time20) # 提取结果 min_distance result.get_variable(distance).min() # 判断是否通过 if min_distance 5: print(测试失败跟车距离过近)这样你可以写一个测试脚本遍历所有场景参数自动跑完所有用例生成测试报告。我一般会把测试结果存成CSV或者JSON方便后续分析。自动化测试的另一个好处是回归测试。每次改了模型或者控制器重新跑一遍所有用例看看有没有引入新的问题。这在ADAS开发里特别重要因为一个参数的改动可能影响多个功能。4. 那些只有踩过才知道的坑4.1 模型标定参数不对仿真白费虚拟驾驶舱的仿真结果可不可信很大程度上取决于模型参数准不准。我见过太多项目模型搭得很漂亮但参数是拍脑袋填的跑出来的结果和实车对不上。车辆模型的关键参数包括质量参数整车质量、簧上质量、转动惯量几何参数轴距、轮距、质心高度轮胎参数侧偏刚度、纵滑刚度、峰值附着系数悬架参数弹簧刚度、阻尼系数、防倾杆刚度这些参数里轮胎参数是最难搞的。没有试验台架数据你只能用经验公式估算但误差可能达到30%以上。我的做法是先用估算参数跑起来然后用实车测试数据做参数辨识。比如做几个稳态圆周试验测出不同侧向加速度下的方向盘转角反推轮胎侧偏刚度。标定过程中有一个容易犯的错误用同一组数据同时标定多个参数。比如用一组试验数据同时标定侧偏刚度和质心高度结果两个参数都不准。正确做法是设计专门的试验让每个试验只对少数几个参数敏感。4.2 实时性仿真跑得比现实还慢做HIL测试的时候仿真必须实时运行。也就是说仿真1秒的时间实际计算也必须在1秒内完成。这对模型复杂度提出了硬约束。我做过一个项目车辆模型有200多个状态变量离线仿真跑1秒需要0.5秒看起来还有余量。但加上传感器模型和场景渲染后实时因子掉到了0.8根本跑不了实时。解决办法有几个模型降阶把不重要的动态去掉比如悬架的高频振动查表替代计算轮胎力用查表代替实时计算分布式计算把不同模块分配到不同的CPU核心最有效的还是模型降阶。对于ADAS功能测试来说悬架的垂向振动、动力总成的扭振这些高频动态对上层决策算法的影响很小完全可以简化掉。4.3 传感器噪声太干净反而不真实刚开始做虚拟驾驶舱的时候我用的传感器模型是理想的——测距没有误差测速没有延迟目标一个不漏。结果ADAS算法在仿真里表现完美一上实车就各种误触发。后来我在传感器模型里加了几个东西测量噪声距离和速度都加高斯白噪声检测延迟传感器从探测到输出有几十毫秒的延迟漏检和虚警模拟真实雷达的检测概率不是100%可靠目标遮挡前车挡住更前面的车传感器看不到加了这些之后算法在仿真里的表现就正常了——该误报的误报该漏检的漏检。这时候再去优化算法才有实际意义。注意传感器噪声的参数也要基于实测数据。不同厂商的雷达噪声特性差别很大。用错了参数要么算法过度保守要么过度激进。4.4 场景覆盖你测的真的是你想要的吗场景设计是虚拟驾驶舱测试里最考验经验的部分。你设计了一百个场景跑完发现算法都通过了但这不代表算法没问题——可能只是你的场景没覆盖到问题。我一般用边界值分析的方法来设计场景。比如AEB功能关键参数是自车速度从0到120km/h取0、30、60、90、120前车减速度从0到-8m/s²取0、-2、-4、-6、-8初始距离从5m到100m取5、20、50、100路面附着系数从0.3到0.9取0.3、0.5、0.7、0.9这些参数的组合就是5×5×4×4400个场景。当然不需要全跑用正交试验设计可以大幅减少用例数量同时保证覆盖关键组合。另外还要考虑极端场景前车突然消失比如变道走了、传感器被泥水遮挡、隧道进出口的光照突变。这些场景在实车测试中很难复现但在仿真里就是改几个参数的事。5. 从虚拟驾驶舱到完整ADAS开发流程5.1 模型在环、软件在环、硬件在环虚拟驾驶舱不是一个孤立的工具它是ADAS开发流程中的一环。完整的开发流程通常包括阶段测试对象虚拟驾驶舱的作用MIL控制算法模型提供车辆和场景模型验证算法逻辑SIL编译后的代码提供相同的仿真环境验证代码实现PIL目标处理器上的代码验证代码在目标硬件上的实时性HIL真实ECU提供传感器信号和车辆模型验证ECU功能从MIL到HIL虚拟驾驶舱的车辆模型和场景模型是复用的只是传感器接口从模型信号变成了真实电气信号。这种复用大大减少了重复工作。我在实际项目中的体会是MIL阶段发现的bug修复成本最低HIL阶段发现的问题修复成本最高。所以虚拟驾驶舱的价值不仅在于测试更在于尽早发现问题。5.2 与实车测试的互补关系虚拟驾驶舱不能完全替代实车测试但可以大幅减少实车测试的工作量。我的经验是虚拟驾驶舱覆盖90%的常规场景跟车、变道、弯道、红绿灯路口实车测试聚焦10%的极端场景传感器失效、恶劣天气、复杂交通虚拟驾驶舱做回归测试每次软件更新后自动跑一遍实车测试做最终验收确认系统在真实环境中的表现这种分工可以把实车测试的里程数减少一半以上同时提高测试覆盖率。5.3 后续可以扩展的方向虚拟驾驶舱搭好之后还有很多可以扩展的方向云端仿真把仿真任务放到服务器上同时跑几百个场景几小时就能完成一轮回归测试。数据驱动场景生成从实车采集的数据中提取场景片段自动生成仿真场景。这样测试用例就更贴近真实交通。驾驶员在环把驾驶员模型换成真人用驾驶模拟器采集真实驾驶行为数据用于优化ADAS算法的人机交互。多车协同多个虚拟驾驶舱通过V2X通信互联测试协同式ADAS功能比如协同自适应巡航。我在实际使用中发现虚拟驾驶舱最大的价值不是替代实车测试而是让工程师能快速验证想法。有一个新算法思路花半小时在仿真里跑一下比花一周安排实车测试高效得多。这种快速迭代的能力才是虚拟驾驶舱真正的威力所在。
返回列表