1.车辆纵向运动系统建模
1.1整车及轮胎动力学建模
本次仿真建立的模型分析基于以下的简化情形,即:
1忽略车轮及悬架形变作用,假设车身没有垂向运动;
2.假设车身俯仰角和侧倾角均为零;
3.忽略转向梯形对左、右车轮转角影响,假设左、右车轮转动角度相同。
在此基础上,可以分别作出对车身和轮胎的受力分析图,并列出车身与轮胎的动力学方程,受力分析如下图所示。
图1:轮胎的地面受力
其中Td为轮胎上的驱动力矩,Tb为制动力矩,Fx为轮胎所受纵向力,Iw为车轮转动惯量,r为车轮半径。
图2:整车受力分析
据此可知轮胎的动力学方程为:
(1)
或写成
(2)
而车身的动力学方程为:
考虑到车辆常处于爬坡状况,平地可视为特殊的爬坡状态,下面对车辆在一定坡度的道路上进行整车受力分析。
图3:坡道上车辆的受力分析
根据牛顿第二定律可知
(6)
其中Fxf、Fxr是左右轮的驱动力,大小为Td/reff。Rxf、Rxr是滚动阻力,Fxa是等效的纵向空气阻力。考虑
(7),
将方程(7)带入(6)后方程简化为:
(8)
又有车辆的纵向加速度可以写为
(9),
联立(8)、(9)两个式子可得轮胎的驱动力矩为:
(10)
由传动轴及发动机的力矩平衡方程:
(11)(12)
可以算出传动轴驱动转矩Tt和发动机净扭矩Tnet 为:
空气阻力与相对运动速度的平方成正比,忽略风速,有:
其中Je为 (17)
将(15)、(16)、(17)联立最后得到车辆加速度与发动机扭矩的关系为:
(18)
不考虑地面俯仰,即坡度为0,可得:
(19)
(20)
将(20)带入(17)中最终简化后得到动力学方程为:
(21)
2.车辆纵向滑模控制结构
2.1车辆纵向跟随队列结构
图4 车辆综向跟随队列结构
定义间距误差ϵ是与前一车辆的实际间距与期望的车辆间距之间的差异即:
,i=1,2… (22)
显然我们的最终控制目的为令误差趋于0。
2.2滑模系统设计
滑动模态为人为设定一经过平衡点的相轨迹,通过适当设计,系统状态点沿着此相轨迹渐近稳定到达平衡点,形象地称为滑向平衡点的一种运动,滑动模态的“滑动”二字即来源于此。
滑模系统设计的大体流程为
- 选择切换函数,或者说确定切换面
- 求取控制律
- 系统的稳定性分析
我们逐一对每个步骤进行设计。
2.2.1 切换函数的选取
令ei1=ϵi、ei2=ei1的导数,结合公式,可以整理出误差方程为:
(23)
设计切换函数为
Si=q1ei1+q2ei2 q1>0,q2>0 (24)
下面对其进行可达性的验证,即当 Si趋近于0时,可以解得ϵi也趋近于0,即可达性验证通过。
2.2.2求取控制率
一般求取控制率有两种方法
1.采用到达条件,求得控制律的一个不等式,需要在满足此不等式的条件下选择合适的控制律。
2.采用趋近律方法,可直接求取等式型控制律
常见的趋近率有:
我们在这里采取指数趋近率做为本次仿真的控制率。即:
(25)
对误差方程求导并于指数控制率进行联立,可得等效控制输入为:
(26)
引入反馈控制: (27),
得总控制率为:。 (28)
下面需要对所建立的模型进行可达性的分析,这里使用Lyapunov函数法,取函数为 (29)
对Vi求导并将总控制率带入可得
由此可知当Si大于0时,Si导数小于0,有减小的趋势,而当Si小于0时,Si的导数有增大的趋势,即Si始终有趋向0的趋势。即滑动模态渐进可达。
3.模型建立与仿真实现
a0为领头车辆的加速度
(30)
3.1指数控制率下的仿真结果
分别设置5辆车的质量、空气阻力相关的系数、常数项系数;设置期望间距;设置五辆车的初始位移、速度、加速度;设置指数趋近律前面的系数λ;设置切换函数前的系数,具体结果如下
当将车间初始距离加大可以发现切换函数和车间距误差依旧可以稳态渐进趋近于0,但所需的初始控制输入也变得十分大,难以实现,故实际纵车队初始间距不会过大,同时初速度也不宜过大。
3.2采用准滑模控制
除控制律外其他基本参数与指数控制率的保持一致。
准滑模控制也能很好的满足可达性和稳定性,但与指数控制率的相比,控制输入稳定所需时间明显更长,说明使用准滑模控制的效果在此场景不如指数控制律。
3.3采用等速趋近率控制
除控制律外其他基本参数与指数控制率的保持一致。
可以明显观察到,使用等速趋近率控制的话,抖振现象十分明显,切换函数和控制输入都无法稳定渐进趋近于0,而是以非常剧烈的强度在0附近波动,效果不如上述两个控制律。
4.仿真程序
4.1指数控制
q1=2; q2=1;
lan=0.5;
l1=12;l2=12;l3=12;l4=12;l5=12;
m1=1000; c1=0.5; f1=200;
m2=1000; c2=0.5; f2=200;
m3=1000; c3=0.5; f3=200;
m4=1000; c4=0.5; f4=200;
m5=1000; c5=0.5; f5=200;
t=[0:0.1:30];
for n=1:40
a0(n)=0;
end
for n=41:70
a0(n)=-0.25*(t(n)-4);
end
for n=71:100
a0(n)=-0.75;
end
for n=101:160
a0(n)=0.25*(t(n)-10)-0.75;
end
for n=161:190
a0(n)=0.75;
end
for n=191:220
a0(n)=0.25*(19-t(n))+0.75;
end
for n=221:301
a0(n)=0;
end
x0(1)=120;x1(1)=110;x2(1)=99.5;x3(1)=78.5;x4(1)=47;x5(1)=26;
v0(1)=30;v1(1)=28;v2(1)=26;v3(1)=23;v4(1)=20;v5(1)=18;
a1(1)=0;a2(1)=0;a3(1)=0;a4(1)=0;a(5)=0;
e11(1)=x1(1)-x0(1)+l1;
e21(1)=x2(1)-x1(1)+l2;
e31(1)=x3(1)-x2(1)+l3;
e41(1)=x4(1)-x3(1)+l4;
e51(1)=x5(1)-x4(1)+l5;
e12=v1(1)-v0(1);
e22=v2(1)-v1(1);
e32=v3(1)-v2(1);
e42=v4(1)-v3(1);
e52=v5(1)-v3(1);
s1(1)=q1* e11(1)+q2* e12;
s2(1)=q1* e21(1)+q2* e22;
s3(1)=q1* e31(1)+q2* e32;
s4(1)=q1* e41(1)+q2* e42;
s5(1)=q1* e51(1)+q2* e52;
for n=2:301
v0(n)=v0(n-1)+0.1*(a0(n)+a0(n-1))*0.5;
x0(n)=x0(n-1)+0.1*(v0(n)+v0(n-1))*0.5;
e11(n)=x1(n-1)-x0(n-1)+l1;
e12=v1(n-1)-v0(n-1);
s1(n)=q1* e11(n)+q2* e12;
u1equ=c1*(e12+v0(n))^2-m1*q1*e12/q2+m1*a0(n)+f1;
u1n=-m1*lan*s1(n)/q2;
u1(n)=u1equ+ u1n;
a1(n)=(-c1*v1(n-1)*v1(n-1)+u1(n)-f1)/m1;
v1(n)=v1(n-1)+0.1*(a1(n)+a1(n-1))*0.5;
x1(n)=x1(n-1)+0.1*(v1(n)+v1(n-1))*0.5;
e21(n)=x2(n-1)-x1(n-1)+l2;
e22=v2(n-1)-v1(n-1);
s2(n)=q1* e21(n)+q2* e22;
u2equ=c2*(e22+v1(n))^2-m2*q1*e22/q2+m2*a1(n)+f2;
u2n=-m2*lan*s2(n)/q2;
u2(n)=u2equ+ u2n;
a2(n)=(-c2*v2(n-1)*v2(n-1)+u2(n)-f2)/m2;
v2(n)=v2(n-1)+0.1*(a2(n)+a2(n-1))*0.5;
x2(n)=x2(n-1)+0.1*(v2(n)+v2(n-1))*0.5;
e31(n)=x3(n-1)-x2(n-1)+l3;
e32=v3(n-1)-v2(n-1);
s3(n)=q1* e31(n)+q2* e32;
u3equ=c3*(e32+v2(n))^2-m3*q1*e32/q2+m3*a2(n)+f3;
u3n=-m3*lan*s3(n)/q2;
u3(n)=u3equ+u3n;
a3(n)=(-c3*v3(n-1)*v3(n-1)+u3(n)-f3)/m3;
v3(n)=v3(n-1)+0.1*(a3(n)+a3(n-1))*0.5;
x3(n)=x3(n-1)+0.1*(v3(n)+v3(n-1))*0.5;
e41(n)=x4(n-1)-x3(n-1)+l4;
e42=v4(n-1)-v3(n-1);
s4(n)=q1* e41(n)+q2* e42;
u4equ=c4*(e42+v3(n))^2-m4*q1*e42/q2+m4*a3(n)+f4;
u4n=-m4*lan*s4(n)/q2;
u4(n)=u4equ+u4n;
a4(n)=(-c4*v4(n-1)*v4(n-1)+u4(n)-f4)/m4;
v4(n)=v4(n-1)+0.1*(a4(n)+a4(n-1))*0.5;
x4(n)=x4(n-1)+0.1*(v4(n)+v4(n-1))*0.5;
e51(n)=x5(n-1)-x4(n-1)+l5;
e52=v5(n-1)-v4(n-1);
s5(n)=q1* e51(n)+q2* e52;
u5equ=c5*(e52+v4(n))^2-m5*q1*e52/q2+m5*a4(n)+f5;
u5n=-m5*lan*s5(n)/q2;
u5(n)=u5equ+u5n;
a5(n)=(-c5*v5(n-1)*v5(n-1)+u5(n)-f5)/m5;
v5(n)=v5(n-1)+0.1*(a5(n)+a5(n-1))*0.5;
x5(n)=x5(n-1)+0.1*(v5(n)+v5(n-1))*0.5;
end
subplot(2,2,4); plot(t,e11,t,e21,t,e31,t,e41,t,e42,t,e52); xlabel('Time (s)'); ylabel('车间距误差 (m)');
subplot(2,2,1); plot(t,s1,t,s2,t,s3,t,s4,t,s5); xlabel('Time (s)'); ylabel('切换函数');
subplot(2,2,2); plot(t,u1,t,u2,t,u3,t,u4,t,u5); xlabel('Time (s)'); ylabel('控制输入 (N)');
4.2准滑模控制
q1=2; q2=1;
lan=0.5;
l1=12;l2=12;l3=12;l4=12;l5=12;
m1=1000; c1=0.5; f1=200;
m2=1000; c2=0.5; f2=200;
m3=1000; c3=0.5; f3=200;
m4=1000; c4=0.5; f4=200;
m5=1000; c5=0.5; f5=200;
t=[0:0.1:30];
for n=1:40
a0(n)=0;
end
for n=41:70
a0(n)=-0.25*(t(n)-4);
end
for n=71:100
a0(n)=-0.75;
end
for n=101:160
a0(n)=0.25*(t(n)-10)-0.75;
end
for n=161:190
a0(n)=0.75;
end
for n=191:220
a0(n)=0.25*(19-t(n))+0.75;
end
for n=221:301
a0(n)=0;
end
x0(1)=120;x1(1)=110;x2(1)=99.5;x3(1)=78.5;x4(1)=47;x5(1)=26;
v0(1)=30;v1(1)=28;v2(1)=26;v3(1)=23;v4(1)=20;v5(1)=18;
a1(1)=0;a2(1)=0;a3(1)=0;a4(1)=0;a(5)=0;
e11(1)=x1(1)-x0(1)+l1;
e21(1)=x2(1)-x1(1)+l2;
e31(1)=x3(1)-x2(1)+l3;
e41(1)=x4(1)-x3(1)+l4;
e51(1)=x5(1)-x4(1)+l5;
e12=v1(1)-v0(1);
e22=v2(1)-v1(1);
e32=v3(1)-v2(1);
e42=v4(1)-v3(1);
e52=v5(1)-v3(1);
s1(1)=q1* e11(1)+q2* e12;
s2(1)=q1* e21(1)+q2* e22;
s3(1)=q1* e31(1)+q2* e32;
s4(1)=q1* e41(1)+q2* e42;
s5(1)=q1* e51(1)+q2* e52;
for n=2:301
v0(n)=v0(n-1)+0.1*(a0(n)+a0(n-1))*0.5;
x0(n)=x0(n-1)+0.1*(v0(n)+v0(n-1))*0.5;
e11(n)=x1(n-1)-x0(n-1)+l1;
e12=v1(n-1)-v0(n-1);
s1(n)=q1* e11(n)+q2* e12;
u1equ=c1*(e12+v0(n))^2-m1*q1*e12/q2+m1*a0(n)+f1;
u1n=-m1*ep*sat(s1(n))/q2;
u1(n)=u1equ+ u1n;
a1(n)=(-c1*v1(n-1)*v1(n-1)+u1(n)-f1)/m1;
v1(n)=v1(n-1)+0.1*(a1(n)+a1(n-1))*0.5;
x1(n)=x1(n-1)+0.1*(v1(n)+v1(n-1))*0.5;
e21(n)=x2(n-1)-x1(n-1)+l2;
e22=v2(n-1)-v1(n-1);
s2(n)=q1* e21(n)+q2* e22;
u2equ=c2*(e22+v1(n))^2-m2*q1*e22/q2+m2*a1(n)+f2;
u2n=-m2*ep*sat(s2(n))/q2;
u2(n)=u2equ+ u2n;
a2(n)=(-c2*v2(n-1)*v2(n-1)+u2(n)-f2)/m2;
v2(n)=v2(n-1)+0.1*(a2(n)+a2(n-1))*0.5;
x2(n)=x2(n-1)+0.1*(v2(n)+v2(n-1))*0.5;
e31(n)=x3(n-1)-x2(n-1)+l3;
e32=v3(n-1)-v2(n-1);
s3(n)=q1* e31(n)+q2* e32;
u3equ=c3*(e32+v2(n))^2-m3*q1*e32/q2+m3*a2(n)+f3;
u3n=-m3*ep*sat(s3(n))/q2;
u3(n)=u3equ+u3n;
a3(n)=(-c3*v3(n-1)*v3(n-1)+u3(n)-f3)/m3;
v3(n)=v3(n-1)+0.1*(a3(n)+a3(n-1))*0.5;
x3(n)=x3(n-1)+0.1*(v3(n)+v3(n-1))*0.5;
e41(n)=x4(n-1)-x3(n-1)+l4;
e42=v4(n-1)-v3(n-1);
s4(n)=q1* e41(n)+q2* e42;
u4equ=c4*(e42+v3(n))^2-m4*q1*e42/q2+m4*a3(n)+f4;
u4n=-m4*ep*sat(s4(n))/q2;
u4(n)=u4equ+u4n;
a4(n)=(-c4*v4(n-1)*v4(n-1)+u4(n)-f4)/m4;
v4(n)=v4(n-1)+0.1*(a4(n)+a4(n-1))*0.5;
x4(n)=x4(n-1)+0.1*(v4(n)+v4(n-1))*0.5;
e51(n)=x5(n-1)-x4(n-1)+l5;
e52=v5(n-1)-v4(n-1);
s5(n)=q1* e51(n)+q2* e52;
u5equ=c5*(e52+v4(n))^2-m5*q1*e52/q2+m5*a4(n)+f5;
u5n=-m5*lan*s5(n)/q2;
u5(n)=u5equ+u5n;
a5(n)=(-c5*v5(n-1)*v5(n-1)+u5(n)-f5)/m5;
v5(n)=v5(n-1)+0.1*(a5(n)+a5(n-1))*0.5;
x5(n)=x5(n-1)+0.1*(v5(n)+v5(n-1))*0.5;
end
subplot(2,2,4); plot(t,e11,t,e21,t,e31,t,e41,t,e51); xlabel('Time (s)'); ylabel('车间据误差 (m)');
subplot(2,2,1); plot(t,s1,t,s2,t,s3,t,s4,t,s5); xlabel('Time (s)'); ylabel('切换函数');
subplot(2,2,2); plot(t,u1,t,u2,t,u3,t,u4,t,u5); xlabel('Time (s)'); ylabel('控制输入 (N)');
4.3等速趋近率控制
q1=2; q2=1;
lan=0.5;
l1=12;l2=12;l3=12;l4=12;l5=12;
m1=1000; c1=0.5; f1=200;
m2=1000; c2=0.5; f2=200;
m3=1000; c3=0.5; f3=200;
m4=1000; c4=0.5; f4=200;
m5=1000; c5=0.5; f5=200;
t=[0:0.1:30];
for n=1:40
a0(n)=0;
end
for n=41:70
a0(n)=-0.25*(t(n)-4);
end
for n=71:100
a0(n)=-0.75;
end
for n=101:160
a0(n)=0.25*(t(n)-10)-0.75;
end
for n=161:190
a0(n)=0.75;
end
for n=191:220
a0(n)=0.25*(19-t(n))+0.75;
end
for n=221:301
a0(n)=0;
end
x0(1)=120;x1(1)=110;x2(1)=99.5;x3(1)=78.5;x4(1)=47;x5(1)=26;
v0(1)=30;v1(1)=28;v2(1)=26;v3(1)=23;v4(1)=20;v5(1)=18;
a1(1)=0;a2(1)=0;a3(1)=0;a4(1)=0;a(5)=0;
e11(1)=x1(1)-x0(1)+l1;
e21(1)=x2(1)-x1(1)+l2;
e31(1)=x3(1)-x2(1)+l3;
e41(1)=x4(1)-x3(1)+l4;
e51(1)=x5(1)-x4(1)+l5;
e12=v1(1)-v0(1);
e22=v2(1)-v1(1);
e32=v3(1)-v2(1);
e42=v4(1)-v3(1);
e52=v5(1)-v3(1);
s1(1)=q1* e11(1)+q2* e12;
s2(1)=q1* e21(1)+q2* e22;
s3(1)=q1* e31(1)+q2* e32;
s4(1)=q1* e41(1)+q2* e42;
s5(1)=q1* e51(1)+q2* e52;
for n=2:301
v0(n)=v0(n-1)+0.1*(a0(n)+a0(n-1))*0.5;
x0(n)=x0(n-1)+0.1*(v0(n)+v0(n-1))*0.5;
e11(n)=x1(n-1)-x0(n-1)+l1;
e12=v1(n-1)-v0(n-1);
s1(n)=q1* e11(n)+q2* e12;
u1equ=c1*(e12+v0(n))^2-m1*q1*e12/q2+m1*a0(n)+f1;
u1n=-m1*ep*sign(s1(n))/q2;
u1(n)=u1equ+ u1n;
a1(n)=(-c1*v1(n-1)*v1(n-1)+u1(n)-f1)/m1;
v1(n)=v1(n-1)+0.1*(a1(n)+a1(n-1))*0.5;
x1(n)=x1(n-1)+0.1*(v1(n)+v1(n-1))*0.5;
e21(n)=x2(n-1)-x1(n-1)+l2;
e22=v2(n-1)-v1(n-1);
s2(n)=q1* e21(n)+q2* e22;
u2equ=c2*(e22+v1(n))^2-m2*q1*e22/q2+m2*a1(n)+f2;
u2n=-m2*ep*sign(s2(n))/q2;
u2(n)=u2equ+ u2n;
a2(n)=(-c2*v2(n-1)*v2(n-1)+u2(n)-f2)/m2;
v2(n)=v2(n-1)+0.1*(a2(n)+a2(n-1))*0.5;
x2(n)=x2(n-1)+0.1*(v2(n)+v2(n-1))*0.5;
e31(n)=x3(n-1)-x2(n-1)+l3;
e32=v3(n-1)-v2(n-1);
s3(n)=q1* e31(n)+q2* e32;
u3equ=c3*(e32+v2(n))^2-m3*q1*e32/q2+m3*a2(n)+f3;
u3n=-m3*ep*sign(s3(n))/q2;
u3(n)=u3equ+u3n;
a3(n)=(-c3*v3(n-1)*v3(n-1)+u3(n)-f3)/m3;
v3(n)=v3(n-1)+0.1*(a3(n)+a3(n-1))*0.5;
x3(n)=x3(n-1)+0.1*(v3(n)+v3(n-1))*0.5;
e41(n)=x4(n-1)-x3(n-1)+l4;
e42=v4(n-1)-v3(n-1);
s4(n)=q1* e41(n)+q2* e42;
u4equ=c4*(e42+v3(n))^2-m4*q1*e42/q2+m4*a3(n)+f4;
u4n=-m4*ep*sign(s4(n))/q2;
u4(n)=u4equ+u4n;
a4(n)=(-c4*v4(n-1)*v4(n-1)+u4(n)-f4)/m4;
v4(n)=v4(n-1)+0.1*(a4(n)+a4(n-1))*0.5;
x4(n)=x4(n-1)+0.1*(v4(n)+v4(n-1))*0.5;
e51(n)=x5(n-1)-x4(n-1)+l5;
e52=v5(n-1)-v4(n-1);
s5(n)=q1* e51(n)+q2* e52;
u5equ=c5*(e52+v4(n))^2-m5*q1*e52/q2+m5*a4(n)+f5;
u5n=-m5*lan*s5(n)/q2;
u5(n)=u5equ+u5n;
a5(n)=(-c5*v5(n-1)*v5(n-1)+u5(n)-f5)/m5;
v5(n)=v5(n-1)+0.1*(a5(n)+a5(n-1))*0.5;
x5(n)=x5(n-1)+0.1*(v5(n)+v5(n-1))*0.5;
end
subplot(2,2,4); plot(t,e11,t,e21,t,e31,t,e41,t,e51); xlabel('Time (s)'); ylabel('车间据误差 (m)');
subplot(2,2,1); plot(t,s1,t,s2,t,s3,t,s4,t,s5); xlabel('Time (s)'); ylabel('切换函数');
subplot(2,2,2); plot(t,u1,t,u2,t,u3,t,u4,t,u5); xlabel('Time (s)'); ylabel('控制输入 (N)');