原创 Fuzzy控制器的仿真与移植实现

2011-3-23 20:10 3051 9 9 分类: 工程师职场

attachment download

  

Fuzzy控制器的仿真与移植实现


 


DocNO: Doc-Fuzzy-A


 


 


 


 


BinLan Studio


 








第一章 Fuzzy控制器概述


1.1 经典Fuzzy控制系统模型


Fuzzy控制理论是上世纪60年代发展起来的第三代智能控制理论之一,是一种各学科交叉综合而成的控制理论,其最大优点在于其不需要求被控对象具有精确的数学模型,其控制理念类似与人们日常生活、生产中很多非精确表达。一个经典的Fuzzy控制系统如图1-1所示。



图 1-1 经典Fuzzy控制系统框图


图1-1中的虚线框内即为Fuzzy控制器,由模糊化、模糊推理、反模糊化和知识库组成,知识库又由输入隶属度函数、规则库和输出隶属度函数组成,分别对应Fuzzy控制器的组成要素中的前3个。建立一个Fuzzy控制器的主要工作在于建立输入、输出变量的隶属度函数和模糊推理的规则库。至于Fuzzy控制器中各模块的深层次理论在此不做讨论,如有需要了解可以查阅相关专业书籍。


1.2 隶属度函数的建立


一般数字控制系统,其输入变量与输出变量都是精确的数字或是电压、电流值或PWM的占空比值等。而对于Fuzzy控制器而言,这些精确的值是没有太大意义的,也不符合模糊推理的要求。所以在设计、建立Fuzzy控制器时,首先要建立输入、输出变量的隶属度函数。


在建立隶属度函数时,首先要确定输入或输出变量的论域——即变化范围,例如某速度变化范围为3m/s~4m/s;其次是划分其语言值等级,如:太慢、较慢、慢、不快不慢、快、较快、太快,这样就把该速度的变化范围划分成了7个语言值等级。


论域和语言值等级确定好之后,可以根据需要选择不同的隶属度函数曲线,如:三角行、梯形、高斯曲线等等。隶属度函数的作用就是把输入的精确值模糊化,对应到划分的语言值,通常这种对应关系不是100%的对应与某一个语言值等级的,例如某一个速度的精确值模糊化之后可能40%属于快、而60%属于较快(此处纯属作者个人之理解,是否正确,还希望读者不吝赐教)。


隶属度函数曲线类型选择好之后,便可以根据相关实验结果和长期的观察经验来建立隶属度函数了。在建立隶属度函数时,需要注意不同语言等级之间的重叠长度和重叠率。重叠率太小,会有一些输入在模糊化时无据可依;重叠率亦不可太大,太大会造成系统的模糊化进程过长,不稳定。重叠率通常设置为0.2~0.7为佳。


输入与输出隶属度函数的建立过程是一样,不同之处在于模糊化的隶属度函数的作用是已知X轴的值求解Y轴的值,而反模糊化的隶属度函数的作用是根据已知的Y轴值反算X轴的值。


1.3 模糊推理规则库的建立


模糊推理规则库是模糊控制中一个很重要的环节,可以用决策中心来形容也不为过,往往规则库的完善与否直接影响着系统的控制效果。规则库中的推理语句常用3中形式:if a,
then b; if a, then b or c, if a and b, then c。规则库的建立并没有千篇一律的规定或者方法,且比较依赖于专家经验、实验结果和长期的观察等。模糊规则库常以表格的形式给出,如表1-1所示。


表 1-1 某模糊规则库




ec


e



 


NB



 


NM



 


NS



 


ZO



 


PS



 


PM



 


PB



NB



PB



PB



PM



PM



PS



ZO



ZO



NM



PB



PB



PM



PS



PS



ZO



NS



NS



PM



PM



PM



PS



ZO



NS



NS



ZO



PM



PM



PS



ZO



NS



NM



NM



PS



PS



PS



ZO



NS



NS



NM



NM



PM



PS



ZO



NS



NM



NM



NM



NB



PB



ZO



ZO



NM



NM



NM



NB



NB




如表1-1所示,第一行和第一列是两个输入量ece的语言值,其余为输出量的语言值。在建立规则库时,通常先从比较极端的情况入手,如从表1的左上角和右下角开始填表,然后逐渐向中间的对角线推进,而且相邻空格尽量避免出现跳跃的语言值,这样有利于系统控制的稳定与平滑。




 


第二章 在Matlab建立Fuzzy控制器


首先在matlab的命令行中直接输入:anfisedit。然后会出现如下的界面:



图 2-1


然后编辑FIS属性,按如下的实例进行。



图 2-2


则出现如下的界面:



图 2-3


在这里便可以编辑模糊输入量和输出量的数目。通常情况下选择两个输入,一个输出。具体的操作如下。



图 2-4


下一步应该是根据实际项目要求来定义各个量的属性了。



图 2-5


然后会出现输入量与输出量的隶属度函数的定义界面:



图 2-6


在这里,可以根据实际需要修改各变量的隶属度函数了。具体怎么设置,可以在matlab的help文件中找到各相关设置的意义和方法。下面,我们具体看一下输出的type。



图 2-7


从上图2-7中可以看到,实际上输出有两种,一种是“constant”,另一种是“linear”。constant是一种单值的输出函数,它的各输出值是不连续的,而linear则是一种线性连续输出。等各参数的隶属度函数设置好之后,下一步就可以设置模糊推理规则库“rule”了。分别如图2-8和图2-9所示。



图 2-8



图 2-9


按以上步骤设置后之后,存盘便可以得到一个 .fis
的文件。如图1-10是作者建立好的一个fis文件。



图 2-10


然后在Matlab的Simulink工具中建立如图2-11的子模块,点击中间的方框,得到如图2-12所示对话框,并在Fis
matriz栏中指定为刚才存盘的 .fis
文件,即可封装成一个Fuzzy控制器了。



图 2-11



图 2-12


完成以上步骤,便可以将封装好的Fuzzy控制器用于仿真了,具体的仿真工程在此不做详细的描述,关于本章的一些细节和仿真方法读者可以查阅Matlab相关的工具书。




 


第三章 Freescale SmartCar的角度Fuzzy控制


飞思卡尔智能车大赛,从2006年开始至今近6个年头了,在这6年间无论比赛规则、规模如何变化,不变的是让一批又一批的大学生得到了很好的实际动手训练,当然也给飞思卡尔公司带来了不小的潜在市场。作者个人从2007年开始便追随本校的师兄、师姐开始接触智能小车的制作。本章所述的Fuzzy控制代码是作者的一位师姐(其人现在美国留学)之作,下面涉及到的一些注解也纯属本文作者个人的理解。


在此以飞思卡尔智能小车的方向控制为例,文中可能会提到一些变量,但不会对该变量作深入的探究,敬请原谅!


在这里,被控量是小车转角,向上回朔是舵机的转角,再向上就是用来控制舵机的PWM波的占空比,即系统的被控量是PWM波的占空比;一旦舵机安装方式确定后,小车前轮的左右极限转角也就确定了,即PWM波的占空比的变化范围也就确定了,即被控量的论域确定了,以作者之前的小车为例PWM占空比设定值为:1225~1725。显然S12的模糊机无法直接输出这么大的数值,需要做一个量化。在此对于输出量的隶属度函数选单值(constants),对应9个等级(0~8),即对应9个PWM占空比值,即对应9个角度值。模糊语言等级、输出等级以及实际PWM占空比值的对应关系如下。



图 3-1


该对应关系在代码中就是:



//输出角度等级的隶属度函数


const
unsigned char OUTPUT_MFS[9] = { 0,1,2,3,4,5,6,7,8 };



输出确定之后,可以先不管模糊控制的中间过程,而是应该先确定控制输入量。在此选择了赛道黑线的弯曲程度(curve)以及车体的位置(av_loca)。经实际测量发现它们的论域分别是curve:-32~32;av_loca:0~80。当然作者在实验时没有穷尽所有的情况,所以curve的论域可能比上面还要大,但是实际上用上面的论域来做控制以及足够了,因此在程序中加了一段防止论域溢出的代码。


 


 



//防止越界


If
(curve < -32) curve = -32;


else
if(curve > 32) curve = 32;



在建立输入量的隶属度函数时,选用的是三角函数。至于为什么要选三角函数,它相对于其他类型的函数有什么优缺点并未深究。当划分好模糊等级后,便是量化输入,在此推荐将输入量经行量化,为什么要量化?作者的理解是:由于有两个输入量,且它们的论域不一样,为了保证它们在进行模糊计算时的横、纵坐标的变化范围能保持一致,这样有利于计算前、后沿斜率。而且很多时候输入量是小数,那就更要量化了。仅是作者个人的体会,或许不对。对于curve的量化过程如下:



fuzzy_input_1
= (uchar)((curve + 32) << 2);



同样要防止越界,因为unsigned char型的范围是0~255。由于如何建立一个较好的隶属度函数,实际上是比较难的,在此只是一个示意。



图 3-2


下面是作者对于C语言的模糊代码格式的一些理解。


首先看输入变量的隶属度函数的C代码。



const
uchar INPUT_MFS_1[18][4]={


                             
0x00,0x10,0x00,0x20,


                              0x0c,0x20,0x10,0x10,


                             
0x28,0x60,0x09,0x09,


                              0x5c,0x74,0x15,0x15,


                              0x6c,0x94,0x0d,0x0d,


                              0x8c,0xa4,0x15,0x15,


                             
0xa0,0xd8,0x09,0x09,


                             
0xd4,0xf4,0x10,0x10,


                              0xf0,0xff,0x20,0x00,


 


                             
0x00,0x2d,0x00,0x11,


                              0x1e,0x3c,0x11,0x11,


                             
0x2d,0x4b,0x11,0x11,


                              0x3c,0x5a,0x11,0x11,


                              0x4b,0xa5,0x05,0x05,


                             
0x96,0xb4,0x11,0x11,


                             
0xa5,0xc3,0x11,0x11,


                             
0xb4,0xd2,0x11,0x11,


                             
0xc3,0xf0,0x11,0x00


                             };



以上代码中每一行的是含义是:起点、终点,前沿斜率、后沿斜率。实际上并不需要一定写成16进制的格式,写代码是直接写成10进制也可以。


下面看规则库代码:



const
unsigned char RULE_START[406]={


                           
(9*0)+0,(9*1)+0,0xfe,(9*0)+0+18,0xfe, //no.1


                           
(9*0)+0,(9*1)+1,0xfe,(9*0)+0+18,0xfe, //no.2


                           
(9*0)+0,(9*1)+2,0xfe,(9*0)+0+18,0xfe, //no.3


                           
(9*0)+0,(9*1)+3,0xfe,(9*0)+1+18,0xfe, //no.4


                            (9*0)+0,(9*1)+4,0xfe,(9*0)+2+18,0xfe,
//no.5


                           
(9*0)+0,(9*1)+5,0xfe,(9*0)+2+18,0xfe, //no.6


                           
(9*0)+0,(9*1)+6,0xfe,(9*0)+3+18,0xfe, //no.7


                           
(9*0)+0,(9*1)+7,0xfe,(9*0)+3+18,0xfe, //no.8


                           
(9*0)+0,(9*1)+8,0xfe,(9*0)+4+18,0xfe, //no.9


                            …


                            0xff


};



如上的代码中“0xfe”是前件与后件的分隔符,“0xff”是规则库结束符。规则库代码中的每一行中的第一0xfe前的两个数是Fuzzy控制的两个输入量在输入隶属度函数数组中的索引,而两个0xfe之间的数则为输出量的索引。




 


第四章 后记


由于作者水平有限,肯定有不少错误和不当之处,还望读者不吝赐教!本文中的一些理解纯属作者个人之见,不代表任何组织和他人的意见。


未经允许,切勿拷贝、转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条