简介:这套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 u
y = 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_yr
I_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 = [-(Cf+Cr)/(m*V), -1 - (Cf*lf-Cr*lr)/(m*V^2); -(Cf*lf-Cr*lr)/Iz, -(Cf*lf^2+Cr*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 Constant | Simulink Sources | 前轮转角 δ_f,单位 rad |
| 输入2 Constant | Simulink Sources | 后轮转角 δ_r,单位 rad |
| State-Space | Simulink Continuous | A、B、C、D 填工作区变量名 |
| Demux | Simulink Signal Routing | 拆分输出为 β 和 γ |
| Scope | Simulink Sinks | 显示时域响应 |
搭建好之后,先做一个开环测试:给δ_f一个0.05rad的阶跃,δ_r设为0,运行后横摆角速度应该慢慢上升并稳定;随后给δ_r一个-0.02rad的阶跃,横摆角速度稳态值会发生反向变化。如果方向不对,优先检查B矩阵第二列的符号。这个开环测试虽然简单,但能帮你把车辆模型的方向性确认清楚,再进入闭环控制。
3. 后轮转向控制策略:零质心侧偏角与横摆角速度跟踪的Simulink实现
3.1 为什么4WS控制要同时看质心侧偏角和横摆角速度
普通2WS车辆在高速转向时,质心侧偏角可能达到几度。驾驶员的主观感受是车头已经转了,但车身还没有跟上。4WS的经典控制目标有两个:一是让稳态质心侧偏角趋于零,二是让横摆角速度快速跟踪参考值。这两个目标不能完全独立实现,所以实际控制器通常是前馈加反馈结构。
前馈部分负责跟随车速变化,把后轮转角按照一个比例叠加到前轮转角上,改善稳态增益。反馈部分负责抑制扰动和模型误差,通常用横摆角速度误差做PI调节。只做前馈的4WS在轮胎磨损或路面附着变化时表现很差,只做反馈则在低频大转角工况下容易饱和。
3.2 稳态零侧偏角条件与前馈比例K的计算
所谓前馈比例,就是稳态工况下后轮转角与前轮转角的比值。利用第2章的二自由度方程,在β=0且γ_dot=0的稳态条件下,可以联立横向力方程和横摆力矩方程求解这个比值。用MATLAB符号工具可以直接算:
syms m V Cf Cr lf lr delta_f delta_r gamma % 横摆力矩方程在 beta=0 时的形式 eq1 = (Cf*lf^2 - Cr*lr^2)*gamma/V - (Cf*lf*delta_f + Cr*lr*delta_r) == 0; % 横向力方程在 beta=0 时的形式 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, v |
| Vehicle | δ_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.01s,MATLAB Function内部的Ts设为0.01,Simulink会自动插入一个隐式采样保持,打破代数环。
求解器设置推荐如下:
| 参数 | 建议值 | 说明 |
|---|---|---|
| Solver | ode45 | 变量步长,适合非线性模型调试 |
| Max step size | 0.001 s | 防止离散控制器和连续模型之间产生过大的插值误差 |
| Stop time | 10 s | 给足时间让横摆角速度进入稳态 |
| Save format | Timeseries | 方便后续提取数据和绘制曲线 |
| 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度,必须与车辆动力学模型保持一致,否则在车上跑起来就是另一个方向的“仿真正确”但实际失效。
本文还有配套的精品资源,点击获取