智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3959|回复: 2
打印 上一主题 下一主题

K车模卡尔曼滤波问题

[复制链接]

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
24
威望
16
贡献
8
兑换币
9
注册时间
2021-4-15
在线时间
0 小时
跳转到指定楼层
1#
发表于 2021-6-28 21:22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
K车模我们用的是DMP来读取四元数,当我们加了卡尔曼的函数后,OLED上显示角度值直接变成了十几位数,这是什么原因?

读取DMP四元数:       
    res = LQ_DMP_Read();                                // 读取DMP四元数
    sprintf(txt, "%2d ", res);
    OLED_P6x8Str(0, 0, (u8*)txt);
    sprintf(txt, "%2.2f %2.2f ", Pitch, Roll);
    OLED_P6x8Str(0, 0, (u8*)txt);                
    sprintf(txt, "gyrox:%d   ", gyro[0]);
    OLED_P6x8Str(0, 2, (u8*)txt);
    sprintf(txt, "gyroy:%d   ", gyro[1]);
    OLED_P6x8Str(0, 3, (u8*)txt);
    sprintf(txt, "gyroz:%d   ", gyro[2]);
    OLED_P6x8Str(0, 4, (u8*)txt);
    sprintf(txt, "accelx:%d   ", accel[0]);
    OLED_P6x8Str(0, 5, (u8*)txt);
    sprintf(txt, "accely:%d   ", accel[1]);
    OLED_P6x8Str(0, 6, (u8*)txt);
    sprintf(txt, "accelz:%d   ", accel[2]);
    OLED_P6x8Str(0, 7, (u8*)txt);

使用卡尔曼函数:
  Kalman_Filter(accel[2],gyro[1]); //卡尔曼
        Angle_Balance = AngleKEM;

卡尔曼函数:
float  AngleKEM;
float angle_dot;        
float Q_angle=0.001;// 过程噪声的协方差
float Q_gyro=0.003; //0.003 过程噪声的协方差 过程噪声的协方差为一个一行两列矩阵
float R_angle=0.003;  // 测量噪声的协方差 既测量偏差
float dt=0.01;     //                 
char   C_0 = 1;
float Q_bias, Angle_err;
float PCt_0, PCt_1, E;
float K_0, K_1, t_0, t_1;
float Pdot[4] ={0,0,0,0};
float PP[2][2] = { { 1, 0 },{ 0, 1 } };

float Kalman_Filter(float Accel,float Gyro)               
{
  AngleKEM+=(Gyro - Q_bias) * dt; //先验估计   (1.预测)
  Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先验估计误差协方差的微分
  
  Pdot[1]=-PP[1][1];
  Pdot[2]=-PP[1][1];
  Pdot[3]=Q_gyro;
  PP[0][0] += Pdot[0] * dt;   // Pk-先验估计误差协方差微分的积分
  PP[0][1] += Pdot[1] * dt;   // =先验估计误差协方差
  PP[1][0] += Pdot[2] * dt;
  PP[1][1] += Pdot[3] * dt;
  
  Angle_err = Accel - AngleKEM;        //zk-先验估计
  
  PCt_0 = C_0 * PP[0][0];
  PCt_1 = C_0 * PP[1][0];
  
  E = R_angle + C_0 * PCt_0;
  
  K_0 = PCt_0 / E;
  K_1 = PCt_1 / E;
  
  t_0 = PCt_0;
  t_1 = C_0 * PP[0][1];
  

  
  AngleKEM += K_0 * Angle_err;           //后验估计
  Q_bias         += K_1 * Angle_err;           //后验估计
       
        PP[0][0] -= K_0*PP[0][0];  //更新协方差矩阵
  PP[0][1] -= K_0*PP[0][1];
        PP[1][0] -= K_1*PP[0][0];
        PP[1][0] -= K_1*PP[0][1];
       

}

回复

使用道具 举报

1

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
24
威望
16
贡献
8
兑换币
9
注册时间
2021-4-15
在线时间
0 小时
2#
 楼主| 发表于 2021-6-28 21:30:03 | 只看该作者
不用了,我知道问题在哪了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
26
威望
16
贡献
10
兑换币
11
注册时间
2021-4-11
在线时间
0 小时
3#
发表于 2021-6-29 21:49:29 | 只看该作者
a_naiping 发表于 2021-6-28 21:30
不用了,我知道问题在哪了

问题出在那里呀?

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 04:44 , Processed in 0.091326 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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