- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
模糊控制作业
机研112张营章学号:201120122044
题目:设计一个两个输入,单输出的模糊控制器。
设计的二维模糊控制器的结构如图1所示。在此控制器中两个输入为机器人与障碍的距离D和机器人所处的环境类型T,输出为转角B。
控制器结构
与障碍距离A
移动机器人输出转角B
障碍物情况T
图1.二维模糊控制器结构
语言变量
取A的模糊子集〔5个〕:
很近近中远很远
分别简记为:VNNMFVF
取T的模糊子集〔8个〕为〔以障碍物与机器人方向为准〔如图2所示〕〕
右左右前左前前左右死胡同无
分别简记为:TMACROBUTTONMTEditEquationSection2SEQMTEqn\r\hSEQMTSec\h1T2T3T4T5T6T7T8
取B的模糊子集〔9个〕为:
左快转左转直行右转右快转
分别简记为:1L2L3L4L5S6R7R8R9R
计算论域确定
A的计算论域:[-2,+2]T的计算论域:[1,8]B的计算论域:[-4,+4]
确定隶属函数
障碍距离A(in)隶属函数为(高斯型):
μVN=equalzero(exp(-(in+2)*(in+2)/(0.5*0.5*2)));
μN=equalzero(exp(-(in+1)*(in+1)/(0.45*0.45*2)));
μM=equalzero(exp(-in*in/(0.4*0.4*2)));
μF=equalzero(exp(-(in-1)*(in-1)/(0.45*0.45*2)));
μVF=equalzero(exp(-(in-2)*(in-2)/(0.5*0.5*2)));
转角大小G(x)隶属度函数为(三角形)
障碍物情况T(y)的隶属函数为:
[1,8]
制定模糊控制规那么并建立模糊控制表
基于操作者手动控制策略,得出如下表所示的40条控制规那么。
A/B/T
T1
T2
T3
T4
T5
T6
T7
T8
VN
1L
9R
1L
9R
2L
5S
5S
5S
N
2L
8R
1L
9R
3L
5S
5S
5S
M
3L
7R
2L
8R
4L
5S
5S
5S
F
4L
6R
3L
7R
5S
5S
5S
5S
VF
5S
5S
3L
6R
5S
5S
5S
5S
控制规那么表
将上表的40条控制规那么用语言描述为:
QUOTEIfAisVNandTisT1thenBisSIFAisViandTisTithenBis
例如控制规那么的第一条语句:IfAisVNandTisT1thenBisS
由这条语句所确定的模糊关系可用下式写出:
R=(VNA×SB)·(T1T×SB)
如果实际距离为a,实际环境为t,那么由上市可以算出控制量为
B1=a·(VNA×SB)·t·(T1T×SB)
那么根据40条控制规那么得到的控制量输出为:
B=B1+B2+B3+B4+…+B40
对于上式,由于t与T1为量化向量,所以有:
当t=T1时上式等效于:B1=a·(VNA×SB)
当t≠T1时:B1=0
同时t=T1的式子等效于:B1=μVN(a)×SB
故求解过程简化为:障碍类型t后,每种类型t对应五条控制规那么,那么分别求出B1~B5:
B=B1+B2+B3+B4+B5
对应取大即可得到控制向量,最后解模糊即可。
基于C++所编写的控制程序工程见附件。
运行例如如下:〔距离-1.3,障碍类型:右边有障碍物〕
显示控制向量的输出曲线(输出曲线使用vc++的easyx开源库)为:
由上图可知,输出曲线为单峰,较陡,符合控制逻辑。
附录:程序
#includemath.h
#includestdio.h
#includeiostream.h
#includegraphics.h//就是需要引用这个图形库
#includeconio.h
doubleJJ[21]={-5,-4.5,-4,-3.5,-3,-2.5,-2,-1.5,-1,-0.5,0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5};
voidcomparesmall(doublea,double*p,intlength)
{
for(inti=0;ilength;i++)
{
if(ap[i])
{
p[i]=a;
}
}
}
doubleequalzero(doublex)
{
if(x0.1)return0;
elsere
文档评论(0)