OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3115|回复: 5

请问用卡尔曼滤波算mpu6050角度 为什么静止时角度一直往上升

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2022-2-8
在线时间
8 小时
发表于 2022-4-5 15:24:59 | 显示全部楼层 |阅读模式
2金钱
请问用卡尔曼滤波算mpu6050角度  为什么静止时角度一直往上升,请大神帮我看一下是哪里出现了问题,谢谢!

void Kalman_Filter_X(float Angle_acc,float Gyro) //对x进行卡尔曼滤波
{
        //step1:先验估计
        Angle_X+=(Gyro-bias)*dt;
       
        //stpe2:先验误差协方差
        P[0][0]=0.0f;
        P[0][1]=0.0f;
        P[1][0]=0.0f;
        P[1][1]=0.0f;
       
        P[0][0]+=dt*(dt*P[1][1]-P[0][1]-P[1][0]+Q_angle);
        P[0][1]-=dt*P[1][1];
        P[1][0]-=dt*P[1][1];
        P[1][1]+=dt*Q_bias;
       
        //step3:计算卡尔曼增益
        S=P[0][0]+R_measure;
       
        K[0]=P[0][0]/S;
        K[1]=P[1][0]/S;
       
       
       
        //step5:更新误差协方差
        P00_temp=P[0][0];
  P01_temp=P[0][1];
       
        P[0][0]-=K[0]*P00_temp;
        P[0][1]-=K[0]*P01_temp;
        P[1][0]-=K[1]*P00_temp;
        P[1][1]-=K[1]*P01_temp;
       
        //step4:后验估计协方差
        Angle_err=Angle_acc-Angle_X;   
       
        Angle_X+=K[0]*Angle_err;
        bias+=K[1]*Angle_err;
        Gyro-=bias;
}

void Kalman_Filter_Y(float Angle_acc,float Gyro) //对y进行卡尔曼滤波
{
        Angle_Y+=(Gyro-bias)*dt;
       
        P[0][0]=0.0;
        P[0][1]=0.0;
        P[1][0]=0.0;
        P[1][1]=0.0;
       
        P[0][0]+=dt*(dt*P[1][1]-P[0][1]-P[1][0]+Q_angle);
        P[0][1]-=dt*P[1][1];
        P[1][0]-=dt*P[1][1];
        P[1][1]+=dt*Q_bias;
       
        S=P[0][0]+R_measure;
        K[0]=P[0][0]/S;
        K[1]=P[0][1]/S;
       

       
  P00_temp=P[0][0];
  P01_temp=P[0][1];
       
        P[0][0]-=K[0]*P00_temp;
        P[0][1]-=K[0]*P01_temp;
        P[1][0]-=K[1]*P00_temp;
        P[1][1]-=K[1]*P01_temp;
       
         Angle_err=Angle_acc-Angle_Y;   
        Angle_Y+=K[0]*Angle_err;
        bias+=K[1]*Angle_err;
        Gyro-=bias;
}

        while(1)
{       

                 //1.读取原始数据
        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);   //读取陀螺仪传感器原始数据&
        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);  //读取加速度传感器原始数据
       
        //2.处理加速度原始值
        Accel_x=aacx/16384;   //计算x轴加速度
        Accel_y=aacy/16384;   //计算y轴加速度
        Accel_z=aacz/16384;   //计算z轴加速度
         
        //3.处理角速度原始值
        Gyro_x=gyrox/16.4;        //计算x轴角速度
        Gyro_y=gyroy/16.4;        //计算y轴角速度
        Gyro_z=gyroz/16.4;        //计算z轴角速度
       
        //4.计算两个轴和水平面之间的夹角(利用反正切公式)
        Angle_x=atan2(Accel_x,Accel_z)*180/3.14;   //x轴的夹角
        Angle_y=atan2(Accel_y,Accel_z)*180/3.14;   //y轴的夹角
       
       
        //5.调用卡尔曼函数
        delay_ms(50);//延时
        Kalman_Filter_X(Angle_x,Gyro_y);
        Kalman_Filter_Y(Angle_y,Gyro_x);

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2022-2-8
在线时间
8 小时
 楼主| 发表于 2022-4-5 15:29:24 | 显示全部楼层
x角升到了15.98,y角升到了80.06,增加就开始变慢了,但还是会增加
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2022-2-8
在线时间
8 小时
 楼主| 发表于 2022-4-5 15:43:57 | 显示全部楼层
已经解决了
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2022-2-8
在线时间
8 小时
 楼主| 发表于 2022-4-6 02:29:45 来自手机 | 显示全部楼层
不行,还是没有解决,而且角度一点都不准,不会跟着模块的摆动而变化,只是自身不断在变化
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-11-30
在线时间
2 小时
发表于 2022-5-16 00:11:23 | 显示全部楼层
每次调用后的值会更新,是不是没有保存调用后的值?还有就是,你传入陀螺仪的角速度值?为啥不是传入陀螺仪解算后的姿态角诶
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-11-30
在线时间
2 小时
发表于 2022-5-16 00:14:24 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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