搜索
bottom↓
回复: 7

卡尔曼真的很难懂啊 一起分析分析(网上最长看到得代码)

[复制链接]

出0入0汤圆

发表于 2012-9-3 15:58:20 | 显示全部楼层 |阅读模式
先贴代码吧。
    static float angle, angle_dot;                 //外部需要引用的变量


//Kalman滤波
//-------------------------------------------------------

//-------------------------------------------------------
static  float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.5;                        //注意:dt的取值为kalman滤波器采样时间;
static float Pk[2][2] = { {1, 0 }, {0, 1 }};       
static float Pdot[4] ={0,0,0,0};
static const char C_0 = 1;
static 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)                //角度  角速度       
{
        angle        =        angle                +        (gyro_m-q_bias) * dt;                                  //角度      =     角度  +(角速度测量值-偏移)*时间dt  
             // X(k|k-1) =        X(k-1|k-1)                           +                       U(k)  (1)                         //          X(k|k-1)= X(k-1|k-1)+        U(k)  (1)
        Pdot[0]=Q_angle - Pk[0][1] - Pk[1][0];
        Pdot[1]=- Pk[1][1];
        Pdot[2]=- Pk[1][1];
        Pdot[3]=Q_gyro;       

        Pk[0][0]=Pk[0][0] + Pdot[0] * dt;
              //P(k|k-1)
        Pk[0][1]=Pk[0][1] + Pdot[1] * dt;
        Pk[1][0]=Pk[1][0] + Pdot[2] * dt;
        Pk[1][1]=Pk[1][1] + Pdot[3] * dt;
               
        angle_err = angle_m - angle;  //   Z(k)-H X(k|k-1)
                                //Z(k)     - X(k|k-1)
        PCt_0 = C_0 * Pk[0][0];        //P(k|k-1)*H’
        PCt_1 = C_0 * Pk[1][0];
       
        E = R_angle +  C_0 * PCt_0;          
               // R     + (H P(k|k-1) H’)
         
        K_0 = PCt_0       /  E;       
           //Kg(k) = P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
        K_1 = PCt_1 / E;
       
        t_0 = PCt_0;
        t_1 = C_0 * Pk[0][1];

        Pk[0][0] =Pk[0][0] - K_0 * t_0;
        Pk[0][1] =Pk[0][1] - K_0 * t_1;
        Pk[1][0] =Pk[1][0] - K_1 * t_0;
        Pk[1][1] =Pk[1][1] - K_1 * t_1;
       
        angle        =angle        + K_0 * angle_err;  //X(k|k)= X(k|k-1) + Kg(k)(Z(k)-H X(k|k-1)) ……… (3)          
        q_bias        =q_bias        + K_1 * angle_err;
        angle_dot = gyro_m-q_bias;
}

第一句最好懂,就是卡尔曼的第一条公式,增加了q_bias 修正值。(这个值如何进行循环修正就不知道了)
Pdot数组和Pk数组就不太明白了,PK应该是协方差的意思吧。还有协方差到底是如何进行计算的也不太清楚。网上的资料太深了。
angle_err 好理解 公式三的部分值,。。。。。。。

我把自己觉得代码对于的公式都标出来了。当然也不一定对应了。。
其他的就没头绪了 ,网上资料也不好找,协方差和装置矩阵的计算也看不懂。。。


所以希望大家一起分析啦。就当学习咯。。。网上大牛的文章又看不懂,而且和代码对应不起来啊

出0入0汤圆

发表于 2012-9-3 16:18:36 | 显示全部楼层
帮顶。不懂这些。

出0入0汤圆

 楼主| 发表于 2012-9-3 16:28:55 | 显示全部楼层
ahuang227 发表于 2012-9-3 16:18
帮顶。不懂这些。

谢谢支持

出0入0汤圆

发表于 2012-9-4 17:04:38 | 显示全部楼层
我也想分析,但好像先做模型吧

出0入0汤圆

 楼主| 发表于 2012-9-4 17:20:51 | 显示全部楼层
robotkid 发表于 2012-9-4 17:04
我也想分析,但好像先做模型吧

这个不是网上很常见的加速度 、角速度   通过卡尔曼计算实际角度的代码么?
要什么模型啊。

出0入0汤圆

发表于 2012-9-4 17:33:49 | 显示全部楼层
本帖最后由 pww999 于 2012-9-4 17:45 编辑

学习了 顶个

出0入0汤圆

发表于 2012-9-4 17:39:08 | 显示全部楼层
帮顶  正在学习

出0入0汤圆

发表于 2012-9-4 17:53:35 | 显示全部楼层
用互补滤波也可以啊   这个简单
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-30 07:25

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

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