标题:
陀螺仪模糊控制2维三角形算法程序源码
[打印本页]
作者:
666lihua
时间:
2018-4-5 20:31
标题:
陀螺仪模糊控制2维三角形算法程序源码
互相交流
模糊控制2维三角形算法如下:
#include "Fuzzy.h"
//二维模糊控制系统
//输入方向偏差与陀螺仪Y轴数据,控制输出方向P
float Angle_E[3] = {5,10,15}; //角度偏差
float Gyro_E[3] = {10,15,30}; //角速度数据
float Shell_P[3] = {10,15,40}; //外层比例控制系数
//由于所测数据均为单向数据,故规则表拟定为单向
int rule[3][3]=
{
{2,1,0},
{1,1,0},
{0,0,0},
};
float Fuzzy_Shell_P(float E_angle,float E_gyro);
float Fuzzy_Shell_P(float E_angle,float E_gyro)
{
float angle_err=0,gyro_err=0;
int angle_N=0,gyro_N=0; //隶属语言值
int num=0;
float fuzzy_P=0;
//记录隶属函数的输出值
float Angle_Fzy[2] ={0.0,0.0};
float Gyro_Fzy[2] ={0.0,0.0};
float Shell_P_Fzy[3] ={0.0,0.0,0.0};
// /*----- 数据更新-----*/
// Shell_P[1] = P_Direction_low;
// Shell_P[2] = P_Direction_high;
//将数据取绝对值,数据的正负仅代表左右
ABS_val(E_angle,angle_err);
ABS_val(E_gyro,gyro_err);
/*----- Angle 隶属函数描述-----*/
if(angle_err<Angle_E[0]) //1
{
Angle_Fzy[0] =1.0;
angle_N = 0;
}
else if(angle_err<Angle_E[1]) //2
{
Angle_Fzy[0] = (Angle_E[1]-angle_err)/(Angle_E[1]-Angle_E[0]);
angle_N = 0;
}
else if(angle_err<Angle_E[2]) //3
{
Angle_Fzy[0] = (Angle_E[2]-angle_err)/(Angle_E[2]-Angle_E[1]);
angle_N = 1;
}
else
{
Angle_Fzy[0] =0;//4
angle_N =1;
}
Angle_Fzy[1] = 1.0 - Angle_Fzy[0];//隶属函数输出值
/*----- Pre_dirr 变化隶属函数描述-----*/
if(gyro_err<Gyro_E[0])//当陀螺仪Y轴数据小于40时,对应三角隶属函数的隶属度为1,方向量度模糊等级为0级
{
Gyro_Fzy[0] =1;
gyro_N = 0;
}
else if(gyro_err<Gyro_E[1])//当陀螺仪Y轴数据小于70时,对应三角隶属函数的隶属度根据公式得出,方向量度模糊等级为0级,此时为40三角形的右边一半
{
Gyro_Fzy[0] = (Gyro_E[1] - gyro_err)/(Gyro_E[1]-Gyro_E[0]);
gyro_N = 0 ;
}
else if(gyro_err<Gyro_E[2])//当陀螺仪Y轴数据小于160时,对应三角隶属函数的隶属度根据公式得出,方向量度模糊等级为1级,此时为70三角形的左边一半
{
Gyro_Fzy[0] = (Gyro_E[2] - gyro_err)/(Gyro_E[2]-Gyro_E[1]);
gyro_N = 1;
}
else //当陀螺仪Y轴数据大于160时,对应三角隶属函数的隶属度根据公式得出,方向量度模糊等级为1级,此时为70三角形的右边一半
{
Gyro_Fzy[0] =0.0;
gyro_N = 1;
}
//一个数据在三角形隶属度函数中对应着两个相邻三角形中的隶属度,两个隶属度和为1
Gyro_Fzy[1] = 1.0 - Gyro_Fzy[0];
/*查询模糊规则表*/
//查表的时候不单单查询一个规则,而是向右向下拓展成一个规则正方形查询
num =rule[gyro_N][angle_N];
Shell_P_Fzy[num] += Gyro_Fzy[0]*Angle_Fzy[0];
num =rule[gyro_N+1][angle_N];
Shell_P_Fzy[num] += Gyro_Fzy[1]*Angle_Fzy[0];
num =rule[gyro_N][angle_N+1];
Shell_P_Fzy[num] += Gyro_Fzy[0]*Angle_Fzy[1];
num =rule[gyro_N+1][angle_N+1];
Shell_P_Fzy[num] += Gyro_Fzy[1]*Angle_Fzy[1];
/*面积中心法解模糊*/
fuzzy_P=Shell_P_Fzy[0]*Shell_P[0]+Shell_P_Fzy[1]*Shell_P[1]+Shell_P_Fzy[2]*Shell_P[2];
return(fuzzy_P);
}
复制代码
所有资料51hei提供下载:
Fuzzy.zip
(1.27 KB, 下载次数: 19)
2018-4-5 20:31 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1