基于模糊控制和PID控制自主车辆速度跟踪控制含MATLAB仿真程序Word格式.docx
《基于模糊控制和PID控制自主车辆速度跟踪控制含MATLAB仿真程序Word格式.docx》由会员分享,可在线阅读,更多相关《基于模糊控制和PID控制自主车辆速度跟踪控制含MATLAB仿真程序Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
ZO
P3
PS
P4
PM
P5
PB
P6
设置模糊规则库如下表:
表2:
模糊规则表
U
E
EC
—
NS*
3。
模糊推理
由模糊规则表3可以知道输入E与EC和输出U的模糊关系,这里我取两个例子做模糊推理如下:
if(EisNB)and(ECisNM)then(UisPB)
那么他的模糊关系子矩阵为:
其中,
,即表1中NB对应行向量,同理可以得到,
if(EisNBorNM)and(ECisNB)then(UisPB)
结果略。
按此法可得到27个关系子矩阵,对所有子矩阵取并集得到模糊关系矩阵如下:
由R可以得到模拟量输出为:
4。
去模糊化
由上面得到的模拟量输出为1×
7的模糊向量,每一行的行元素(u(zij))对应相应的离散变量zj,则可通过加权平均法公式解模糊:
从而得到实际刹车控制量的精确值u。
油门控制:
油门控制采用增量式PID控制,即:
其中ki=kp×
ts/Ti,
=kp×
Td/ts只需要设置
、Ti、Td三个参数即可输出油门控制量。
二、调整参数
按照上述算法流程,应用MATLAB进行仿真实现,在参数调试过程中采用如下方法:
首先将油门和刹车分开进行调整参数,最后再将调整好的参数写入总程序中调整。
1.油门PID参数调节
油门只需要调整kp、Ti、Td三个参数,根据经验,首先令Ti、Td为0,kp由0逐渐增大,在增大kp的过程可知,kp越大系统调节时间越短并趋于稳定,在达到一定程度后,继续增大系统将出现波动。
kp=0.1kp=0.4
kp=0.9
调节Ti的过程发现,Ti对系统稳定性影响并不大,将Ti由10增大到30的过程中系统输出没有变化。
Ti=10Ti=30
在给Td赋值时,最开始从1增大,发现系统越来越不稳定,于是逐渐减小,到0.003时趋于稳定,它的可调节范围很小,随其值的减小最大误差值逐渐减小,增大则系统趋于不稳定。
kp=0.001kp=0。
002
kp=0.003
2。
刹车调节
首先,为了适应该系统,将刹车输出量限制在[-150,150]之内(最初设计其范围为[-30,30]),对于该控制,可调节参数较多,包括隶属度函数、模糊规则表、输入输出变量区间、语言值论域、模糊推理及解模糊方法等等,这里由于模糊规则需要经验设定,本算法没有实际参考,所以这里只调整规则表,其他参数固定不变。
以下为最初设计的模糊规则表:
由于实际刹车控制中对于加速采取比较单一的置零(在选择规则中设定)输出,所以在规则表中e〈0部分没有规则,然而为了仿真方便,使参数调节更清晰,重新定义模糊规则表如下:
与此同时,将刹车的输出变量取反,以此来实现减速的效果!
在调整模糊规则表的时候,必须依据输入变量e和ec的范围逐个检验,按照他们各自的语言值以及相应的输出语言值进行调整。
例如,初始速度为50,期望速度为0,即e=-50,ec=-50,则此时输出对应模糊规则表中第一行第一列PB,而下一时刻ec几乎为0,所以在调节过程中,主要进行对EC变量的ZO行进行调节,若响应时间短,则增大相应输出语言值,反之亦然.
仿真时,分两段,首先加速,之后减速,采用上面的模糊规则表,得到如下图像:
从图像的上升阶段分析可以看出,其加速阶段并不能达到稳态值,但对于刹车控制可以忽略其影响,而减速阶段实际上已经比较理想,我取稳态误差达到5%稳定,则此规则达到稳态的时间为7。
4s,这里尝试进行如下修改,将规则表中带下划线的部分以此改为:
PM,PS,PS,ZO,即,增大了输出语言值。
则得到如下图像:
此规则达到稳定的时间为6.9s,由此分析模糊规则的调整规则如下:
若想加快响应时间,增大误差和误差变化率负大区域附近的输出语言值,并增大误差变化率零区域附近的输出语言值,可能还会引起超调量的增大,所以只需做临近语言值之间的变化。
3.整体调节
此时将刹车与油门同时加到仿真模型中,分别做加速和减速仿真,依据分别调节时的规律做微量调节就可以基本达到要求。
待解决问题
在调试过程中发现,油门控制(PID)过程在达到稳态时出现抖动,并且三个参数对他的影响很小,具体原因待考证;
油门控制给系统的输入值出现大波动,每一次达到峰值持续相同时间后变为0再持续一段时间又变为峰值;
模糊控制的语言值论域较小,对于扩大语言值论域对系统的影响还有待验证;
模糊控制的输入变量压缩方式有待验证其合理性;
模糊控制与PID控制的相互配合,在该程序中,由于两种控制的输出控制量不同,在给到仿真系统时很难统一;
油门与上车的选择规则与实际系统还存在很大的改进.
附录
MATLAB仿真程序
functionkk=bingji(A)
fori=1:
49
fork=1:
7
forj=1:
26
n=7*j+k;
if(A(i,k)>
=A(i,n))
kk(i,k)=A(i,k);
else
A(i,k)=A(i,n);
end
end
functiono=dikaer(A,n,B,N)
n
forj=1:
N
if(A(i)〈=B(j))
C(i,j)=A(i);
C(i,j)=B(j);
o=C;
return;
functionT=flisan(a,b,n,x)
y=(a+b)/2+(b—a)*x/(2*n);
T=round(y);
return;
functionmm=bell(x,a,b,c)
z=abs((x—c)/a)^(2b);
y=1/(1+z);
mm=y;
return;
functionooo=jbing(A,B)
fori=1:
if(A(i,j)〈B(i,j))
A(i,j)=B(i,j);
ooo=A;
functionMM=jdikaer(A,n,B,m)
fori=1:
m
if(A(j)<
B(j,i))
B(j,i)=A(j);
MM=B;
functionoo=jiao(A,B)
fori=1:
if(A(i,j)>
B(i,j))
A(i,j)=B(i,j);
oo=A;
functionmm=lbell(x,a,b,c)
if(x〈c)
mm=1;
else
z=(x-c)/a;
v=abs(z);
n=v^(2*b);
y=1/(1+n);
functionL=lisan(a,b,n,x)
y=2*n*x/(b—a)—n*(a+b)/(b-a);
L=y;
functionUU=max(A)
if(A(j,i)〉=Q(i))
Q(i)=A(i,j);
UU=Q;
functionsum1=mean(U)
a=[—3-2-10123];
sum2=0;
sum3=0;
sum2=sum2+U(i);
sum3=sum3+U(i)*a(i);
sum1=sum3/sum2;
functionmm=rbell(x,a,b,c)
if(x〉c)
mm=1;
z=(x-c)/a;
y=1/(1+n);
mm=y;
functionmww=trig(x,a,b,c)
if(x〈=a)
mww=0;
else
if(x>
a&
&
x<
=b)
mww=(x-a)/(b-a);
if(x〉b&&x〈=c)
mww=(c—x)/(c—b);
c)
functionooo=xbing(A,B)
if(A(i)〈B(i))
A(i)=B(i);
clearall
%************************Ä
£
º
ý
Ë
ã
·
¨
%/*********Á
¥
Ê
ô
¶
È
Ï
ò
Á
¿
*****%
P0=[1,0。
5,0,0,0,0,0];
%*********NB
P1=[0,1,0。
5,0,0,0,0];
%*********NM
P2=[0,0.5,1,0。
5,0,0,0];
%*********NS
P3=[0,0,0.5,1,0.5,0,0];
%*********ZO
P4=[0,0,0,0.5,1,0.5,0];
%*********PS
P5=[0,0,0,0,0.5,1,0];
%*********PM
P6=[0,0,0,0,0,0。
5,1];
%*********PB
%***********Ó
ï
Ñ
Ô
Ö
µ
*****%
NB=-3;
NM=—2;
NS=—1;
ZO=0;
PS=1;
PM=2;
PB=3;
%/*********Ä
¹
æ
±
í
*****%
Pg=[PBPBPMPMPSZOZO;
PBPMPMPSZOZONS;
PMPMPSPSZONSNS;
PMPSPSZOZONSNM;
PSPSZOZOZONSNM;
PSZOZOZONSNMNB;
ZOZOZONSNMNMNB];
%/*********¸
ù
¾
Ý
Ä
¼
Æ
Ø
Õ
ó
R*****%
R1_=dikaer(xbing(P0,P1),7,P0,7);
R1_=reshape(R1_,1,49);
R1=dikaer(R1_,49,P6,7);
R2_=dikaer(xbing(P2,P3),7,P0,7);
R2_=reshape(R2_,1,49);
R2=dikaer(R2_,49,P5,7);
R3_=dikaer(P0,7,P1,7);
R3_=reshape(R3_,1,49);
R3=dikaer(R2_,49,P6,7);
R4_=dikaer(xbing(P1,P2),7,P1,7);
R4_=reshape(R4_,1,49);
R4=dikaer(R4_,49,P5,7);
R5_=dikaer(P3,7,P1,7);
R5_=reshape(R5_,1,49);
R5=dikaer(R5_,49,P4,7);
R6_=dikaer(xbing(P0,P1),7,P2,7);
R6_=reshape(R6_,1,49);
R6=dikaer(R6_,49,P5,7);
R7_=dikaer(xbing(P2,P3),7,P2,7);
R7_=reshape(R7_,1,49);
R7=dikaer(R7_,49,P4,7);
R8_=dikaer(P0,7,P3,7);
R8_=reshape(R8_,1,49);
R8=dikaer(R8_,49,P5,7);
R9_=dikaer(xbing(P1,P2),7,P3,7);
R9_=reshape(R9_,1,49);
R9=dikaer(R9_,49,P4,7);
R10_=dikaer(P3,7,P3,7);
R10_=reshape(R10_,1,49);
R10=dikaer(R10_,49,P3,7);
R11_=dikaer(xbing(P0,P1),7,P4,7);
R11_=reshape(R11_,1,49);
R11=dikaer(R11_,49,P4,7);
P45=xbing(P4,P5);
R12_=dikaer(xbing(P2,P3),7,P45,7);
R12_=reshape(R12_,1,49);
R12=dikaer(R12_,49,P3,7);
R13_=dikaer(P0,7,P5,7);
R13_=reshape(R13_,1,49);
R13=dikaer(R13_,49,P4,7);
R14_=dikaer(P1,7,P5,7);
R14_=reshape(R14_,1,49);
R14=dikaer(R14_,49,P3,7);
P01=xbing(P0,P1);
R15_=dikaer(xbing(P01,P2),7,P6,7);
R15_=reshape(R15_,1,49);
R15=dikaer(R15_,49,P3,7);
R16_=dikaer(P3,7,P6,7);
R16_=reshape(R16_,1,49);
R16=dikaer(R16_,49,P2,7);
R17_=dikaer(P4,7,P0,7);
R17_=reshape(R17_,1,49);
R17=dikaer(R17_,49,P4,7);
R18_=dikaer(xbing(P5,P6),7,P0,7);
R18_=reshape(R18_,1,49);
R18=dikaer(R18_,49,P3,7);
R19_=dikaer(xbing(P4,P5),7,P1,7);
R19_=reshape(R19_,1,49);
R19=dikaer(R19_,49,P3,7);
R20_=dikaer(P6,7,xbing(P1,P2),7);
R20_=reshape(R20_,1,49);
R20=dikaer(R20_,49,P2,7);
P23=xbing(P2,P3);
R21_=dikaer(P4,7,xbing(P23,P4),7);
R21_=reshape(R21_,1,49);
R21=dikaer(R21_,49,P3,7);
R22_=dikaer(P5,7,xbing(P23,P4),7);
R22_=reshape(R22_,1,49);
R22=dikaer(R22_,49,P2,7);
R23_=dikaer(P6,7,xbing(P3,P4),7);
R23_=reshape(R23_,1,49);
R23=dikaer(R23_,49,P1,7);
R24_=dikaer(P4,7,P5,7);
R24_=reshape(R24_,1,49);
R24=dikaer(R24_,49,P2,7);
R25_=dikaer(P5,7,P5,7);
R25_=reshape(R25_,1,49);
R25=dikaer(R25_,49,P1,7);
R26_=dikaer(P6,7,xbing(P6,P5),7);
R26_=reshape(R26_,1,49);
R26=dikaer(R26_,49,P0,7);
R27_=dikaer(xbing(P4,P5),7,P6,7);
R27_=reshape(R27_,1,49);
R27=dikaer(R27_,49,P1,7);
m=[R1,R2,R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R20,R21,R22,R23,R24,R25,R26,R27];
R=bingji(m);
%*************³
õ
»
¯
ä
e=0;
ec=0;
y_1=0;
y_2=0;
u=0;
u_1=0;
u_2=0;
u_3=0;
e_1=0;
e_2=0;
Eswith=10;
throttle_1=0;
brake_1=0;
x=[000];
ts=0。
001;
sys=tf(1,[1,2,1],'
inputdelay'
,0。
5);
dsys=c2d(sys,ts,'
zoh'
);
[num,den]=tfdata(dsys,’v’);
fork=1:
1:
40000
%****************¿
Í
³
time(k)=k*ts;
if(k〈20000)
vd(k)=50;
vd(k)=0;
y(k)=—den
(2)*y_1-den(3)*y_2+num
(2)*u_1+num(3)*u_2;
e=vd(k)-y(k);
ec=e—e_1;
u_3=u_2;
u_2=u_1;
u_1=u;
y_2=y_1;
y_1=y(k);
x
(1)=e;
x
(2)=(e—e_1)/ts;
x(3)=x(3)+e*ts;
%*******************************Ó
Ã
Å
kp=0.42;
Ti=30;
Td=0.0018;
%***vd(k)=1
%kp=0.42;
Ti=30;
Td=0.0018;
%***vd(k)=1
%kp=0。
0015;
Ti=0.01;
Td=0。
002;
%***vd(k)=1*time(k)+10
0015;
Ti=0.001;
002;
%***vd(k)=1*time(k)^2+time(k)+2;
ki=kp*ts/Ti;
kd=kp*Td/ts;
dthrottle=kp*x
(1)+kd*x
(2)+ki*x(3);
throttle=u_1+dthrottle;
if(throttle>
2000)
throttle=2000;
if(throttle<
-2000)
throttle=-2000;
%****************************É
²
%/*********Ñ
ë
*****%
E=lisan(-50,50,3,e);
EC=lisan(—20,20,3,ec);
%/*********¼
Î
î
¡
¢
Â
*****%
E_R
(1)=lbell(E,1,4,-3);
E_R
(2)=trig(E,—3,-2,0);
E_R(3)=trig(E,—3,—1,1);
E_R(4)=trig(E,—2,0,2);
E_R(5)=trig(E,—1,1,3);
E_R(6)=trig(E,0,2,3);
E_R(7)=rbell(E,1,4,3);
EC_R
(1)=lbell(EC,1,4,-3);
EC_R
(2)=trig(EC,-3,-2,0);
EC_R(3)=trig(EC,-3,—1,1);
EC_R(4)=trig(EC,-2,0,2);
EC_R(5)=trig(EC,-1,1,3);
EC_R(6)=trig(EC,0,2,3);
EC_R(7)=rbell(EC,1,4,3);
%/*********¼
ö
*****%
U_R1=dika