最近这一年,新能源和智能驾驶相关的项目明显多了起来,尤其是分布式四轮驱动这个方向。所谓的分布式驱动,核心就是四个轮子各自独立,由轮毂电机或者轮边电机单独驱动,这样一来,扭矩分配就从传统的机械差速器时代,直接跨入了软件定义控制的时代。我在实际做项目的时候,接触最多的就是基于 MATLAB/Simulink 的整车控制仿真模型,这套工具链在高校课题和工业预研中几乎成了标配。这篇就来聊聊我搭这套模型时的心得,重点是轮毂电机扭矩分配控制这块硬骨头,从模型架构到细节实现,再到踩过的那些坑,一次性讲透。
先说清楚这套东西到底是什么、能干什么。用 Simulink 搭分布式四轮驱动整车模型,本质上就是建一个数字化的整车环境,把驾驶员意图、整车控制器、四个轮毂电机、轮胎、车辆动力学响应全部放进去,形成一个闭环。它能干的事非常多,比如验证扭矩分配策略,起步工况下怎么分配能避免打滑,弯道工况下怎么内外轮分配能提升过弯极限,还有低附着路面上的稳定性控制,都能在仿真阶段完成预研和标定。非常适合做毕业设计的硕士博士、刚接触整车控制的工程师、以及想快速验证控制算法的团队。
1. 分布式四轮驱动整车模型的核心设计思路
在动手搭模型之前,我习惯先画一个逻辑架构图,把各个子系统之间的信号流和数据流理清楚。这套架构如果一开始定歪了,后面改起来极其痛苦。
1.1 整车模型的分层架构
典型的分布式四轮驱动整车模型,我会分成三层。最上层是驾驶员模型和整车控制器,负责解析加速踏板、制动踏板、方向盘转角这些输入信号,然后生成驾驶员需求扭矩。中间层是扭矩分配层,这是整个模型的核心所在。它接收上层传来的总需求扭矩,结合车辆当前的纵横向状态,决定四个轮子各自应该出多少力。最底层是执行层和车辆动力学层,由四个轮毂电机模型的响应以及 14 自由度或者 7 自由度的车辆动力学模型组成。动力学模型输出车速、横摆角速度、质心侧偏角、四个轮速等状态量,反馈回上层的控制器,形成闭环。
这套分层的好处是模块化程度高,我可以单独替换扭矩分配算法,或者单独校准电机响应特性,不影响其他模块的运行。工业上做 V 流程开发,也是用这套思路。Simulink 里通过模型引用或者子系统封装实现层级化,跑闭环仿真的时候观察内部信号也非常方便,用数据记录和 scope 都能查,调试效率比自己写纯代码要高不少。
1.2 解决的实际问题和设计目标
这套模型要解决的实际问题,说穿了就是怎么让四个轮子自己商量着干活。传统四驱靠分动器和差速器把动力传给四个轮子,前后轴或者左右轮的扭矩比例基本是固定死的,很难根据路面条件实时变化。而分布式四驱的每个轮子都是独立电机驱动,理论上扭矩比例从 0:100 到 100:0 任意可调,这就给控制算法留出了巨大的优化空间。
那么设计目标就很清楚了:第一,跟随驾驶员意图,踏板踩多少,整车就出多少扭矩;第二,保证车辆稳定性,尤其是在分离路面或者低附着路面,不能让某个轮子打滑到失去侧向力;第三,节能,在附着条件允许的情况下,合理分配前后轴扭矩,让电机尽量工作在高效区。这里面还涉及到制动能量回收的分配策略,后轮优先还是前轮优先,不同策略对续航和制动舒适性的影响是完全不同的。我做的模型通常会预留模式切换接口,比如经济模式、运动模式、雪地模式,本质上切换的就是一套扭矩分配权重。
1.3 方案选型的博弈:轮毂电机还是轮边电机
分布式驱动里,有个前提性的选型问题,车辆驱动方案到底是轮毂电机直驱,还是轮边电机加减速器。这个选择会影响整个模型的参数设定。
轮毂电机直驱的好处是结构紧凑,省去了传动轴、差速器、减速器这些机械部件,簧下质量会增加,但对控制来说响应极快,电机直接产生力矩作用于车轮,没有传动系的弹性振荡。轮边电机加减速器则相当于保住了低速大扭矩的优势,电机体积可以小一些,但传动比会引入额外的转动惯量和效率损失。
我自己的仿真模型里,主流配置参考的是轮毂电机直驱方案,因为控制逻辑更直接,也方便在 Simulink 里验证算法。电机参数参考现在主流的乘用车轮毂电机,峰值功率 50kW 左右,峰值扭矩 1000Nm 上下,这数据听着吓人,实际轮毂电机由于安装在轮辋内,空间限制大,扭矩密度必须做得很高才行。具体的电机响应时间常数一般在 20ms 到 50ms 之间,建模时我会用一个一阶惯性环节来近似,这个时间常数对扭矩分配的影响非常大,后面细说。
2. 扭矩分配控制策略的几种主流方案
扭矩分配策略是整个模型的大脑。为什么值得花大力气去研究分配策略?因为分布式驱动的性能上限,很大程度上取决于软件算法写得多好。硬件提供了独立可控的四个执行器,但是怎么用好这四个执行器,是控制算法的问题。
2.1 基于油门解析和车辆状态的动态分配逻辑
最简单的分配策略是固定比例分配。比如前后轴 40:60,左右轮 50:50。这种方案实现简单,但对各类工况完全不设防。稍好一点的是基于油门解析的动态分配,核心逻辑是:小油门巡航状态下,偏向后轴驱动,或者干脆单轴驱动,因为此时电机负载率低,单轴驱动更节能;大油门加速状态下,前后轴同时出力,此时要利用地面附着力,把扭矩合理分配避免打滑。
这套分配逻辑里包含一个非常重要的参数,轴荷转移。车辆急加速时,重心后移,后轴附着力增大,前轴附着力减小。如果此时还按固定比例分配,前轮很容易突破附着极限,车辆就会推头或者直接扭矩转向。所以动态分配策略要实时估算纵向加速度导致的轴荷转移量,把更多的扭矩分配给后轴。在 Simulink 里实现时,我会用一个简单的轴荷转移模型,根据加速度和质心高度来计算前后轴垂向力变化,然后在分配层引入这个结果。一般乘用车的质心高度在 0.5m 到 0.6m,轴距 2.7m 左右,这几个参数直接决定了轴荷转移的灵敏度。
2.2 横摆力矩控制与差动驱动
回到整车操稳性的话题。分布式驱动的优势之一,是可以通过左右轮扭矩差来产生附加横摆力矩。这就涉及到横摆力矩控制,目标横摆角速度可以根据方向盘转角和车速,通过整车二自由度参考模型计算得到。实际的横摆角速度由车辆动力学模型输出,两者的偏差经过一个控制器,比如经典 PID 或滑模变结构,计算出需要补偿的附加横摆力矩。
有了附加横摆力矩之后,就要把它转化成左右轮的扭矩差。转换公式不复杂,附加横摆力矩等于左右轮扭矩差除以轮距再乘以车轮滚动半径。举个例子,如果轮距是 1.6m,车轮滚动半径 0.35m,目标是产生 1000Nm 的附加横摆力矩,那么左右轮的扭矩差就是约 4571Nm。这个数字看似很大,但在特定工况下确实需要这么大的力矩差才能纠正车辆的横摆运动。
实现时我会在扭矩分配层设计一个分配系数,正常情况下是 0.5 比 0.5,横摆力矩控制器介入后,系数变成 0.5 加 delta 和 0.5 减 delta,delta 由附加横摆力矩换算而来。这种差动驱动方案对提升弯道稳定性非常有效,尤其是接近车辆操控极限的时候,效果比单独刹车某侧车轮更细腻,因为电机的响应带宽比液压制动系统高得多。
2.3 附着利用率最优算法:最大化整车稳定裕度
更高阶一点的是基于附着利用率最优的分配算法。这个思路的核心,是把每个车轮看作一个摩擦圆约束,四轮的纵向力分配要让整车剩余的附着裕度最大化,也就是说尽量让每个车轮的附着利用率接近,避免某个车轮率先饱和。
数学上这是个带约束的优化问题。目标函数通常写成四个轮子附着利用率平方和最小化,约束条件是总驱动力等于驾驶员需求扭矩转换成的总力,附加横摆力矩等于目标值,每个轮的纵向力不能超过该轮当前的附着极限。求解方法可以用二次规划,也可以用规则化的方法。实际在 Simulink 里跑二次规划在线求解,计算量偏大,实时性会打折扣。我更常用的是把目标函数化简,通过拉格朗日乘子法得到一个解析解,也就是考虑前后轴荷的分配比例,以及左右轮基于垂向载荷的比例分配。
这套算法的输入需要实时获取每个轮的垂向载荷,所以在车辆动力学模型里,必须建立垂向力估算模块,根据纵向加速度和横向加速度计算四个轮的动态载荷转移。横向加速度在弯道中引起的侧倾载荷转移同样不能忽略,左右轮的垂向载荷差异直接决定了它们能出多少力,如果把这个问题忽略了,过弯时内侧轮的滑移率数据会非常难看。
3. Simulink 模型搭建的实操过程拆解
理论说了一堆,接下来进入实操层面。Simulink 里搭这套模型,每一步都有讲究,顺序错了容易返工。我按照我的习惯,从整车动力学模型开始,往上搭建控制器。
3.1 车辆动力学模型参数初始化与界面规划
搭过 Simulink 模型的人都知道,参数初始化做不好,整个模型后面到处是魔法数字。我一般会用 MATLAB 的脚本文件做初始化,把整车参数集中定义,然后模型里所有的 Gain 块、常量块,都直接引用工作区变量名。这样做的好处是,如果想仿真不同轴距的车辆,只要改脚本里的参数就行,不需要满模型找数字。
整车参数我习惯分块定义:车辆模型参数,包含质量、轴距、质心高度、轮距、车轮半径、转动惯量;电机参数,包含峰值扭矩、峰值功率、响应时间常数、峰值转速;路面参数,包含路面附着系数、滚动阻力系数。尤其要强调一下,仿真步长和求解器的选择非常有讲究。整车模型包含轮胎模型和电机模型,这部分非线性强,建议使用变步长求解器 ode45 或者 ode23t,容忍度默认即可。我试过用定步长求解器,步长设定 1ms,电机响应快一点的工况下仿真速度会骤降,而且要兼顾不同工况的稳定性,变步长明显更合理。
3.2 轮胎模型搭建的细节与注意事项
车辆动力学模型里最核心的是轮胎模型。分布式四驱的仿真对轮胎精度要求很高,因为扭矩分配策略最终就是通过轮胎力作用在整车上,轮胎模型精度跟不上,分配算法做得再花哨也没用。
我在仿真里常用的是魔术公式轮胎模型,它的核心表达式是垂向力、侧偏角、滑移率、外倾角这几个参数到轮胎纵向力和侧向力的映射关系。魔术公式本身是一个带有多个系数的高度非线性函数,系数一般通过试验数据拟合获得。不过自己实测轮胎数据不太现实,行业上一般参考 PAC2002 或者更准的轮胎参数库。在 Simulink 里实现时,我会用一个 MATLAB Function 模块编写轮胎力的计算函数,输入是轮胎垂向力、滑移率、侧偏角,输出是纵向力和侧向力。
这个模块有两点需要特别注意。第一,魔术公式在滑移率接近 0 的时候,纵向力随滑移率的变化率非常大,也就是轮胎刚度很高,如果仿真步长偏大,会出现数值不稳定。第二,轮胎的纯纵滑和纯侧偏特性是耦合的,侧偏角存在的情况下,纵向力的峰值会下降,这就是所谓的附着椭圆概念。如果忽略耦合,仿真结果在弯道工况下会偏乐观,这会掩盖分配策略的缺陷,非常危险。我在此处使用联合滑移理论,通过摩擦因数对纵向力和侧向力分别进行修正,仿真结果和实测数据对得上。
3.3 信号路由与控制接口定义
模型搭到控制器层,最大的挑战是信号路由。分布式四驱整车模型的信号特别多,四个轮的扭矩指令、轮速反馈、滑移率、垂向力、横摆角速度、质心侧偏角等等,如果信号线拉得乱七八糟,不仅看不过来,还容易接错。
我会用到 Goto/From 标签、Bus 对象和 Simulink 数据词典来做信号管理。整车控制器输出的四轮扭矩指令,我用一个 Bus 对象打包,方便在 Scope 里直接观察。各子系统的反馈信号也是通过 Data Store Memory 或者 Bus 方式汇总。如果项目规模再大一点,多人协作的时候,会用到 Simulink 模型的接口控制文档,比如针对 AUTOSAR 软件组件接口设计的信号名、数据类型、初始值等。这里插一句,最近不少团队在关注 AUTOSAR Adaptive 平台和 Simulink 的集成,如果将来做量产控制器,接口定义从一开始就要规范化,否则后面做软件集成的时候会花大量时间做信号映射。
3.4 控制算法子系统的封装与复用
控制算法部分,我会把扭矩分配算法封装成一个子系统,对外接口只保留驾驶员需求扭矩、车速、横摆角速度、质心侧偏角、四个轮速、方向盘转角等有限的信号。内部结构根据算法的复杂程度,可以是 Stateflow 状态机、Simulink 函数块或者 MATLAB Function。封装的好处是后续做硬件在环仿真时,可以直接把整车模型和控制器模型拆开,控制器模型生成 C 代码烧录到快速控制原型设备里,整车模型继续在 PC 或者实时机上跑,接口保持不变。这套流程我在实际项目中已经验证了很多次,从纯仿真到硬件在环的迁移成本非常低。
我常用的扭矩分配算法内部是分层的。第一层是扭矩需求限制层,根据当前车速、电池允许放电功率等约束,对总需求扭矩做限值处理。第二层是前后轴分配层,根据轴荷转移和工况模式,算出前后轴各占多少比例。第三层是左右轮分配层,根据横摆力矩控制器的附加力矩指令,对左右轮施加差值。我问过一些同行,大家在量产模型的扭矩分配逻辑上,基本都是这一套分层思路,确保每一层的职责单一。
4. 扭矩分配策略的仿真验证与结果分析
模型搭完之后,最有趣的环节是仿真验证。很多人以为仿真就是为了跑几个工况看趋势,其实不是。仿真的核心价值,是用最小成本暴露策略和参数的问题。
4.1 典型工况设置与仿真对比
我通常设置四类工况来验证扭矩分配策略。正弦扫频转向工况,看车辆的横摆响应和侧向加速度响应;紧急双移线工况,测试车辆的操稳性和稳定性控制介入逻辑;低附着路面直线加速工况,检验起步防滑控制的鲁棒性;对开路面制动工况,验证单侧低附着力条件下的扭矩分配合理性。
拿低附着路面直线加速来说,比如路面附着系数 0.2 的冰雪路面,全油门起步,如果一个轮子率先突破附着极限,轮速会迅速飞升。传统四驱控制往往通过 ABS 式干预,单轮制动或降扭,等轮速恢复后再爬升扭矩。而分布式驱动的优势在于,每个轮的扭矩都是独立控制的,我可以做到在某个轮即将打滑时,迅速减小该轮扭矩,把省下来的扭矩合理输出到其他有附着力的轮子上。
我跑出来的典型对比曲线很有意思。固定比例分配方案下,起步约 0.5 秒后驱动轮滑移率超过 0.1,车辆纵向加速度上升缓慢,横摆角速度出现明显偏摆;而在优化分配方案下,滑移率被死死限制在最佳滑移率附近,车辆起步平稳,纵向加速度在同样时间内提升了接近 20%,横摆角速度的波动幅度也大幅缩小。这样的对比结果,拿到项目汇报里非常有说服力。
4.2 关键参数扫描:时间常数、附着系数、轴荷转移
仿真验证不能只看一个工况,还需要做参数扫描,看看策略在参数变化下的鲁棒性。我习惯对电机响应时间常数做从 0ms 到 100ms 的阶梯扫描,观察分配策略的表现。这个时间常数在物理上代表了电机扭矩响应的快慢,如果控制器里按理想电机来设计,扭矩分配指令发出后瞬间就能达到目标值,那仿真结果会过于乐观。实际电机有电流环、有转动惯量,从扭矩指令到实际轮端扭矩必然存在滞后。扫描结果告诉我们,当时间常数超过 50ms 时,某些激进分配策略容易出现振荡,这时就需要在控制器里引入一阶滤波或前馈补偿。这里用到的技术和 Simulink 一阶滤波模块本质上是相通的,就是对扭矩参考指令做惯性修正,抵消电机响应的延迟效应。
路面附着系数也是重要的扫描变量。同一条弯道工况,附着系数 0.8 干沥青和 0.3 湿滑路面,最优分配比例差异巨大。如果策略是固定的,车辆在湿滑路面上更容易失控。我建议在分配算法里实时估算路面附着系数,可以采用递推最小二乘法,根据轮胎力利用率间接估计最大附着系数,但这部分算法比较复杂,在模型中先用开关切换在不同附着系数下的分配权重,也能达到初步效果。
4.3 仿真数据可视化与后处理
仿真结果的后处理,经常被初学者忽视。Simulink 里的 Scope 适合在线观察,但要对数据进行深度对比和分析,还是要把数据导出到 MATLAB 工作区或者保存为文件。我一般会把关键的 Simulation Data Inspector 数据导出后用 MATLAB 脚本绘制曲线,横向对比多个策略和多个工况。
绘制的内容包括纵向车速对比、各轮滑移率对比、各轮扭矩指令和实际扭矩对比、横摆角速度响应曲线、质心侧偏角相平面图。这些曲线组合起来,基本能清晰显示策略在不同工况下的优劣,也为后续论文或者项目报告中图表素材提供支持。另外,做参数分析时可以用 Simulink 的 Response Optimization 工具或者 MATLAB 脚本循环跑不同参数组合,批量记录结果指标,比如 0-100km/h 加速时间、最大滑移率、横摆角速度峰值,最后生成对比表格。这部分自动化程度越高,后期调参效率提升越明显。
5. 实操中经常踩的坑:排查与避坑技巧
最后这块内容,是按头安利环节。我搭这套模型的时候,踩过不少坑,有些问题排查了很长时间才找到根源。写出来帮大家避雷。
5.1 代数环问题怎么破
代数环是 Simulink 里最经典的问题之一。当控制器的输出直接影响到车辆动力学模型的输入,而动力学模型的输出又直接反馈回控制器的输入,如果中间没有任何状态量延迟,就会形成代数环。代数环容易导致仿真速度变慢,严重的会产生数值振荡甚至仿真崩溃。
我的解决办法是在反馈回路里人为引入一个很小的惯性环节,或者把轮胎力、车速等信号通过 Memory 模块缓存一个仿真步长再做反馈。这样就把代数环切断了。要特别提醒的是,引入延迟时间要尽可能小,不然控制环路的相位裕度会被削弱,仿真结果和高保真模型有偏差。我一般选择延迟一个采样步长,在离散控制器里默认就是这样一个执行逻辑。
5.2 参数初始化顺序和模型回调函数
Simulink 模型如果直接点运行,经常会报出找不到变量的错误,原因是初始化脚本没有在模型加载时执行。这就需要用到模型回调函数功能,在模型属性里设置 PreLoadFcn 或 InitFcn,运行模型之前自动执行参数初始化脚本,这样模型在加载时就会把工作区变量都定义好。
另外,我还习惯把所有初始化脚本集中在一个 m 文件里,通过模型回调统一管理。这样团队协作时,别人拿到模型打开就能直接跑,不会出现来回询问参数怎么来的问题。对于参数较多的情况,我会用 MATLAB 的结构体变量组织参数,比如 veh.mass、veh.wheelbase、motor.tau_max,这样模型里读参数更清晰,也方便和团队其他成员对接,比一盘散沙的变量好维护太多了。
5.3 数据字典引用的坑
用 Simulink Data Dictionary 管理参数是好习惯,但也有个非常常见的坑。如果模型引用了某个数据字典文件,打开模型时报错说找不到数据字典,大概率就是字典文件的路径发生了变动。团队项目中,不同成员的本地路径可能不一样,这个问题很常见。解决办法是使用相对路径引用数据字典,或者把数据字典提交到版本库,并且约定大家把工程根目录放在同一个层级。
如果你是在别人的模型基础上二次开发,一上来就报找不到 .sldd 文件,不用慌,在模型资源管理器里重新关联正确的数据字典路径就可以解决。类问题还有一个隐形版本,就是数据字典里的参数定义被覆盖了,模型加载时以字典为准,本地工作区同名变量不会被采用,调半天代码没反应,最后才发现参数被字典锁定。排查方法不复杂,在模型资源管理器里逐个查看信号的解析值和数值,确认参数来源是字典还是工作区。
5.4 离散与连续混合求解器的选择
分布式四驱整车模型一般混合了连续动力学部分和离散控制代码部分。比如车辆动力学模型是连续的,控制器可能是以 10ms 周期运行的离散状态机。Simulink 支持连续和离散混合仿真,求解器自动处理。但我建议把控制器的采样时间单独设置,不要和求解器的步长混为一谈,控制器采样周期决定了控制策略行为的时间粒度,也会影响整车的稳定性和响应品质。如果采样周期过大,扭矩分配指令更新过慢,控制器很难及时响应车轮打滑趋势;如果过小,控制器代码生成到嵌入式设备后执行不过来,实际部署的时候会遇到实时性压力。
我常用的搭配是控制器采样周期 5ms 到 10ms,整车动力学模型连续仿真,求解器用变步长自动模式。这样既保证了控制策略的时间连续性和稳定性,也兼顾了仿真效率。
写在最后的几句体己话
搭这套分布式四驱整车控制模型的经历,让我感受最深的一点是:仿真工具的熟悉只是基本功,真正拉开差距的是对车辆动力学细节的理解、对控制策略优劣的判断、以及对工程落地约束的敏锐度。很多同学跑通模型后觉得万事大吉,我建议你把注意力放在算法在不同极端工况下的表现差异上,多盯着滑移率、附着利用率这些曲线看,看多了你会慢慢建立起一种感觉,知道哪些现象代表模型策略有问题,哪些现象是物理规律在起作用,这种感觉只能在反复的仿真和对比里积累出来。
另外再补一句,Simulink 模型在工程中的价值,不只是给你们做仿真看结果,而是它构成的算法资产可以沿着 V 流程走完整条链路,从模型在环到软件在环再到硬件在环。所以从一开始建模,就要用一套可追溯、可配置、易维护的方式来进行,保持清晰的接口定义、详尽的仿真文档、规范的命名习惯。这些工作短期看似琐碎,但长期给团队省下的时间价值会成倍放大。有机会的话,后续可以再展开聊聊扭矩分配算法代码生成和硬件在环测试的相关经验。