
最近好几个人私信问我同一个问题四轮转向汽车的二自由度线性模型用Simulink到底怎么搭我之前在底盘控制项目里用这个模型做过控制器预研也带学生从零搭过好几版趁着有空把整套建模流程完整复盘一遍。这篇文章适合三类人正在写四轮转向相关课程设计或毕业论文的本科生、想快速验证四轮转向控制算法的研究生以及刚接手底盘域预研项目的工程师。文章会从动力学方程讲起给出一套可以直接改参数的Simulink模型结构再把我在调试中踩过的坑——代数环、单位制、符号方向、求解器发散——全部摆出来。读完之后你应该能在半天内搭出一个能跑、能出曲线、能支撑论文或者预研报告的模型。1. 先讲清楚二自由度线性模型意味着什么1.1 只有两个自由度为什么够用车辆在平面运动里其实很复杂纵向速度会变、车身会侧倾、轮胎会进入非线性区、悬挂也会有变形。但四轮转向控制方案设计的第一步通常不会直接上Carsim那种高保真模型而是先把“主矛盾”抓出来。主矛盾是什么是车身的横摆运动和侧向运动。二自由度线性模型只保留两个状态质心侧偏角β和横摆角速度r。它假设纵向车速恒定忽略俯仰侧倾认为轮胎一直工作在线性区。这个模型在横向加速度不超过0.4g左右时精度够用做控制器原理验证完全没问题。你可以把它理解成一根刚性杆上装了两个轮子杆在平面上既会平移也会旋转就这两个自由度。四轮转向控制研究的核心问题是“后轮要不要转、转多少、怎么跟着车速变”。这个问题用二自由度模型回答最清晰因为它把侧偏角和横摆角速度直接作为状态量暴露出来控制效果一目了然。如果一上来就用20自由度的整车模型反而看不出控制规律。1.2 方程推导和状态空间矩阵模型推导用车辆坐标系x轴沿纵轴向前y轴指向左侧。整车质量m横摆转动惯量I_z质心到前轴距离a到后轴距离b轴距Lab。前轮转角δ_f、后轮转角δ_r是输入这里符号约定就是顺时针方向为负、逆时针为正的标准车辆坐标系。侧向力平衡方程[ m \cdot V \cdot (\dot{\beta} r) F_f F_r ]横摆力矩平衡方程[ I_z \cdot \dot{r} a \cdot F_f - b \cdot F_r ]线性轮胎力写成[ F_f -k_f \cdot \alpha_f, \quad F_r -k_r \cdot \alpha_r ]注意侧偏刚度k_f、k_r我习惯按负值处理也就是轮胎侧偏力与侧偏角方向相反这样代公式时符号不容易乱。前轮侧偏角和后轮侧偏角分别是[ \alpha_f \beta \frac{a}{V} r - \delta_f ][ \alpha_r \beta - \frac{b}{V} r - \delta_r ]整理成状态空间形式[ \dot{x} A x B u ]其中状态向量x[β, r]ᵀ输入向量u[δ_f, δ_r]ᵀ。A矩阵元素[ a_{11} \frac{k_f k_r}{m V}, \quad a_{12} 1 \frac{a k_f - b k_r}{m V^2} ][ a_{21} \frac{a k_f - b k_r}{I_z}, \quad a_{22} \frac{a^2 k_f b^2 k_r}{I_z V} ]B矩阵元素[ b_{11} \frac{-k_f}{m V}, \quad b_{12} \frac{-k_r}{m V} ][ b_{21} \frac{-a k_f}{I_z}, \quad b_{22} \frac{b k_r}{I_z} ]看到单位别慌A矩阵里a₁₂那一项在低速时接近1高速时会明显变化这正是稳定性因数进入矩阵的方式。后面在Simulink里这些系数直接抄进去就行。1.3 四轮转向和前轮转向的本质区别二自由度模型里前轮转向只是把δ_r强制设成零四轮转向则多了第二个控制输入。这么做物理上带来什么好处低速时后轮反相转动相当于加长了“虚拟轴距”能缩小转弯半径高速时后轮同相小角度转动可以让车身姿态和行驶方向更一致显著压低质心侧偏角。竞速类驾驶里那种“车头已经转过去了车尾还在甩”的感觉本质上就是侧偏角过大四轮转向的零侧偏角控制就是冲着这个去的。难点在于最优的后轮转角比例是车速的函数低速反向、高速同向中间存在一个过渡车速。二自由度模型恰好能把这种变化趋势算出来所以它成了四轮转向控制设计最常用的基准模型。2. Simulink建模从数学到模块图2.1 先画信号流再拖模块很多新手一打开Simulink就急着找模块这是最容易乱的地方。我的习惯是先在一张纸上或者Visio里把信号流画出来参考输入、前馈控制器、反馈控制器、被控对象、状态输出谁连谁先搞清楚。这个模型的信号流其实很简单输入1前轮转角δ_f来自方向盘或者测试工况信号源输入2后轮转角δ_r来自控制器被控对象二自由度状态方程输入是u矩阵输出是β和r控制器读入β和r计算δ_r我把模型分成三个子系统信号源子系统、控制器子系统、车辆模型子系统。这样后期改成Carsim联合仿真时只需要把车辆模型子系统替换成Carsim提供的S-Function就行控制器和信号源都不用动。2.2 状态空间部分推荐矩阵Gain搭法状态空间部分的搭法有两种。一种是积分器链两个积分器分别积分β̇和ṙ再用一堆标量Gain和Sum模块组合。这种搭法直观适合教学演示但模块太多连线容易密密麻麻。另一种是矩阵Gain法用两个积分器组成一个2×1的状态向量A矩阵用一个2×2的Gain模块实现B矩阵用一个2×2的Gain模块实现把A·x和B·u加在一起就是ẋ。这个搭法更简洁我推荐用这个。具体参数可以直接抄下面这组这是我在某款B级车上标定过的示例参数参数数值单位整车质量m1600kg横摆转动惯量I_z2500kg·m²质心到前轴a1.8m质心到后轴b1.2m前轮侧偏刚度k_f-88000N/rad后轮侧偏刚度k_r-66000N/rad纵向车速V20m/s代入后车速20m/s时A矩阵和B矩阵的数值为[ A \begin{bmatrix} -4.8125 0.8763 \ -31.68 -7.6032 \end{bmatrix} ][ B \begin{bmatrix} 2.75 2.0625 \ 63.36 -31.68 \end{bmatrix} \times 10^{-0} ]在Simulink里Gain模块的参数直接填矩阵就行Gain支持矩阵运算。A_Gain参数填[-4.8125 0.8763; -31.68 -7.6032]B_Gain参数填[2.75 2.0625; 63.36 -31.68]。输入信号u用一个Mux合成2×1向量第一个分量是δ_f第二个是δ_r。积分器的初始条件设置为[0; 0]也就是初始时刻车辆沿直线行驶。积分器输出经过一个Demux拆成两路β和r分别接出去。提示Gain模块做矩阵乘法时输入信号的维度必须和矩阵的列数匹配。A_Gain的输入是2×1状态向量B_Gain的输入是2×1输入向量。如果提示维度错误先检查Mux的输出是不是列向量。2.3 控制器部分前馈查表加LQR反馈控制器是整个模型的灵魂。我常用的方案是前馈加反馈的组合前馈负责按车速给一个基础的后轮转角比例反馈负责把侧偏角压到零附近。前馈部分后轮转角比例K_ff随车速变化低速为负、高速为正。不需要手推复杂公式直接在Simulink里放一个Lookup Table表里填车速和对应比例。比如车速V (m/s)K_ff (δ_r/δ_f)5-0.610-0.25150.15200.55300.85这张表可以根据二自由度模型稳态解析推导得到也可以先用粗略值搭起来再用下面的反馈把误差吃掉。反馈部分我用LQR。二自由度模型可控性很好状态反馈增益矩阵K可以用MATLAB直接算% 定义车辆参数 m 1600; Iz 2500; a 1.8; b 1.2; kf -88000; kr -66000; V 20; % 状态矩阵 A [ (kfkr)/(m*V), 1(a*kf-b*kr)/(m*V^2); (a*kf-b*kr)/Iz, (a^2*kfb^2*kr)/(Iz*V) ]; % 只考虑后轮转角输入的B矩阵第二列 B_r [ -kr/(m*V); b*kr/Iz ]; % LQR设计 Q diag([100, 1]); % 侧重把β压到零 R 1; % 后轮转角代价 K_lqr lqr(A, B_r, Q, R);算出来K_lqr是一个1×2的行向量。在Simulink控制器子系统里用一个Gain模块填这个K_lqr输入是状态向量输出直接作为δ_r的一部分。如果你的模型不想引入整车模型作为被控对象这个K_lqr完全可以先用脚本算好再填进去后期调参也方便。注意这里提供的K_lqr只对后轮转角做反馈控制前轮δ_f还是外部输入。这样4WS控制器的结构就是δ_r K_ff·δ_f - K_lqr·x。2.4 2WS和4WS一键切换做对比实验时需要同时保留前轮转向和四轮转向两种方案。我的做法是在控制器子系统里加一个Manual Switch一个分支把δ_r直接置零另一个分支接控制器输出。这样跑一次仿真就能拿到2WS和4WS两组曲线对比起来非常直观。如果你想把切换做自动化就用一个Constant模块作为开关信号值设为0或1乘以δ_r即可[ \delta_r \text{switch} \cdot \delta_{r,\text{ctrl}} ]switch0就是2WSswitch1就是4WS。后面的结果分析部分我就是靠这个开关来做对照实验的。3. 参数、工况和结果验证3.1 整车参数怎么给整车参数不要凭感觉拍脑袋我给出上面那张表是合理的B级车参考值。真实项目中这些参数来自整车动力学参数库论文里则是通过参考车型尺寸、轴荷分配估算。侧偏刚度这栏最容易出问题。轮胎侧偏特性在小侧偏角范围内近似线性斜率就是侧偏刚度的幅值方向是负的。如果手头有轮胎试验数据直接取线性段的斜率没有的话用常见轿车轮胎的典型值前轮在-80000N/rad到-120000N/rad之间后轮略小一些。前后侧偏刚度的相对关系直接影响稳态转向特性如果前轮刚度明显大于后轮车会倾向于不足转向反过来就是过多转向这种车开起来很危险。做仿真时务必让前轮刚度绝对值大于后轮否则角阶跃工况下横摆角速度会异常偏大。质心位置a和b也影响很大。普通轿车质心偏前所以a大于b我用a1.8、b1.2是合理的。如果a和b搞反了稳态增益会算出完全离谱的值。3.2 角阶跃输入最容易验证的工况角阶跃是验证线性模型最标准的工况。在Simulink里用Step模块做前轮转角输入阶跃时刻设为0.5秒初始值0终值把角度换算成弧度。以2°为例就是0.0349弧度约0.035。仿真时长设5秒够了。对于2WS模型理论上稳态横摆角速度用线性模型算出来约为0.118 rad/s也就是6.8°/s左右。这个解析值可以拿来核对模型是否正确。如果仿真出来的稳态值和这个数对不上说明A矩阵或B矩阵里有符号错了。4WS接入控制器后从结果上应该看到两个明显变化质心侧偏角β的稳态值从约0.04 rad压到接近零横摆角速度r的稳态值略微变小趋势保持一致注意4WS不是把横摆角速度做得越大越好而是让车身姿态更“顺”。所以判断控制好坏看β的稳态值而不是看r的峰值。3.3 双移线工况更接近真实驾驶角阶跃适合做数值验证双移线工况则更接近真实超车场景。用Signal Editor或者From Workspace模块把双移线路径的转向角时间序列喂给δ_f。双移线路径本身是个位置信息不能直接当转向角输入。要么先通过一个简化的驾驶员模型把路径误差转成转向角要么直接用整车动力学软件跑路径。如果只在Simulink里做的话我建议先用角阶跃验证完控制逻辑再上手双移线。双移线工况下4WS的优势会更明显在两次换道过程中β的峰值幅度会比2WS显著减小横摆角速度的超调量也会下降。这也是论文里最常用的一组对比图。3.4 结果怎么才算“对”模型跑通不等于模型是对的我列几个自查点检查项判断标准2WS稳态r与理论解析值误差小于3%β响应曲线无振荡发散约0.3到0.5秒进入稳态4WS稳态β接近零量级在0.001 rad以下阶跃响应超调典型线性车辆模型超调在10%以内数值稳定性全程无NaN、无指数型发散如果2WS稳态值都核对不上先检查符号和单位这件事我反复强调也不为过。4. 调试实录常见问题与排查速查4.1 一运行就报代数环这是二自由度状态反馈模型最容易遇到的坑。控制器输出δ_r直接反馈到B·u而B·u又参与状态计算状态又作为控制器输入Simulink检测到闭环里存在没有延时的路径就会提示Algebraic Loop。解决方式很简单在反馈回路里插入一个Delay或者Memory模块。我习惯用Unit Delay采样时间设为和控制器周期一致比如0.001秒。这样既打破了代数环又模拟了控制器实际执行时的采样延迟。注意Memory块虽然也能打破代数环但它没有采样概念在某些离散控制场景下会引入不直观的时序问题。能选Unit Delay就不用Memory。4.2 结果差57倍单位制翻车这是新手最常见的问题没有之一。状态方程里的角度全都要用弧度方向盘角度在工程上习惯用度如果你忘了把度数转成弧度直接输进去仿真结果会在某个环节差出一个57.3倍。具体现象是β和r的曲线形状对但幅值明显异常。排查方法很简单在Step模块输出后面加一个gainpi/180的模块或者用deg2rad函数。反过来如果从模型里往Carsim或者后处理脚本传数据也要注意方向别把弧度又当成度。单位问题不只是角度侧偏刚度是N/rad力矩是N·m速度是m/s全部统一成国际单位制。别混着用km/h和m/s我见过有人把车速按km/h代入模型结果横摆角速度直接乱了套。4.3 仿真发散求解器和初值模型搭好以后用默认ode45可能跑着跑着出现NaN或者Inf。原因一般有两个一是代数环没有彻底消除导致数值震荡二是系统本身存在高频环节ode45这种变步长求解器在刚性问题上效率低甚至发散。解决方法先把求解器换成ode15s或者ode23t再设置最大步长上限比如Max Step Size设为0.001到0.01秒。二自由度模型本身是连续的线性系统不是真正的刚性问题但如果控制器环节加入了大量离散模块刚性问题就会冒出来。初值也要检查。积分器的初始状态设成零向量但如果你的输入信号在0时刻有跳变Simulink会在第一步尝试求初始代数解。此时控制器的初值也要和状态初值匹配否则第一步就发散。4.4 符号方向错整车模型原地起飞我调试过程中最崩溃的一次是模型输出完全发散怎么查都查不出问题最后发现k_f和k_r用的绝对值代入了B矩阵导致整个反馈极性反了。症状是β发散极快几秒钟内数值达到上万看起来就像整车“原地起飞”。符号自检表很重要项基准k_f、k_r均为负值B矩阵b₂₂b·k_r/I_zk_r为负所以b₂₂为负A矩阵a₂₁通常为负值侧偏角定义α_fβ(a/V)r-δ_f力矩平衡a·F_f - b·F_r前轴正力矩后轴负力矩这串符号如果全对2WS稳态横摆角速度就能对上解析值。哪怕有一个符号反了数值立刻崩溃。所以别偷懒这个表值得打印出来贴在显示器上。5. 从离线仿真到工程落地5.1 Carsim与Simulink联合仿真离线模型验证完成后下一步通常是把控制算法搬去和Carsim这种高保真车辆模型联调。做法是把Simulink模型里的车辆模型子系统替换成Carsim生成的S-Function模块。Carsim配置端口时要先选好输入输出变量比如输入用IMP_STEER_L1前轮转角、IMP_STEER_R1后轮转角输出用横摆角速度、质心侧偏角等。要注意Carsim版本和MATLAB版本要匹配编译环境也要配好我用过需要VS编译器的版本配不好Carsim S-Function会编译失败。联合仿真最大的价值是控制器是在二自由度模型上调的到Carsim里跑一遍能直接看出轮胎非线性、侧倾耦合这些被忽略因素对控制效果的影响这也是给领导汇报时最有力的材料。5.2 外部模式和C代码生成如果要把控制算法部署到快速原型控制器或者HIL设备上需要走代码生成这条路。Simulink模型经过Simulink Coder生成C代码再交叉编译到目标控制器。这一步要注意模型必须全部使用离散模块连续积分器要先离散化。在快速原型阶段可以用External模式跑外部仿真模型部署到上位机或者实时机上Simulink作为上位界面实时调参、观测信号。我调试LQR权重Q和R时就是通过外部模式在线调的比一遍遍离线仿真高效得多。不过外部模式对通信接口和板卡驱动有要求需要确认目标环境支持。控制器的采样周期要对齐离散化方法常用零阶保持器或者欧拉法。二自由度模型状态方程做离散化时采样周期取1ms到10ms都可以但我建议控制在1到5ms对底盘控制来说足够稳。最后分享一点个人体会我搭这个模型最大的体会是四轮转向控制器的难点不在建模本身而在符号约定和单位制。前者决定方向后者决定量级两个坑叠加起来足够浪费一整天。如果你第一次搭我强烈建议先把δ_r硬接成0把2WS模型跑通、稳态值核对完再接控制器扩展成4WS。一步到位只会让你分不清是公式错还是模块错。还有一点别信任何不核对就丢给你的整车参数哪怕是从论文里抄的。拿到参数第一件事是检查转向不足或过多转向特性用二自由度模型算一下稳态增益。多数看起来“跑不通”的问题根子都在参数上而不是模型上。这套模型搭好之后你可以继续往里面加的东西很多变车速工况、轮胎非线性修正、横摆角速度参考模型、侧偏角观测器、HIL硬件在环。二自由度模型就是一个很好的控制算法试验田把它的脾性摸熟了后面上Carsim、上实车都顺很多。