近日使用 Simulink-Carsim 联合仿真做横摆力矩控制,因为用到了一个滑模观测器对车辆侧偏角进行观测,需要在 simulink 中搭建一个微分方程模块,长期使用脚本编程,不太习惯复杂冗长的 s-function,于是使用 matlab function 搭建微分方程模块。
首先给出滑模观测器(Sliding Mode Observer SMO)的表达式:
{ β ^ ˙ = A 11 β ^ + A 12 γ ^ + B 1 u + k 1 k 2 sign ( γ ~ ) + k 3 a ~ y γ ^ ˙ = A 21 β ^ + A 22 γ ^ + B 2 u + k 1 sign ( γ ~ ) + k 4 a ~ y a ^ y = C 21 β ^ + C 22 γ ^ + E 2 u \left\{\begin{array}{l} \dot{\hat{\beta}}=A_{11} \hat{\beta}+A_{12} \hat{\gamma}+B_{1} u+k_{1} k_{2} \operatorname{sign}(\tilde{\gamma})+k_{3} \tilde{a}_{y} \\ \dot{\hat{\gamma}}=A_{21} \hat{\beta}+A_{22} \hat{\gamma}+B_{2} u+k_{1} \operatorname{sign}(\tilde{\gamma})+k_{4} \tilde{a}_{y} \\ \hat{a}_{y}=C_{21} \hat{\beta}+C_{22} \hat{\gamma}+E_{2} u \end{array}\right.⎩⎪⎨⎪⎧β^˙=A11β^+A12γ^+B1u+k1k2sign(γ~)+k3a~yγ^˙=A21β^+A22γ^+B2u+k1sign(γ~)+k4a~ya^y=C21β^+C22γ^+E2u
公式具体系数按下不表,读者可以参考 Active Front Steering-based Electronic Stability Control for Steer-by-Wire Vehicles via Terminal Sliding Mode and Extreme Learning Machine。
simulink 设置为 ode3 求解器,固定步长 0.001 s 0.001s0.001s,搭建 simulink 模块如下图所示:
主要的思路是使用一个 Memory 模块来记录系统变量前一时刻值,需要注意的是,每个 Memory 都需要填入初始值后使用。
具体函数 matlab function 定义如下:
function [betahat,rhat,ayhat] = fcn(beta,deltaf,r,ay,betahat,rhat,ayhat)
% This is the function of SMO
% Xhat the inner variable for SMO
% ay the lateral acceleration
% r the yaw rate γ
% beta the vehicle slideslip angle
% deltaf the driver's steer command
% ayhat the observed value for ay
% rhat the observerd value for γ
% betahat the observerd value for β
% hu 2020-11-13
% hu 2020-11-14 tested a set of parameters
%--- Vehicle contants give here ---
lf = 1.016;
lr = 1.562;
Cf = 57000;
Cr = 68000;
m = 1274;
Vx = 15;
Iz = 1523;
A11 = -2 * (Cf + Cr) / (m * Vx);
A12 = 2 * (Cr * lr - Cf * lf) / (m * Vx^2) - 1;
A21 = 2 * (Cr * lr - Cf * lf) / Iz;
A22 = -2 * (lf^2 * Cf + lr^2 * Cr) / (Iz * Vx);
B1 = 2 * Cf / (m * Vx);
B2 = 2 * lf * Cf / Iz;
C21 = Vx * A11;
C22 = Vx * (A12 + 1);
E2 = Vx * B1;
h = .001;
k1 = 7;
k2 = .4;
k3 = .3;
k4 = 10;
delta = .1; % boundary layer .3
sat = @(s)(s >= delta) * sign(s) + (s < delta) * (s / delta); % sat function def.
u = deltaf;
e = [beta - betahat;r - rhat;ay - ayhat];
%--- Main loop ---
betahatdot = A11 * betahat + A12 * rhat + B1 * u + k1 * k2 * sat(e(2)) + k3 * e(3);
betahat = betahat + betahatdot * h;
rhatdot = A21 * betahat + A22 * rhat + B2 * u + k1 * sat(e(2)) + k4 * e(3);
rhat = rhat + rhatdot * h;
ayhat = C21 * betahat + C22 * rhat + E2 * u;