在先前的仿真代码中,一般采用以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;