资讯动态

基于MATLAB/Simulink的四轮转向车辆建模与后轮转向控制仿真

发布时间:2026/9/16 23:54:07 来源:尧图企业网站定制
简介这套MATLAB Simulink四轮转向4WS仿真源码面向车辆工程与控制理论学习者聚焦后轮主动转向、横摆角速度与侧偏角响应等核心难题。压缩包共3个文件包含2个m脚本与1个slx模型脚本负责参数计算与绘图模型用于搭建转向系统传递函数仿真整体仅25KB轻便易用。已有811人学习适合希望快速上手四轮转向建模的工程师与在校生。运行模型可直观观察不同转向策略对车辆稳定性、转弯半径和响应时间的影响理解驾驶员输入到整车动态响应的传递关系附带脚本还能支持参数化设计与敏感性分析为控制器设计提供铺垫。尽管包体小巧却覆盖了车辆动力学、转向机构、轮胎模型及后轮转角控制的关键建模链路对入门四轮转向仿真研究具有较高参考价值。1. 四轮转向与后轮转向的MATLAB/Simulink建模先解决车辆动态耦合再谈控制四轮转向4WS与普通前轮转向最大的区别在于后轮不再只是从动轮而是可以主动输出转角。低速时后轮反向偏转缩短转弯半径高速时后轮同向小角度偏转让车身更快对准行驶方向同时把质心侧偏角压到接近零。MATLAB/Simulink是验证这套逻辑最常用的环境你不需要一开始就上Carsim或完整多体模型用二自由度车辆模型加状态空间就足以把4WS的核心失稳机制和控制问题暴露出来。这篇文章写给正在做底盘线控、车辆稳定性控制或者Simulink车辆仿真的人。你会看到从二自由度运动方程推导4WS状态矩阵、在State-Space模块里搭建车辆模型、用前馈加PI实现后轮转向控制以及用Bode图和线性化分析验证控制效果。整个流程可以照着搭出一套最小可用的4WS仿真环境之后再替换成Carsim联合仿真或更复杂的轮胎模型。搭建过程中最值得花时间的不是控制器的形式而是把后轮转角如何进入车辆状态方程这件事搞明白。2. 4WS整车模型搭建二自由度运动方程与Simulink状态空间实现2.1 二自由度4WS模型后轮转角如何进入状态方程做4WS仿真时通常先忽略垂向载荷转移和侧倾自由度只保留横向运动和横摆运动。假设纵向车速V恒定前轮转角δ_f和后轮转角δ_r作为系统输入那么车辆模型可以写成x_dot A x B uy C x D u其中状态x [β, γ]^Tβ是质心侧偏角γ是横摆角速度。输入u [δ_f, δ_r]^T。前后轮胎侧向力用线性侧偏刚度表示F_yf -C_f * (β l_f * γ / V - δ_f)F_yr -C_r * (β - l_r * γ / V - δ_r)注意后轮侧偏角表达式里的δ_r项是负的。原因是后轮转角会让后轴轮胎的运动方向发生偏移如果方向定义反了整个A矩阵的耦合项都会出错。把这两个力代入牛顿方程和横摆力矩方程m * V * (β_dot γ) F_yf F_yrI_z * γ_dot l_f * F_yf - l_r * F_yr整理后就能得到4WS的状态矩阵。这个推导过程最好自己手推一遍否则后面调控制参数时你很难判断是车辆模型反了还是控制器方向反了。2.2 用MATLAB脚本定义4WS参数矩阵先用脚本把参数和矩阵准备好Simulink的State-Space模块直接引用工作区变量这样改参数不需要打开模块对话框。% 二自由度4WS车辆模型参数定义 m 1520; % 整车质量 kg Iz 2549; % 横摆转动惯量 kg*m^2 lf 1.19; % 质心到前轴距离 m lr 1.55; % 质心到后轴距离 m Cf 61100; % 前轮侧偏刚度 N/rad取正值 Cr 59600; % 后轮侧偏刚度 N/rad V 20; % 纵向车速 m/s % 状态矩阵状态顺序为 [beta, gamma] A [-(CfCr)/(m*V), -1 - (Cf*lf-Cr*lr)/(m*V^2); -(Cf*lf-Cr*lr)/Iz, -(Cf*lf^2Cr*lr^2)/(Iz*V)]; % 输入矩阵输入顺序为 [delta_f, delta_r] B [Cf/(m*V), Cr/(m*V); Cf*lf/Iz, -Cr*lr/Iz]; C eye(2); % 输出 beta 和 gamma D zeros(2,2); % 无直接传递项A(1,1)代表侧向力对质心侧偏速度的阻尼A(2,2)是横摆阻尼项A(1,2)是横摆角速度对侧向加速度的耦合。B矩阵第二列的符号特别关键B(2,2)是负值因为后轮转角产生的横摆力矩方向和前轮相反。如果这里写成正值仿真的稳态横摆角速度会比2WS还大后面所有控制都会失去意义。2.3 在Simulink中用State-Space模块搭建4WS模型新建一个Simulink模型从Simulink/Continuous库拖入State-Space模块。双击模块在A、B、C、D参数里填入工作区变量名。输入端口有两个信号第一个是前轮转角第二个是后轮转角。输出端口根据C矩阵定义第一路是β第二路是γ。推荐按下面的方式组织信号模块库设置输入1 ConstantSimulink Sources前轮转角 δ_f单位 rad输入2 ConstantSimulink Sources后轮转角 δ_r单位 radState-SpaceSimulink ContinuousA、B、C、D 填工作区变量名DemuxSimulink Signal Routing拆分输出为 β 和 γScopeSimulink Sinks显示时域响应搭建好之后先做一个开环测试给δ_f一个0.05rad的阶跃δ_r设为0运行后横摆角速度应该慢慢上升并稳定随后给δ_r一个-0.02rad的阶跃横摆角速度稳态值会发生反向变化。如果方向不对优先检查B矩阵第二列的符号。这个开环测试虽然简单但能帮你把车辆模型的方向性确认清楚再进入闭环控制。3. 后轮转向控制策略零质心侧偏角与横摆角速度跟踪的Simulink实现3.1 为什么4WS控制要同时看质心侧偏角和横摆角速度普通2WS车辆在高速转向时质心侧偏角可能达到几度。驾驶员的主观感受是车头已经转了但车身还没有跟上。4WS的经典控制目标有两个一是让稳态质心侧偏角趋于零二是让横摆角速度快速跟踪参考值。这两个目标不能完全独立实现所以实际控制器通常是前馈加反馈结构。前馈部分负责跟随车速变化把后轮转角按照一个比例叠加到前轮转角上改善稳态增益。反馈部分负责抑制扰动和模型误差通常用横摆角速度误差做PI调节。只做前馈的4WS在轮胎磨损或路面附着变化时表现很差只做反馈则在低频大转角工况下容易饱和。3.2 稳态零侧偏角条件与前馈比例K的计算所谓前馈比例就是稳态工况下后轮转角与前轮转角的比值。利用第2章的二自由度方程在β0且γ_dot0的稳态条件下可以联立横向力方程和横摆力矩方程求解这个比值。用MATLAB符号工具可以直接算syms m V Cf Cr lf lr delta_f delta_r gamma % 横摆力矩方程在 beta0 时的形式 eq1 (Cf*lf^2 - Cr*lr^2)*gamma/V - (Cf*lf*delta_f Cr*lr*delta_r) 0; % 横向力方程在 beta0 时的形式 eq2 m*V*gamma - (Cf*delta_f Cr*delta_r (Cr*lr-Cf*lf)*gamma/V) 0; % 联立求解 gamma 和 delta_r再求比例 Sol solve([eq1 eq2], [gamma delta_r], ReturnConditions, true); Kff simplify(Sol.delta_r / delta_f);不同车速下算出来的Kff变化趋势是很有物理意义的低速时Kff为负后轮反向偏转作用是减小转弯半径高速时Kff逐渐趋近于零甚至变正后轮同向偏转作用是对抗过度转向。实际工程里不会在模型中放一个符号表达式而是把车速和Kff的对应关系做成Lookup Table因为执行器是非线性的还需要考虑悬架侧倾带来的参数变化。3.3 前馈加横摆角速度PI反馈的Simulink实现下面给出一个可以在MATLAB Function模块里直接用的控制器代码。它把前馈比例、PI反馈、限幅和抗积分饱和放在一起输出后轮转角指令。function delta_r_cmd controller(delta_f, gamma, v, Kff, Kp, Ki, Ts) % 4WS后轮转向控制器前馈 横摆角速度PI % 输入 % delta_f 前轮转角 rad % gamma 实际横摆角速度 rad/s % v 纵向车速 m/s % Kff 前馈比例 Lookup Table 输出 % Kp, Ki PI参数 % Ts 控制器采样周期 s persistent err_int if isempty(err_int) err_int 0; end % 参考横摆角速度按不足转向系数近似 L 2.74; % 轴距 m实际应从参数表读取 Kus 0.002; % 不足转向系数 s^2/m gamma_ref (v / (L Kus * v^2)) * delta_f; % 误差与积分 err gamma_ref - gamma; err_int err_int err * Ts; % 抗积分饱和限制积分项不超过后轮最大转角的一半 deltaMax 0.15; % 后轮最大转角 rad err_int max(-deltaMax / Ki, min(deltaMax / Ki, err_int)); % 反馈 前馈 delta_fb Kp * err Ki * err_int; delta_ff Kff * delta_f; % 总指令限幅 delta_r_cmd max(-deltaMax, min(deltaMax, delta_ff delta_fb)); endKp和Ki的整定没有固定公式一般先设Kp为0.5左右Ki为1.0左右然后观察阶跃响应。如果后轮转角频繁打到限幅就减小Kp或者把限幅值调小让控制器更依赖前馈信号。抗积分饱和这行代码不能省否则后轮执行器一旦饱和PI积分会持续累积造成退出饱和后的一段时间内控制量异常。3.4 用正弦转向输入对比4WS与2WS把前轮转角设成0.5Hz、幅值0.05rad的正弦信号后轮指令由控制器给出。跑完后把同样的前轮输入作用在只有前轮转向的模型上对比两者的质心侧偏角和横摆角速度。4WS的质心侧偏角幅值会明显小于2WS横摆角速度的相位滞后也会减小。这个对照实验是验证后轮转向控制逻辑是否生效的最快方式毕竟只看4WS单条曲线很难判断好坏。4. Simulink仿真配置与数据导出跑通4WS闭环模型的完整步骤4.1 用子系统封装整车与控制器闭环模型不要把所有模块堆在一个窗口里。建议划分成三个子系统Vehicle子系统包含State-Space车辆模型Controller子系统包含上面的MATLAB Function和参考横摆角速度计算Input子系统包含转向信号源和车速信号。这样批量仿真时直接改子系统里的参数即可信号连接关系也更清晰。子系统输入输出Input时间δ_f, vVehicleδ_f, δ_rβ, γControllerδ_f, γ, vδ_r为方便后续线性化分析在δ_f进入Controller和Vehicle的路径上分别标记信号线比如命名为delta_f_in和delta_f_fb这些标记后面会被线性化工具使用。4.2 求解器与代数环处理4WS闭环模型最常见的仿真错误是代数环。原因是δ_r由γ计算得到而γ的微分方程又依赖δ_r如果不做处理Simulink会报出“Algebraic loop”并拖慢仿真。最简单的解决办法是让控制器以离散方式工作把Controller子系统采样时间设为0.01sMATLAB Function内部的Ts设为0.01Simulink会自动插入一个隐式采样保持打破代数环。求解器设置推荐如下参数建议值说明Solverode45变量步长适合非线性模型调试Max step size0.001 s防止离散控制器和连续模型之间产生过大的插值误差Stop time10 s给足时间让横摆角速度进入稳态Save formatTimeseries方便后续提取数据和绘制曲线Data Logging勾选signals通过右键信号线菜单启用如果你打算做硬件在环或者代码生成就切换到固定步长离散求解器比如ode4步长与控制器采样周期一致这样仿真结果更接近真实代码行为。4.3 用脚本批量仿真不同车速并导出结果调参时总是一个一个改车速太慢。更常见的做法是用脚本循环跑不同工况把结果存到结构体里。例如需要对比10、15、20、25、30 m/s下的质心侧偏角可以在脚本里这样写% 批量仿真不同车速下的4WS响应 v_list [10 15 20 25 30]; result struct(v, {}, beta, {}, gamma, {}); for i 1:length(v_list) % 将车速变量写入模型中的Constant模块 set_param(m4ws_model/v_constant, Value, num2str(v_list(i))); % 执行仿真StopTime之后返回logsout simOut sim(m4ws_model, StopTime, 10); logsout simOut.get(logsout); % 取出 beta 和 gamma 信号数据 result(i).v v_list(i); result(i).beta logsout.get(beta).Values.Data; result(i).gamma logsout.get(gamma).Values.Data; end % 绘制不同车速下的质心侧偏角 figure; hold on; for i 1:length(v_list) t logsout.get(beta).Values.Time; plot(t, result(i).beta, DisplayName, sprintf(%d m/s, v_list(i))); end legend; grid on;使用set_param之前要确保对应Constant模块存在。如果你把车速直接定义在工作区变量并用Simulink的Parameter中引用也可以改成用assignin修改基础工作区变量。注意整个模型中的速度必须统一使用同一个变量否则控制器里的参考横摆角速度和车辆模型里的V不一致结果是完全不可用的。4.4 常见坑矩阵维度、单位换算和输出顺序State-Space模块报维度错误绝大多数是C矩阵写错了。如果你的模型只需要γ这一个输出C应该写成[0 1]而不是eye(2)。如果输出顺序不对后续与Scope的连线也会错。更隐蔽的问题是角度单位Sin模块默认输出弧度驾驶员模型如果给出的是方向盘转角需要先除以转向传动比再乘以pi/180变成前轮转角进入控制器。这个步骤在实车标定中经常被忽略仿真阶段一旦发现横摆角速度幅值与理论值差一个数量级先检查这里。5. 用线性化分析和Bode图验证4WS后轮转向控制效果再谈代码生成在时域上看过阶跃和正弦响应之后还需要从频域确认后轮转向到底改变了什么。Simulink Control Design里可以用linearize命令对闭环模型做工作点线性化。先给前轮转角和横摆角速度信号设置线性化输入输出点再执行% 定义线性化输入输出 io(1) linio(m4ws_model/delta_f, 1, input); io(2) linio(m4ws_model/Gamma, 1, output); % 线性化闭环系统 sys_4ws linearize(m4ws_model, io); % 对比2WS模型把Controller子系统的后轮指令置零后同样的输入输出点 sys_2ws linearize(m4ws_2ws_model, io); % 绘制Bode图 bode(sys_4ws, sys_2ws, {0.1, 100}); grid on;从Bode图上可以看到4WS系统的相位滞后在中频段明显小于2WS幅值响应也更平直。这就是后轮转向改善车辆横摆响应的频域证据。如果相位裕度不足可以在同一张图上观察开环传递函数的穿越频率然后调整PI参数。穿越频率没有必要选得很高对乘用车来说1到3Hz已经足够过高会让后轮执行器频繁动作噪声也会被放大。线性化确认之后模型就可以考虑生成C代码或接到外部环境。Controller子系统如果是离散的生成代码前要给Simulink Coder单独配置采样周期确保生成代码的定时器周期与Ts相同。后轮转向控制器在整车控制器中通常以固定周期任务运行比如100Hz因此Ts设0.01s比较合理。接着可以考虑用外部模式连到目标机做在环调试外部模式的特点是能在线修改PI参数和查看信号而无需每次都重新编译。如果信号要通过CAN总线传输务必在Simulink的CAN Pack模块中设置好字节序与缩放因子后轮转角的工程单位是弧度还是0.1度必须与车辆动力学模型保持一致否则在车上跑起来就是另一个方向的“仿真正确”但实际失效。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价