搜索
bottom↓
回复: 20

求教高手分析卡尔曼函数

[复制链接]

出0入0汤圆

发表于 2013-4-24 17:36:51 | 显示全部楼层 |阅读模式
最近在研究MPU6050,在网上找的卡尔曼程序,但是带入得到的角度和角速度值不正确。我自己的理解输入参数angle_m是加速度测得的角度位置,gyro_m是陀螺仪测得的角速度。
输出angle是矫正后的角度位置,angle_dot是矫正后的角速度。不知道我的理解对不对,希望大侠能讲解一下!

//*
//-------------------------------------------------------
//Kalman滤波,8MHz的处理时间约1.8ms;
//-------------------------------------------------------
float angle, angle_dot;                 //外部需要引用的变量
//-------------------------------------------------------
float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.006;
                        //注意: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;//输出值(后验估计)的微分 = 角速度
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-4-24 19:16:32 来自手机 | 显示全部楼层
用过的人帮帮忙啊!

出0入0汤圆

 楼主| 发表于 2013-4-24 19:16:48 来自手机 | 显示全部楼层
用过的人帮帮忙啊!

出0入0汤圆

发表于 2013-5-20 22:04:00 | 显示全部楼层
我现在也在琢磨这个程序怎么回事,一头雾水。楼主现在理解的怎么样了?

出0入0汤圆

 楼主| 发表于 2013-5-21 08:49:02 | 显示全部楼层
牧羊人758 发表于 2013-5-20 22:04
我现在也在琢磨这个程序怎么回事,一头雾水。楼主现在理解的怎么样了?

没有使用这个函数,使用MPU6050内部DMP解决问题的。

出0入0汤圆

发表于 2013-5-21 20:21:25 | 显示全部楼层
本帖最后由 牧羊人758 于 2013-5-21 20:42 编辑
zhousf85 发表于 2013-5-21 08:49
没有使用这个函数,使用MPU6050内部DMP解决问题的。


你做的是多大的四轴?
DMP我只是听说过,也没有找到相关资料,楼主能不能分享一下啊。

出0入0汤圆

 楼主| 发表于 2013-5-22 11:36:48 | 显示全部楼层
牧羊人758 发表于 2013-5-21 20:21
你做的是多大的四轴?
DMP我只是听说过,也没有找到相关资料,楼主能不能分享一下啊。 ...

http://www.amobbs.com/forum.php? ... p;page=1#pid6678135

出0入0汤圆

发表于 2013-5-22 19:59:05 | 显示全部楼层
zhousf85 发表于 2013-5-22 11:36
http://www.amobbs.com/forum.php?mod=viewthread&tid=5533988&page=1#pid6678135

C++?
Arduino?
都完全不懂啊。
楼主能否分享下移植好的c文件?

出0入0汤圆

发表于 2013-5-22 21:13:55 | 显示全部楼层
牧羊人758 发表于 2013-5-20 22:04
我现在也在琢磨这个程序怎么回事,一头雾水。楼主现在理解的怎么样了?

怎么琢磨,拿本书,看懂原理,就能看懂程序了。

出0入0汤圆

 楼主| 发表于 2013-5-23 09:22:08 | 显示全部楼层
牧羊人758 发表于 2013-5-22 19:59
C++?
Arduino?
都完全不懂啊。

留个邮箱,可以发给你。

出0入0汤圆

发表于 2013-5-23 17:36:32 | 显示全部楼层
这个好像是PPZ上面带的那个简化版的程序吧。

出0入0汤圆

发表于 2013-5-23 18:15:35 | 显示全部楼层
asha 发表于 2013-5-23 17:36
这个好像是PPZ上面带的那个简化版的程序吧。

可以问下,他程序里的 R和Q是固定值,这是导致融合效果不好的重要原因吗?

出0入0汤圆

发表于 2013-5-24 08:14:09 | 显示全部楼层
zhousf85 发表于 2013-5-23 09:22
留个邮箱,可以发给你。

myr2012@yeah.net
谢谢啦!

出0入0汤圆

发表于 2013-5-28 08:08:26 | 显示全部楼层
看了你发给我的project,里面涉及到很多dmp的寄存器,我那个英文datasheet里没有啊,请问楼主有包含dmp这部分的完整版datasheet吗?如果没有的话在dmpInitialize()这个函数里的相关设置要怎么设置呢?

出0入0汤圆

 楼主| 发表于 2013-5-29 08:46:07 | 显示全部楼层
牧羊人758 发表于 2013-5-28 08:08
看了你发给我的project,里面涉及到很多dmp的寄存器,我那个英文datasheet里没有啊,请问楼主有包含dmp这部 ...

那些寄存器,datasheet没有做介绍,你参照程序修改I2C就行了。

出0入0汤圆

发表于 2013-5-29 15:16:11 | 显示全部楼层
zhousf85 发表于 2013-5-29 08:46
那些寄存器,datasheet没有做介绍,你参照程序修改I2C就行了。

那程序下载到单片机,单片机再通过IIC把代码写入mpu6050里。那代码是写在了6050的RAM里还是ROM里呢?也就是掉电会不会丢失啊?
如果不丢失的话,我们怎么把6050还原到原来不用dmp的状态啊?

出0入0汤圆

 楼主| 发表于 2013-5-30 09:39:04 | 显示全部楼层
牧羊人758 发表于 2013-5-29 15:16
那程序下载到单片机,单片机再通过IIC把代码写入mpu6050里。那代码是写在了6050的RAM里还是ROM里呢?也就 ...

单片机只是给mpu6050初始化寄存器,掉电后自然恢复初始值,没有RAM或ROM。每次上电都是初始化寄存器,dmp只是MPU6050内部硬件实现功能。

出0入0汤圆

发表于 2013-5-30 20:01:22 | 显示全部楼层
zhousf85 发表于 2013-5-30 09:39
单片机只是给mpu6050初始化寄存器,掉电后自然恢复初始值,没有RAM或ROM。每次上电都是初始化寄存器,dmp ...

懂了
只是看到网上有人说是刷固件,以为像手机刷机一样呢。

出0入0汤圆

发表于 2013-7-21 10:32:43 | 显示全部楼层
最近也在琢磨这个问题,也一直想用DMP,求大侠发一份。996512682@QQ.COM

出0入0汤圆

发表于 2013-7-30 19:54:57 | 显示全部楼层
知道q_bias是什么不??

出0入0汤圆

发表于 2013-8-1 10:53:05 | 显示全部楼层
没有具体看算法。。我的理解是 卡尔曼滤波那5条公式可以不用理它  直接代入就行 通过上位机整定参数就能用了。。。。新手飘过。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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