基于自适应模糊控制的拖拉机自动导航系统Word文件下载.docx
《基于自适应模糊控制的拖拉机自动导航系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于自适应模糊控制的拖拉机自动导航系统Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
这种基于解析式的模糊控制器可以将变量的基本论域划分得很细,不仅有利于提高控制精度,而且易于计算机实现,避免了常规模糊控制器规则繁琐的缺点。
采用模拟生物进化过程的遗传算法对模糊控制的修正因子以及输出比例因子进行在线整定,以达到自适应控制。
控制算法原理如图2所示。
图2基于GA的导航控制原理图
遗传算法具有鲁棒性强、并行搜索和群体寻优等优点,是一种有效的参数优化手段。
其基本操作主要包括编码、解码、选择、交叉和变异,设计如下:
(1)编码和解码
考虑到拖拉机前轮转向范围为[-25°
,30°
],模糊控制器输出比例因子大小范围选择为Kµ
∈[0.2,1.67]。
编码方式采用搜索能力较强的二进制编码,染色体是长度为10位的二进制串,α占6位,Kµ
占4位。
相应的解码方式为
(2)
式中binrep(α)——6位字符串表示的二进制整数
binrep(Kµ
)——4位字符串表示的二进制整数
(2)适应度函数的构造
适应度函数的选取直接影响GA的收敛速度以及能否找到最优解。
由于根据ITAE指标设计的系统超调量小,阻尼适中,具有良好的动态特性,而且在农用车辆自动导航中,横向跟踪偏差是衡量控制效果的首要指标,故选择横向跟踪偏的ITAE指标的倒数为适应度函数,即为
(3)
式中y(t)——t时刻的横向跟踪偏差,m
在实际寻优中,为提高算法运算速度,保证控制的实时性,改进为
(4)
式中Δt——分段积分区间长度,为0.1s
Y(k)——kΔt时刻的横向跟踪偏差,m
υ——拖拉机前进速度,m/s
round——对结果取整
为计算适应度函数,采用简化的两轮车运动学模型推算y(k),由于不考虑车辆离心力和侧滑,两轮车模型虽然在实际过程中不能完全精确描述车辆的运动状态,但是在很大程度上还是能够反映车辆真实运动变化趋势的。
同时将液压转向系统简化为一阶惯性环节[13],以预定直线路径为横轴建立跟踪坐标系,前进方向为横轴正方向,跟踪起点横坐标为零,则可得如图3所示的非线性运动学模型为
图3两轮车运动学模型
(5)
式中x——跟踪距离,m
v——速度,m/s
y——横向跟踪偏差,m
L——轴距,m
θ——航向跟踪偏差,rad
α——前轮转向角,rad
τ——惯性时间常数,s
αd——期望前轮转角,rad
(3)选择策略
采用按适应度比例分配的轮盘赌选择法,即利用个体适应度比例的概率决定其后代留存的可能。
若个体i的适应度为fi,则其被选中的概率为
(6)
(4)遗传算子
主要包括交叉和变异两个遗传算子。
交叉算子采用单点交叉方式;
变异算子,以变异概率对染色体的每个二进制位进行逻辑取反。
遗传算法的流程如图4所示。
α、Kµ
参数编码
随机产生初始群体
解码并计算适应度产生群体
满足终止条件?
选择、交叉、变异
输出α、Kµ
图4基于GA的α、Kµ
参数优化流程
3前轮转向控制器
由于KSC-10型PLC支持多任务运行模式,所以将下层控制器的任务划分为:
任务1,按照ISO11783规定的时间周期向导航控制器报告前轮转角;
任务2,负责前轮转向控制以及驾驶模式的切换和上报。
任务1的优先级高于任务2。
前轮自动转向控制是通过转向控制算法输出一定的功率型号,控制比例阀门的开度,通过调节流量来调节前轮的转向速度,从而实现转角的控制。
本文采用位置式数字PD控制器实现前轮转角控制,期望转角与当前转角之差作为控制器输入。
转向控制原理如图5所示。
图5转向控制结构
考虑到比例方向阀有两路PWM输入,而且有700mA的电流死区,控制算法改进为
(7)
式中Ipd——PD算法输出值
Kp——比例系数
ek——当前角度误差
KD——微分系数
ek-1——前一次角度误差
Iout——控制器最终输出值
Iout的正负极性分别代表左路和右路PWM输入,相应代表前轮的两个转动方向。
在转向过程中的某一时刻,必然有一路PWM输入需要置为0。
4算法与系统实验
4.1前轮转向控制实验
为尽可能考虑农田地面状况对前轮转向控制的影响,找了一块刚秋收后的玉米地进行转向控制实验。
选择频率为0.2Hz,幅值为15°
方波指令曲线和正弦指令曲线对转向控制器进行测试。
经过多次调试,当Kp=250,KD=20时,转向控制效果较佳。
测试结果如图6所示。
图6指令曲线跟踪
(a)方波曲线跟踪(b)正弦曲线跟踪
可见,转向控制系统可以较好地完成信号跟踪任务。
对于方波信号,跟踪一个30°
的阶跃信号(从-15°
到15°
或反之)大约需要1.2~1.4s,对于正弦波,跟踪延迟约为0.2~0.4s,可满足实际自动导航需求。
另外,在正负峰值处,跟踪曲线并不完全对称,这是由于左右转向时执行机构参数不同造成的。
4.2导航控制算法仿真
首先在Matlab环境下,采用式(5)所描述的两轮车模型,对设计的自适应导航控制算法进行仿真验证,仿真程序采用M语言编写。
运动学参数为:
υ=2m/s,L=2.3m,τ=0.1s。
遗传算法的种群大小为40,进化代数为40代,交叉概率为0.6,变异概率为0.02.拖拉机初始状态为[3.5m,0.4rad,0.2rad],分别代表横向偏差、航向偏差和前轮转向偏差,导航控制周期为200ms。
与之对比,常规模糊控制的规则因子选择为0.6,输出比例因子为1。
仿真结果如图7所示。
图7直线跟踪仿真
由图可见,基于GA的自适应模糊控制与常规模糊控制相比,消除误差的速度更快,几乎没有超调和振荡,具有良好的动态性能,在理论上是可行的。
通过大量仿真发现,在GA每步进化中,基本不超过10代即可寻找到最优解,其中一步的进化过程如图8所示
图8适应度曲线
另外,在拖拉机自动导航过程中,导航控制算法的实时性问题也是必须考虑的问题。
将上述自适应控制方法在工控机的VisualC++6.0环境下进行验证,进化代数设置为10代,经统计发现,美不优化平均耗时10ms左右,与200ms的导航控制周期相比,其算法延时造成的影响可以忽略不计。
4.3田间自动导航试验
试验地点选择在一块秋收后的玉米地,地面颠簸不平。
转向控制器采用上述设计的数字PD控制器,拖拉机速度为2m/s左右,分别对常规模糊控制方法和基于GA的自适应模糊控制方法进行试验,实验结果如图9所示。
(a)
(b)
图9自动导航系统跟踪
(a)常规模糊控制(b)基于GA的自适应模糊控制
由图可见,基础常规模糊控制的直线跟踪,存在一定的超调和振荡,稳态时最大偏差为20cm左右,而基于自适应模糊控制的直线跟踪可以迅速消除横向偏差,超调较小,振荡也较小,稳态时最大横向偏差为10cm左右,跟踪曲线变化相对平缓,具有良好的动态特性。
考虑到地面颠簸不平对GPS天线造成一定定位误差情况下,这个跟踪精度是可以接受的。
5结论
(1)对电控液压转向机构进行了研究,设计的位置数字PD转向控制器,具有良好的动态性能,可以满足农业机械自动导航的需求。
(2)对拖拉机自动导航控制算法进行了研究,设计的基于遗传算法的自适应模糊控制器,可以显著提高拖拉机自动导航时的跟踪精度,改善系统的控制品质。
参考文献
[1]NoguchiN,WillJ,ReidJ,etal.Developmentofamaster-slaverobotsystemforfarmoperations[J].Computer
andElectronicsinAgriculture,2004,44
(1):
1~19.
[2]KaizuY,YokoyamaS,ImouK,etal.Vision-basednavigationofaricetransplanter[C]//2004CIGRInternational
Confenrence,Vol.2,Beijing,2004:
III147.
[3]周建军,张漫.基于模糊控制的农用车辆路线跟踪[J].农业机械学报,2009,40(4):
151~156.
[4]周俊,姬长英.视觉导航轮式移动机器人横向预测模糊控制[J].农业机械学报,2002,33(6):
76~79.
[5]吕安涛,毛恩荣,宋正河,等.一种拖拉机自动驾驶复合模糊控制方法[J].农业机械学报,2006,37(4):
17~20.
[6]吕安涛,宋正河,毛恩荣.拖拉机自动转向最优控制方法的研究[J].农业工程学报,2006,22(8):
116~
119.
[7]朱忠祥,宋正河,谢斌,等.拖拉机队列自动控制系统[J].农业机械学报,2009,40(8):
149~154.
[8]陈军,朱忠祥,鸟巢谅,等.拖拉机沿曲线路径的跟踪控制[J].农业工程学报,2006,22(11):
108~111.
[9]周俊,姬长英,刘成良.农用轮式移动机器人视觉导航系统[J].农业机械学报,2005,36(3):
90~94.
[10]陈军,朱忠祥,鸟巢谅,等.基于神经网络的农用车辆自动跟踪控制[J].农业机械学报,2007,38(5):
131~133.
[11]张智刚,罗锡文.基于Kalman滤波和纯追踪模型的农业机械导航控制[J].农业机械学报,2009,40(增
刊):
6~12.
[12]李士勇.模糊控制、神经控制和智能控制论[M].哈尔滨:
哈尔滨工业大学出版社,1998.
[13]吕安涛.基于GPS/IMU的拖拉机自动驾驶方法的研究[D].北京:
中国农业大学,2006.
Matlab仿真代码
%fuzzytunningPIDcontrol
clearall;
a=newfis('
fuzzpid'
);
a=addvar(a,'
input'
'
e'
[-3,3]);
%parametere
a=addmf(a,'
1,'
NB'
zmf'
[-3,-1]);
NM'
trimf'
[-3,-2,0]);
NS'
[-3,-1,1]);
Z'
[-2,0,2]);
PS'
[-1,1,3]);
PM'
[0,2,3]);
PB'
smf'
[1,3]);
ec'
%parameterec
2,'
output'
kp'
[-0.3,0.3]);
%parameterkp
[-0.3,-0.1]);
[-0.3,-0.2,0]);
[-0.3,-0.1,0.1]);
[-0.2,0,0.2]);
[-0.1,0.1,0.3]);
[0,0.2,0.3]);
[0.1,0.3]);
ki'
[-0.06,0.06]);
%parameterki
[-0.06,-0.02]);
[-0.06,-0.04,0]);
[-0.06,-0.02,0.02]);
[-0.04,0,0.04]);
[-0.02,0.02,0.06]);
[0,0.04,0.06]);
[0.02,0.06]);
kd'
%parameterkd
3,'
rulelist=[1171511;
1271311;
1362111;
1462111;
1553111;
1644211;
1744511;
2171511;
2271311;
2362111;
2453211;
2553211;
2644311;
2734411;
3161411;
3262311;
3363211;
3453211;
3544311;
3635311;
3735411;
4162411;
4262311;
4353311;
4444311;
4535311;
4626311;
4726411;
5152411;
5253411;
5344411;
5435411;
5535411;
5626411;
5727411;
6154711;
6244511;
6335511;
6425511;
6526511;
6627511;
6717711;
7144711;
7244611;
7325611;
7426611;
7526511;
7617511;
7717711];
a=addrule(a,rulelist);
a=setfis(a,'
DefuzzMethod'
mom'
writefis(a,'
a=readfis('
%PIDcontroller
ts=0.001;
sys=tf(5.235e005,[1,87.35,1.047e004,0]);
dsys=c2d(sys,ts,'
tustin'
[num,den]=tfdata(dsys,'
v'
u_1=0.0;
u_2=0.0;
u_3=0.0;
y_1=0;
y_2=0;
y_3=0;
x=[0,0,0]'
;
error_1=0;
e_1=0.0;
ec_1=0.0;
kp0=0.40;
kd0=1.0;
ki0=0.0;
fork=1:
1:
500
time(k)=k*ts;
rin(k)=1;
%usingfuzzyinferencetotunningPID
k_pid=evalfis([e_1,ec_1],a);
kp(k)=kp0+k_pid
(1);
ki(k)=ki0+k_pid
(2);
kd(k)=kd0+k_pid(3);
u(k)=kp(k)*x
(1)+kd(k)*x
(2)+ki(k)*x(3);
ifk==300%addingdisturbance(1.0vattime0.3s)
u(k)=u(k)+1.0;
end
ifu(k)>
=10
u(k)=10;
ifu(k)<
=-10
u(k)=-10;
end
yout(k)=-den
(2)*y_1-den(3)*y_2-den(4)*y_3+num
(1)*u(k)+num
(2)*u_1+num(3)*u_2+num(4)*u_3;
error(k)=rin(k)-yout(k);
%%%%%%%%%%%%%%%%%%%%%%%%%returnofpidparameters%%%%%%%%%%%%%%%%%%%%%%%%
u_3=u_2;
u_2=u_1;
u_1=u(k);
y_3=y_2;
y_2=y_1;
y_1=yout(k);
x
(1)=error(k);
%calculatingP
x
(2)=error(k)-error_1;
%calculatingD
x(3)=x(3)+error(k);
e_1=x
(1);
ec_1=x
(2);
error_2=error_1;
error_1=error(k);
showrule(a)
figure
(1);
plot(time,rin,'
b'
time,yout,'
r'
xlabel('
time(s)'
ylabel('
rin,yout'
figure
(2);
plot(time,error,'
error'
figure(3);
plot(time,u,'
u'
figure(4);
plot(time,kp,'
kp'
figure(5);
plot(time,ki,'
ki'
figure(6);
plot(time,kd,'
kd'