代码详解——Simulink中的运动学模型

2020-09-01 15:55:31 浏览数 (3)

在先前的仿真代码中,一般采用以dsolve函数求解车辆运动学微分方程的方式作为被控的车辆模型,形如:

代码语言:javascript复制
Xref=dsolve('Dx-v_actual*cos(z)=0','Dy-v_actual*sin(z)=0','Dz-v_actual*tan(deltaf_actual)/l=0','x(0)=X00(1)','y(0)=X00(2)','z(0)=X00(3)');
    t=T;
    %%更新车辆位置
    State_Initial(1,1)=eval(Xref.x);
    State_Initial(2,1)=eval(Xref.y);
    State_Initial(3,1)=eval(Xref.z);

但是由于dsolve函数的求解功能有限,当微分方程更加复杂时,可能无法获得数值解。

所以也有同行采用经欧拉法或四阶龙格库塔法离散化后的运动学、动力学模型作为被控的车辆模型进行仿真。不过上述离散方法均会降低模型精度,造成仿真结果失真。而且当采用动力学模型时,模型较为复杂,采用离散模型进行迭代需要很大的代码量,在编写程序时容易出现错误,影响工作效率。

通过Simulink建模可以避免上述问题。

通过Simulink建模有两种方式,一种是通过组合模块,下图所示即车辆运动学模型:

不过当模型更加复杂时,这种建模方法也不太适用。

另一种建模方式是采用MATLAB Function模块,如图所示:

fcn中的代码为:

代码语言:javascript复制
function y = fcn(theta,vx,delta)
l=2.7;
dx=vx*cos(theta);
dy=vx*sin(theta);
dtheta=vx*tan(delta)/l;
u=[ dtheta;
    dx;
    dy;];
y=u;

1 人点赞