oifgjhk 发表于 2014-3-5 23:06:07

新手请教一下卡尔曼滤波

[ 本帖最后由 oifgjhk 于 2014-3-5 23:09 编辑 ]\n\n[ 本帖最后由 oifgjhk 于 2014-3-5 23:08 编辑 ]\n\n请大神帮忙看看,我这样理解卡尔曼滤波对不对...新手,还请见谅
#ifndef KALMAN_H
#define KALMAN_H


using namespace std;
class kalman;
class MPU_measure{
        friend class kalman;
public:
        MPU_measure(float f1, float f2) :angle_m(f1), gyro_m(f2){}
        MPU_measure() = default;
private:
        float angle_m;//加速度计测得的角度
        float gyro_m;//陀螺仪测得的角度
};
class kalman:MPU_measure{
public:
        kalman(float f1, float f2) :angle(0), angle_dot(0), q_bias(0), angle_err(0), Kg_0(0), Kg_1(0), MPU_measure(f1,f2){
                P = 1;
                P = 0;
                P = 0;
                P = 1;
                P_process = 0;
                P_process = 0;
                P_process = 0;
                P_process = 0;
        }
        float get_value(){
                return angle;
        }
        //向前推算状态变量(先验估计)
        void froward_forecast();
        //向前推算误差协方差
        void P_forecast();
        //计算kalman增益
        void calculate_Kg();
        //后验状态估计
        void backward_forecast();
        //更新误差协方差
        void P_update();
private:
        //kalman 滤波后得到的角度
        float angle, angle_dot;
        //固定值:角度过程噪声,   陀螺仪过程噪声, 测量噪声,   时间微分
        const float Q_angle = 0.001, Q_gyro = 0.003, R_angle = 0.5, dt = 0.0001;
        //协方差计算过程中的Q 过程噪声协方差
        float P_process;
        //协方差: ( P:angle 协方差) (P)(P:bias 协方差)(P:陀螺仪 协方差)
        float P;
        //偏差      观测过程的革新
        float q_bias, angle_err;
        // angle kalman增益 ,bias kalman增益
        float Kg_0, Kg_1;
        const char A = 1, B = 1, H = 1;
};
//公式中^表示估计,-表示先验
void kalman::froward_forecast()
{
        //公式 X^-(k)=AX^(k-1)+BU(k-1)+w(k)
        angle = A*angle + (gyro_m - q_bias)*dt;//先验估计

}
void kalman:: P_forecast()
{
        //公式P-(k)=AP(k-1)At+Q
        P_process = Q_angle - P - P;
        P_process = -P;
        P_process = -P;
        P_process = Q_gyro;
        P = A*P*A + P_process * dt;
        P = A*P*A + P_process * dt;
        P = A*P*A + P_process * dt;
        P = A*P*A + P_process * dt;
}
void kalman::calculate_Kg()
{
        //公式K(k)=(P-(k)Ht)/(HP-(k)Ht+R)
        Kg_0 = (P * H) / ((H*P * H) + R_angle);
        Kg_1 = (P * H) / ((H*P * H) + R_angle);
}
void kalman::backward_forecast()
{
        //公式X^(k)=X^-(k)+K(k)(Z(k)-HX^-(k))
        angle = angle + Kg_0*(angle_m - H*angle);
        q_bias = q_bias + Kg_1*(angle_m - H*angle);
}
void kalman:: P_update()
{
        //公式P(k)=(1-K(k)H)P-(k)
        P = P - Kg_0*H*P;
        P = P - Kg_0*H*P;
        P = P - Kg_1*H*P;
        P = P - Kg_1*H*P;
}

#endif

oifgjhk 发表于 2014-3-6 10:07:45

....没人....这是要沉

oifgjhk 发表于 2014-3-6 12:14:22

:'(貌似总是近似贴合于陀螺仪....

詹波波 发表于 2015-11-13 13:27:54

我现在已经对MPU6050出来的原始数据进行了四元数转欧拉角的数据融合 融合的时候用的是互补滤波 看帖子好像要对原始数据进行卡尔曼滤波 楼主是这个顺序么
页: [1]
查看完整版本: 新手请教一下卡尔曼滤波