基于模糊控制和PID控制自主车辆速度跟踪控制.docx
- 文档编号:24783732
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:26
- 大小:142.49KB
基于模糊控制和PID控制自主车辆速度跟踪控制.docx
《基于模糊控制和PID控制自主车辆速度跟踪控制.docx》由会员分享,可在线阅读,更多相关《基于模糊控制和PID控制自主车辆速度跟踪控制.docx(26页珍藏版)》请在冰豆网上搜索。
基于模糊控制和PID控制自主车辆速度跟踪控制
一、设计原理
设计思想:
油门控制采用增量式PID控制算法,刹车控制采用模糊控制算法,最后通过选择规则进行选择控制量输入。
选择规则:
首先定义速度偏差-50km/h≤e(k)≤50km/h,-20≤ec=e(k)-e(k-1)≤20,阀值eswith=10km/h。
若:
e(k)<0
e(k)>-eswithandthrottlr_1≠0选择油门控制
否则:
先将油门控制量置0,再选择刹车控制
若:
0 若: e(k)=0直接跳出选择 刹车控制: 刹车采用模糊控制算法 1.确定模糊语言变量 e基本论域取[-50,50],ec基本论域取[-20,20],刹车控制量输出u基本论域取[-30,30],这里我将这三个变量按照下面的公式进行压缩离散化: 其中, ,n为离散度。 e、ec和u均取离散度n=3,离散化后得到三个量的语言值论域分别为: E=EC=U={-3,-2,-1,0,1,2,3} 其对应语言值为{NB,NM,NS,ZO,PS,PM,PB} 2.确定隶属度函数 E/EC和U取相同的隶属度函数,边界选取钟形隶属度函数,中间取三角形隶属度函数,即: 说明: 边界选择钟形隶属度函数,中间选用三角形隶属度函数,图像略。 实际EC和E输入值若超出论域范围,则取相应的端点值。 3.模糊控制规则 由隶属度函数可以得到语言值隶属度(通过图像直接可以看出)如下表: 表1: E/EC和U语言值隶属度向量表 -3 -2 -1 0 1 2 3 NB 1 0.5 0 0 0 0 0 P0 NM 0 1 0.5 0 0 0 0 P1 NS 0 0.5 1 0.5 0 0 0 P2 ZO 0 0 0.5 1 0.5 0 0 P3 PS 0 0 0 0.5 1 0.5 0 P4 PM 0 0 0 0 0.5 1 0 P5 PB 0 0 0 0 0 0.5 1 P6 设置模糊规则库如下表: 表2: 模糊规则表 U E EC — NB NM NS ZO PS PM PB NB PB PB PM PM PS ZO ZO NM PB PM PM PS ZO ZO NS NS PM PM PS PS ZO NS NS ZO PM PS PS ZO ZO NS NM PS PS PS ZO ZO ZO NS NM PM PS ZO ZO ZO NS NM NB PB ZO ZO ZO NS* NM NM NB 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]),对于该控制,可调节参数较多,包括隶属度函数、模糊规则表、输入输出变量区间、语言值论域、模糊推理及解模糊方法等等,这里由于模糊规则需要经验设定,本算法没有实际参考,所以这里只调整规则表,其他参数固定不变。 以下为最初设计的模糊规则表: U E EC — NB NM NS ZO NB PB PB PM PM NM PB PM PM PS NS PM PM PS PS ZO PM PS PS ZO PS PS PS ZO ZO PM PS ZO ZO ZO PB ZO ZO ZO ZO 由于实际刹车控制中对于加速采取比较单一的置零(在选择规则中设定)输出,所以在规则表中e<0部分没有规则,然而为了仿真方便,使参数调节更清晰,重新定义模糊规则表如下: U E EC — NB NM NS ZO PS PM PB NB PB PB PM PM PS ZO ZO NM PB PM PM PS ZO ZO NS NS PM PM PS PS ZO NS NS ZO PS ZO ZO ZO ZO NS NM PS PS PS ZO ZO ZO NS NM PM PS ZO ZO ZO NS NM NB PB ZO ZO ZO NS* NM NM NB 与此同时,将刹车的输出变量取反,以此来实现减速的效果! 在调整模糊规则表的时候,必须依据输入变量e和ec的范围逐个检验,按照他们各自的语言值以及相应的输出语言值进行调整。 例如,初始速度为50,期望速度为0,即e=-50,ec=-50,则此时输出对应模糊规则表中第一行第一列PB,而下一时刻ec几乎为0,所以在调节过程中,主要进行对EC变量的ZO行进行调节,若响应时间短,则增大相应输出语言值,反之亦然。 仿真时,分两段,首先加速,之后减速,采用上面的模糊规则表,得到如下图像: 从图像的上升阶段分析可以看出,其加速阶段并不能达到稳态值,但对于刹车控制可以忽略其影响,而减速阶段实际上已经比较理想,我取稳态误差达到5%稳定,则此规则达到稳态的时间为7.4s,这里尝试进行如下修改,将规则表中带下划线的部分以此改为: PM,PS,PS,ZO,即,增大了输出语言值。 则得到如下图像: 此规则达到稳定的时间为6.9s,由此分析模糊规则的调整规则如下: 若想加快响应时间,增大误差和误差变化率负大区域附近的输出语言值,并增大误差变化率零区域附近的输出语言值,可能还会引起超调量的增大,所以只需做临近语言值之间的变化。 3.整体调节 此时将刹车与油门同时加到仿真模型中,分别做加速和减速仿真,依据分别调节时的规律做微量调节就可以基本达到要求。 4.待解决问题 在调试过程中发现,油门控制(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); kk(i,k)=A(i,k); end end end end functiono=dikaer(A,n,B,N) fori=1: n forj=1: N if(A(i)<=B(j)) C(i,j)=A(i); else C(i,j)=B(j); end o=C; end end 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: 49 forj=1: 7 if(A(i,j) A(i,j)=B(i,j); end end ooo=A; end return; functionMM=jdikaer(A,n,B,m) fori=1: m forj=1: n if(A(j) B(j,i)=A(j); end end MM=B; end return; functionoo=jiao(A,B) fori=1: 7 forj=1: 7 if(A(i,j)>B(i,j)) A(i,j)=B(i,j); end end oo=A; end return; functionmm=lbell(x,a,b,c) if(x mm=1; else z=(x-c)/a; v=abs(z); n=v^(2*b); y=1/(1+n); mm=y; end return; functionL=lisan(a,b,n,x) y=2*n*x/(b-a)-n*(a+b)/(b-a); L=y; return; functionUU=max(A) fori=1: 7 forj=1: 49 if(A(j,i)>=Q(i)) Q(i)=A(i,j); end end UU=Q; end return; functionsum1=mean(U) a=[-3-2-10123]; sum2=0;sum3=0; fori=1: 7 sum2=sum2+U(i); sum3=sum3+U(i)*a(i); end sum1=sum3/sum2; return; functionmm=rbell(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); mm=y; end return; functionmww=trig(x,a,b,c) if(x<=a) mww=0; else if(x>a&&x<=b) mww=(x-a)/(b-a); else if(x>b&&x<=c) mww=(c-x)/(c-b); else if(x>c) mww=0; end end end end return; functionooo=xbing(A,B) fori=1: 7 if(A(i) A(i)=B(i); end ooo=A; end return; 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; else vd(k)=0; end 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 %kp=0.0015;Ti=0.001;Td=0.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; end if(throttle<-2000) throttle=-2000; end %****************************ɲ³µ¿ØÖÆ %/*********ѹËõÊäÈë±äÁ¿*****% 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=dikaer(E_R,7,EC_R,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 模糊 控制 PID 自主 车辆 速度 跟踪