qq325600 发表于 2012-9-3 15:58:20

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

先贴代码吧。
    static float angle, angle_dot;                 //外部需要引用的变量


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

//-------------------------------------------------------
staticfloat Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.5;                        //注意:dt的取值为kalman滤波器采样时间;
static float Pk = { {1, 0 }, {0, 1 }};       
static float Pdot ={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=Q_angle - Pk - Pk;
        Pdot=- Pk;
        Pdot=- Pk;
        Pdot=Q_gyro;       

        Pk=Pk + Pdot * dt;
            //P(k|k-1)
        Pk=Pk + Pdot * dt;
        Pk=Pk + Pdot * dt;
        Pk=Pk + Pdot * dt;
               
        angle_err = angle_m - angle;//   Z(k)-H X(k|k-1)
                              //Z(k)   - X(k|k-1)
        PCt_0 = C_0 * Pk;        //P(k|k-1)*H’
        PCt_1 = C_0 * Pk;
       
        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;

        Pk =Pk - K_0 * t_0;
        Pk =Pk - K_0 * t_1;
        Pk =Pk - K_1 * t_0;
        Pk =Pk - 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 好理解 公式三的部分值,。。。。。。。

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


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

ahuang227 发表于 2012-9-3 16:18:36

帮顶。不懂这些。

qq325600 发表于 2012-9-3 16:28:55

ahuang227 发表于 2012-9-3 16:18 static/image/common/back.gif
帮顶。不懂这些。

谢谢支持

robotkid 发表于 2012-9-4 17:04:38

我也想分析,但好像先做模型吧

qq325600 发表于 2012-9-4 17:20:51

robotkid 发表于 2012-9-4 17:04 static/image/common/back.gif
我也想分析,但好像先做模型吧

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

pww999 发表于 2012-9-4 17:33:49

本帖最后由 pww999 于 2012-9-4 17:45 编辑

学习了 顶个

csuwu_qi 发表于 2012-9-4 17:39:08

帮顶正在学习

walle531 发表于 2012-9-4 17:53:35

用互补滤波也可以啊   这个简单
页: [1]
查看完整版本: 卡尔曼真的很难懂啊 一起分析分析(网上最长看到得代码)