智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2541|回复: 3
打印 上一主题 下一主题

[软件类] 卡尔曼输出也会有过冲??

[复制链接]

1

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
威望
252
贡献
43
兑换币
4
注册时间
2011-11-8
在线时间
13 小时
跳转到指定楼层
1#
发表于 2012-3-14 11:25:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么我的卡尔曼输出会有过冲呢???都一个月了,还没解决,大家遇到过这样的问题吗???请指教一下!!!
void AD1(void)            //MMA7361
{
ATD0CTL5 = 0x10;//转换AD1
while(!ATD0STAT2);
AD_data0 = ATD0DR0;
AD_data1=ATD0DR1;
// return(AD_data1);
}


for(i=0;i<20;i++) {
  AD1();
sum0+=AD_data0;
sum1+=AD_data1;
}
AD_out=sum0/20.0;
AD_OUT=(AD_out-a)/b;
acc=sum1/20.0;

acc=acc-1400;
acc=acc/640.0;//求出多少g
if(acc>1)
  acc=1;
else if(acc<-1)
  acc=-1;
acc1=180/3.1415*asin(acc);




#define dt                  0.002//卡尔曼滤波采样频率
#define R_angle          0.8//测量噪声的协方差(即是测量偏差)
#define Q_angle          0.5//过程噪声的协方差
#define Q_gyro           0.9 //过程噪声的协方差  过程噪声协方差为一个一行两列
float kalmanUpdate(float gyro_m,float incAngle)
{         
         float K_0;//含有卡尔曼增益的另外一个函数,用于计算最优估计值
         float K_1;//含有卡尔曼增益的函数,用于计算最优估计值的偏差
         float Y_0;
         float Y_1;
         
         //去除偏差后的角速度
         float Pdot[4];//过程协方差矩阵的微分矩阵
         float angle_err;//角度偏量
         float E;//计算的过程量
                 
         static float angle = 0;            //下时刻最优估计值角度
         static float q_bias = 0;        //陀螺仪的偏差                        
         static float P[2][2] = {{ 1, 0 }, { 0, 1 }};//过程协方差矩阵
                  
         Rate = gyro_m - q_bias;
   
         //计算过程协方差矩阵的微分矩阵     
         Pdot[0] = Q_angle - P[0][1] - P[1][0];         
          Pdot[1] = - P[1][1];                        
         Pdot[2] = - P[1][1];                                 
         Pdot[3] = Q_gyro;                        

         angle += Rate * dt; //角速度积分得出角度

         P[0][0] += Pdot[0] * dt; //计算协方差矩阵
         P[0][1] += Pdot[1] * dt;
          P[1][0] += Pdot[2] * dt;
         P[1][1] += Pdot[3] * dt;                                                   
   
         angle_err = incAngle - angle; //计算角度偏差

         E = R_angle + P[0][0];
         K_0 = P[0][0] / E; //计算卡尔曼增益
         K_1 = P[1][0] / E;

         Y_0 = P[0][0];   
         Y_1 = P[0][1];
   
         P[0][0] -= K_0 * Y_0; //跟新协方差矩阵
         P[0][1] -= K_0 * Y_1;
         P[1][0] -= K_1 * Y_0;
         P[1][1] -= K_1 * Y_1;

        angle += K_0 * angle_err; //给出最优估计值
         q_bias += K_1 * angle_err;//跟新最优估计值偏差

         return angle;
}


参数是自己通过输出效果一步步调试的,不知道为什么会有过冲



4

主题

44

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1966
威望
737
贡献
625
兑换币
45
注册时间
2011-8-16
在线时间
302 小时
2#
发表于 2012-3-14 13:30:09 | 只看该作者
AD_OUT=(AD_out-a)/b;
acc=sum1/20.0;

acc=acc-1400;
acc=acc/640.0;//求出多少g
if(acc>1)
  acc=1;
else if(acc<-1)
  acc=-1;
acc1=180/3.1415*asin(acc);
这一段是什么意思,楼主我们可以交流下
回复 支持 反对

使用道具 举报

1

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
威望
252
贡献
43
兑换币
4
注册时间
2011-11-8
在线时间
13 小时
3#
 楼主| 发表于 2012-3-14 14:57:50 | 只看该作者
pcj2011 发表于 2012-3-14 13:30
AD_OUT=(AD_out-a)/b;
acc=sum1/20.0;

加QQ聊吧 961686605
回复 支持 反对

使用道具 举报

21

主题

273

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2915
威望
1628
贡献
643
兑换币
264
注册时间
2012-1-15
在线时间
322 小时
4#
发表于 2012-3-14 15:37:56 | 只看该作者
慢慢调吧。。。加油。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-15 00:36 , Processed in 0.090531 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表