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所示,第一行和第一列是两个输入量ec和e的语言值,其余为输出量的语言值。在建立规则库时,通常先从比较极端的情况入手,如从表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 |
输出确定之后,可以先不管模糊控制的中间过程,而是应该先确定控制输入量。在此选择了赛道黑线的弯曲程度(curve)以及车体的位置(av_loca)。经实际测量发现它们的论域分别是curve:-32~32;av_loca:0~80。当然作者在实验时没有穷尽所有的情况,所以curve的论域可能比上面还要大,但是实际上用上面的论域来做控制以及足够了,因此在程序中加了一段防止论域溢出的代码。
//防止越界 If else |
在建立输入量的隶属度函数时,选用的是三角函数。至于为什么要选三角函数,它相对于其他类型的函数有什么优缺点并未深究。当划分好模糊等级后,便是量化输入,在此推荐将输入量经行量化,为什么要量化?作者的理解是:由于有两个输入量,且它们的论域不一样,为了保证它们在进行模糊计算时的横、纵坐标的变化范围能保持一致,这样有利于计算前、后沿斜率。而且很多时候输入量是小数,那就更要量化了。仅是作者个人的体会,或许不对。对于curve的量化过程如下:
fuzzy_input_1 |
同样要防止越界,因为unsigned char型的范围是0~255。由于如何建立一个较好的隶属度函数,实际上是比较难的,在此只是一个示意。
图 3-2
下面是作者对于C语言的模糊代码格式的一些理解。
首先看输入变量的隶属度函数的C代码。
const 0x0c,0x20,0x10,0x10, 0x5c,0x74,0x15,0x15, 0x6c,0x94,0x0d,0x0d, 0x8c,0xa4,0x15,0x15, 0xf0,0xff,0x20,0x00,
0x1e,0x3c,0x11,0x11, 0x3c,0x5a,0x11,0x11, 0x4b,0xa5,0x05,0x05, }; |
以上代码中每一行的是含义是:起点、终点,前沿斜率、后沿斜率。实际上并不需要一定写成16进制的格式,写代码是直接写成10进制也可以。
下面看规则库代码:
const (9*0)+0,(9*1)+4,0xfe,(9*0)+2+18,0xfe, … 0xff }; |
如上的代码中“0xfe”是前件与后件的分隔符,“0xff”是规则库结束符。规则库代码中的每一行中的第一0xfe前的两个数是Fuzzy控制的两个输入量在输入隶属度函数数组中的索引,而两个0xfe之间的数则为输出量的索引。
第四章 后记
由于作者水平有限,肯定有不少错误和不当之处,还望读者不吝赐教!本文中的一些理解纯属作者个人之见,不代表任何组织和他人的意见。
未经允许,切勿拷贝、转载!
文章评论(0条评论)
登录后参与讨论