智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3535|回复: 6
打印 上一主题 下一主题

[咨询] 卡尔曼程序问题

[复制链接]

10

主题

247

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2320
QQ
威望
1335
贡献
471
兑换币
99
注册时间
2012-2-8
在线时间
257 小时
毕业学校
西北师大
跳转到指定楼层
1#
发表于 2012-4-15 20:34:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "main.h"
  extern  float angle, angle_dot;   //外部需要引用的变量
  #define M     20
//-------------------------------------------------------
  float Q_angle=0.002, Q_gyro=0.0015, R_angle=0.0001, dt=0.002;
   //注意:dt的取值为kalman滤波器采样时间;   
  float P[2][2] = {
         { 1, 0 },
         { 0, 1 }
        };
  float Pdot[4] ={0,0,0,0};
  const char C_0 = 1;
  float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
//-------------------------------------------------------
  void Kalman_Filter(float angle_m,float gyro_m)   //gyro_m:gyro_measure
  {
  angle+=(gyro_m-q_bias) * dt;//先验估计
  Pdot[0]=Q_angle - P[0][1] - P[1][0];// Pk-' 先验估计误差协方差的微分
  Pdot[1]=- P[1][1];
  Pdot[2]=- P[1][1];
  Pdot[3]=Q_gyro;
  P[0][0] += Pdot[0] * dt;// Pk- 先验估计误差协方差微分的积分 = 先验估计误差协方差
  P[0][1] += Pdot[1] * dt;
  P[1][0] += Pdot[2] * dt;
  P[1][1] += Pdot[3] * dt;
  angle_err = angle_m - angle;//zk-先验估计
  PCt_0 = C_0 * P[0][0];
  PCt_1 = C_0 * P[1][0];
  E = R_angle + C_0 * PCt_0;
  K_0 = PCt_0 / E;//Kk
  K_1 = PCt_1 / E;
  t_0 = PCt_0;
  t_1 = C_0 * P[0][1];
  P[0][0] -= K_0 * t_0;//后验估计误差协方差
  P[0][1] -= K_0 * t_1;
  P[1][0] -= K_1 * t_0;
  P[1][1] -= K_1 * t_1;

  angle += K_0 * angle_err;//后验估计
  q_bias += K_1 * angle_err;//后验估计
  angle_dot = gyro_m-q_bias;//输出值(后验估计)的微分 = 角速度

   OutData[1]  = angle;   
   QingJiao=angle;
   Gyro_Data=  angle_dot;
   //OutData[3]  = Gyro_Data;   
   OutPut_Data();
   
}

void AD_calculate(void)
{   
               float acceler=0,gyro=0;
               int i;
               for( i=0;i<20;i++){
            
              while(!ATD0STAT0_SCF)              //等待转换完成
                 gyro= (float)ATD0DR0;            //读取陀螺仪AD值
                 acceler+= (float)ATD0DR2;       //加速度计AD值
   
        }
          acceler= acceler/M-1400; //加速度计                        
          gyro=gyro -1940;        // 陀螺仪        
       //acceler*=0.004069;      //系数换算:2.5/(1.2*512);   
       //acceler=asin(acceler);
       //gyro*=0.00341;          //角速度系数:(3.14/180)* 100/512=0.01364;        
      
        OutData[0] = acceler;    //加速度计
        OutData[2]  = gyro;       //陀螺仪
   
     Kalman_Filter(acceler,gyro);
}
大家觉得我这程序有什么不合理的,  Kalman_Filter(acceler,gyro);调用的两参数是不是这样的,是不是必须转换成对应的角度和角速度才可以啊,还有卡尔曼滤波的参数  Q_angle, Q_gyro, R_angle分别代表什么,影响什么,该怎么调节

希望做过的各位多多指导!


6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
869
QQ
威望
676
贡献
107
兑换币
0
注册时间
2011-10-18
在线时间
43 小时
2#
发表于 2012-4-15 21:20:48 | 只看该作者
还在研究卡尔曼啊,呵呵,有耐心
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1080
威望
504
贡献
400
兑换币
98
注册时间
2012-2-4
在线时间
88 小时
毕业学校
3#
发表于 2012-4-23 12:14:43 | 只看该作者
回复 支持 反对

使用道具 举报

4

主题

185

帖子

0

精华

高级会员

Rank: 4

积分
849
QQ
威望
439
贡献
322
兑换币
34
注册时间
2012-6-30
在线时间
44 小时
4#
发表于 2013-4-17 21:38:55 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
威望
158
贡献
90
兑换币
93
注册时间
2014-1-2
在线时间
39 小时
毕业学校
汉台中学
5#
发表于 2015-2-6 20:06:47 | 只看该作者
:lol
回复 支持 反对

使用道具 举报

29

主题

758

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5114
威望
809
贡献
3231
兑换币
1518
注册时间
2012-9-15
在线时间
537 小时
6#
发表于 2015-2-13 14:34:49 | 只看该作者
回复 支持 反对

使用道具 举报

5

主题

51

帖子

0

精华

高级会员

Rank: 4

积分
684
威望
309
贡献
191
兑换币
187
注册时间
2014-3-28
在线时间
92 小时
毕业学校
六中
7#
发表于 2015-3-22 15:17:08 | 只看该作者
同问啊,还有就是用了卡尔曼,是不是就不用角度归一化了呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 11:30 , Processed in 0.048600 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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