二维卡尔曼滤波应用

关于卡尔曼滤波的理解@wang_22ok

二维卡尔曼滤波应用

卡尔曼滤波的五大黄金公式如下:
在这里插入图片描述

关于位置与速度的卡尔曼滤波

首先位置和速度的关系如下: (1) x ( t ) = x ( t − 1 ) + x ( t − 1 ) Δ T + 1 2 a ( Δ T ) 2 v ( t ) = v ( t − 1 ) + a Δ T \begin{array}{l} x(t) = x(t - 1) + x(t - 1)\Delta T + \frac{1}{2}a{(\Delta T)^2}\\ v(t) = v(t - 1) + a\Delta T \end{array}\tag1 x(t)=x(t1)+x(t1)ΔT+21a(ΔT)2v(t)=v(t1)+aΔT(1)
上式两个表达式写成矩阵的形式如下:
(2) [ x ( t ) v ( t ) ] = [ 1 Δ T 0 1 ] [ x ( t − 1 ) v ( t − 1 ) ] + [ ( Δ T ) 2 2 Δ T ] a \left[ \begin{matrix} x(t)\\ v(t) \end{matrix} \right] = \left[ {\begin{matrix} 1&{\Delta T}\\ 0&1 \end{matrix}} \right]\left[ \begin{array}{l} x(t - 1)\\ v(t - 1) \end{array} \right] + \left[ \begin{array}{l} \frac{{{{(\Delta T)}^2}}}{2}\\ \Delta T \end{array} \right]a\tag2 [x(t)v(t)]=[10ΔT1][x(t1)v(t1)]+[2(ΔT)2ΔT]a(2)
其中, a a a为加速度。

由卡尔曼滤波的算法流程:

  1. 状态向量预处理方程:
    (3) X k − = A X k − 1 + B U k X_k^{ - } = AX_{k-1} + BU_k\tag3 Xk=AXk1+BUk(3)
    由公式(2),有: A = [ 1 Δ T 0 1 ] , B = [ l ( Δ T ) 2 2 Δ T ] A = \left[ {\begin{matrix} 1&{\Delta T}\\ 0&1 \end{matrix}} \right],B = \left[ \begin{matrix}{l} \frac{{{{(\Delta T)}^2}}}{2}\\ \Delta T \end{matrix} \right] A=[10ΔT1],B=[l2(ΔT)2ΔT]
    简化: x ( t ) = x ( t − 1 ) + v ( t − 1 ) ∗ Δ T + ( Δ T ) 2 2 ∗ a ; v ( t ) = v ( t − 1 ) + a ∗ Δ T ; \begin{array}{l} x(t) = x(t - 1) + v(t - 1)*\Delta T + \frac{{{{(\Delta T)}^2}}}{2}*a;\\ v(t) = v(t - 1) + a*\Delta T; \end{array} x(t)=x(t1)+v(t1)ΔT+2(ΔT)2a;v(t)=v(t1)+aΔT;
  2. 状态向量计算预处理协方差矩阵:
    (4) P k − = A P k − 1 A T + Q P_k^{ - } = AP_{k-1}{A^T} + Q\tag4 Pk=APk1AT+Q(4)
    有:
    P k − = [ P k 1 − P k 2 − P k 3 − P k 4 − ] = [ 1 Δ T 0 1 ] ∗ [ P ( k − 1 ) 1 P ( k − 1 ) 2 P ( k − 1 ) 3 P ( k − 1 ) 4 ] ∗ [ 1 0 Δ T 1 ] + [ Q 1 Q 2 Q 3 Q 4 ] {P_k^{ - }} = \left[ {\begin{matrix} {{P_{k1}^{ - }}}&{{P_{k2}^{ - }}}\\ {{P_{k3}^{ - }}}&{{P_{k4}^{ - }}} \end{matrix}} \right] = \left[ {\begin{matrix} 1&{\Delta T}\\ 0&1 \end{matrix}} \right]*\left[ {\begin{matrix} {{P_{(k - 1)1}}}&{{P_{(k - 1)2}}}\\ {{P_{(k - 1)3}}}&{{P_{(k - 1)4}}} \end{matrix}} \right]*\left[ {\begin{matrix} 1&0\\ {\Delta T}&1 \end{matrix}} \right] + \left[ {\begin{matrix} {{Q_1}}&{{Q_2}}\\ {{Q_3}}&{{Q_4}} \end{matrix}} \right] Pk=[Pk1Pk3Pk2Pk4]=[10ΔT1][P(k1)1P(k1)3P(k1)2P(k1)4][1ΔT01]+[Q1Q3Q2Q4]
    简化: P k 1 − = ( P ( k − 1 ) 1 + P ( k − 1 ) 3 ∗ Δ T ) + ( P ( k − 1 ) 2 + P ( k − 1 ) 4 ∗ Δ T ) ∗ Δ T + Q 1 ; P k 2 − = P ( k − 1 ) 2 + P ( k − 1 ) 4 ∗ Δ T + Q 2 ; P k 3 − = P ( k − 1 ) 3 + P ( k − 1 ) 4 ∗ Δ T + Q 2 ; P k 4 − = P ( k − 1 ) 4 + Q 4 ; \begin{array}{l} {P_{k1}^{ - }} = ({P_{(k - 1)1}} + {P_{(k - 1)3}}*\Delta T) + ({P_{(k - 1)2}} + {P_{(k - 1)4}}*\Delta T)*\Delta T + {Q_1};\\ {P_{k2}^{ - }} = {P_{(k - 1)2}} + {P_{(k - 1)4}}*\Delta T + {Q_2};\\ {P_{k3}^{ - }} = {P_{(k - 1)3}} + {P_{(k - 1)4}}*\Delta T + {Q_2};\\ {P_{k4}^{ - }} = {P_{(k - 1)4}} + {Q_4}; \end{array} Pk1=(P(k1)1+P(k1)3ΔT)+(P(k1)2+P(k1)4ΔT)ΔT+Q1;Pk2=P(k1)2+P(k1)4ΔT+Q2;Pk3=P(k1)3+P(k1)4ΔT+Q2;Pk4=P(k1)4+Q4;
  3. Kalman增益矩阵:
    (5) K k = P k − H T ( H P k − 1 H T + R k ) − 1 {K_k} = P_k^{ - }H^T{({H}P_k^{ - 1}H^T + {R_k})^{ - 1}}\tag5 Kk=PkHT(HPk1HT+Rk)1(5)
  4. 状态向量更新方程:
    (6) X k = X k − + K k ( Z k − H X k − ) {X_k} = X_k^ - + {K_k}({Z_k} - {H}X_k^ - )\tag6 Xk=Xk+Kk(ZkHXk)(6)
  5. 状态向量协方差更新方程:
    (7) P k = ( I − K k H ) P k − {P_k} = (I - {K_k}{H})P_k^ - \tag7 Pk=(IKkH)Pk(7)

程序如下:

typedef struct {
      float x[2];     /* state: [0]-angle [1]-diffrence of angle, 2x1 */
      float A[2][2];  /* X(n)=A*X(n-1)+U(n),U(n)~N(0,q), 2x2 */
      float H[2][2];     /* Z(n)=H*X(n)+W(n),W(n)~N(0,r), 1x2   */
      float q[2];     /* process(predict) noise convariance,2x1 [q0,0; 0,q1] */
      float r[2][2];        /* measure noise convariance */
      float p[2][2];  /* estimated error convariance,2x2 [p0 p1; p2 p3] */
      float gain[2][2];  /* 2x1 */
	  float B[2];
} kalman2_state;       


void kalman2_init(kalman2_state_Wang *state)//, float *init_x, float (*init_p)[2]//×îºóÖ»Ðèµ÷ÊÔq[0],q[1];
{
//    state->x[0]    = init_x[0];
//    state->x[1]    = init_x[1];
//    state->p[0][0] = init_p[0][0];
//    state->p[0][1] = init_p[0][1];
//    state->p[1][0] = init_p[1][0];
//    state->p[1][1] = init_p[1][1];
	  state->x[0]    = 0;
	  state->x[1]    = 0;
      state->p[0][0] = 1;
      state->p[0][1] = 0;
      state->p[1][0] = 0;
      state->p[1][1] = 1;
//	  state->A       = {{1, 0.1}, {0, 1}};
      state->A[0][0] = 1;
      state->A[0][1] = 0.01;//1;//t¿É±ä  Á½¸öÎïÀíʱ¿ÌµÄ²î2ms      PID_PIT.I*0.27;//0.0027
      state->A[1][0] = 0;
      state->A[1][1] = 1;
//	  state->H       = {1,0};
      state->H[0][0] = 1;
      state->H[0][1] = 0;//1
	  state->H[1][0] = 0;
	  state->H[1][1] = 0;
//    state->q       = {{10e-6,0}, {0,10e-6}};  /* measure noise convariance */		
	  state->q[0]    = 5*10e-8;//5;//0.0001;//10e-7;//10e-7;
      state->q[1]    = 5*10e-8;//10e-6;//0.5;//0.0035;//5*10e-7;
      state->r[0][0] = 1*10e-7;//10e-4;//52.4586;//0.1;//10e-3;//10e-7;  /* estimated error convariance */PID_ROL.D*
	  state->r[0][1] = 0;
	  state->r[1][0] = 0;
	  state->r[1][1] = 4*10e-4;
//    state->B		
	  state->B[0]    = state->A[0][1]* state->A[0][1]/2.0;
	  state->B[1]    = state->A[0][1];
}

float kalman2_filter(kalman2_state_Wang *state, float x_weiyi,float x_speed,float a)//£¨¶þά¿¨¶ûÂüÂ˲¨£©Ö»±äÒ»¸ö£¬Ðè¸Ä½øλÒÆ¡¢ËÙ¶È,ÕæÕýµÄ¼ÓËٶȣ¨Ð޸ĺó£©
{
		float temp0 = 0.0f;
		float temp1 = 0.0f;
		float temp0_0 = 0.0f;
		float temp0_1 = 0.0f;
		float temp1_0 = 0.0f;
		float temp1_1 = 0.0f;
		float temp00 = 0.0f;
		float temp01 = 0.0f;
		float temp10 = 0.0f;
		float temp11 = 0.0f;

    /* Step1: Predict X(k+1)= A*X(k) +B*U(k)*/
		state->x[0] = state->A[0][0] * state->x[0] + state->A[0][1] * state->x[1]+state->B[0]*a;//ת»»Íê×ø±ê·½¿ÉʹÓÃ
		state->x[1] = state->A[1][0] * state->x[0] + state->A[1][1] * state->x[1]+state->B[1]*a;
    /* Step2: Covariance Predict P(k+1)=A*P(k)*(A^T)+Q;*/
		state->p[0][0] = (state->p[0][0]+state->p[1][0]*state->A[0][1])+(state->p[0][1]+state->p[1][1]*state->A[0][1])*state->A[0][1]+state->q[0];
		state->p[0][1] = state->p[0][1]+state->p[1][1]*state->A[0][1];//+state->q[0];
		state->p[1][0] = state->p[1][0]+state->p[1][1]*state->A[0][1];//+state->q[1];
		state->p[1][1] = state->p[1][1]+state->q[1];
    /* Step3: Gain Measurement : gain = p * H^T * [r + H * p * H^T]^(-1), H^T means transpose.  µÚÈý¸ö¹«Ê½×ª»»*/
		temp0_0  = (state->p[0][0] +state->r[0][0])*(state->p[1][1] +state->r[1][1])-(state->p[0][1] +state->r[0][1])*(state->p[1][0] +state->r[1][0]);//ÕýÈ·//r¶Ô½ÇÕó
		temp0_1  = (state->p[0][0] +state->r[0][0])*(state->p[1][1] +state->r[1][1])-(state->p[0][1] +state->r[0][1])*(state->p[1][0] +state->r[1][0]);
		temp1_0  = (state->p[0][0] +state->r[0][0])*(state->p[1][1] +state->r[1][1])-(state->p[0][1] +state->r[0][1])*(state->p[1][0] +state->r[1][0]);
		temp1_1  = (state->p[0][0] +state->r[0][0])*(state->p[1][1] +state->r[1][1])-(state->p[0][1] +state->r[0][1])*(state->p[1][0] +state->r[1][0]);		
		temp00  =   state->p[1][1] / temp0_0;
		temp01  =  -state->p[0][1] / temp0_1;
		temp10  =  -state->p[1][0] / temp1_0;
		temp11  =   state->p[0][0] / temp1_1;	
		state->gain[0][0] = state->p[0][0]* temp00 + state->p[0][1]* temp10;
		state->gain[0][1] = state->p[0][0]* temp01 + state->p[0][1]* temp11;
		state->gain[1][0] = state->p[1][0]* temp00 + state->p[1][1]* temp10;
		state->gain[1][1] = state->p[1][0]* temp01 + state->p[1][1]* temp11;
    /* Step4: Status Update : x(n|n) = x(n|n-1) + gain(n) * [z_measure - H(n)*x(n|n-1)]*/
		state->x[0] = state->x[0] + state->gain[0][0] * (x_weiyi - state->x[0])+ state->gain[0][1] * (x_speed - state->x[1]); //ΪºÎÖ»ÓÃÒ»¸ö²ÎÊý
		state->x[1] = state->x[1] + state->gain[1][0] * (x_weiyi - state->x[0])+ state->gain[1][1] * (x_speed - state->x[1]); 
    /* Step5: Covariance Update p: p(n|n) = [I - gain * H] * p(n|n-1)  ¸üÐÂp*/
		temp0=state->p[0][0];
		temp1=state->p[0][1];
		state->p[0][0] = (1 - state->gain[0][0] ) * state->p[0][0]-(state->gain[0][1]* state->p[1][0]);
		state->p[0][1] = (1 - state->gain[0][0] ) * state->p[0][1]-(state->gain[0][1]* state->p[1][1]);
		state->p[1][0] = (1 - state->gain[1][1] ) * state->p[1][0]-state->gain[1][0]* temp0;//state->p[0][0]
		state->p[1][1] = (1 - state->gain[1][1] ) * state->p[1][1]-state->gain[1][0]* temp1;//state->p[0][1]

    return 1;
}


//z轴kalman滤波初始化,初始化时用
kalman2_init(&BaroAlt_klm);
//输入气压计高度,速度和惯性坐标下的加速度---------输出高度和速度
kalman2_filter(&BaroAlt_klm, BaroAltoo,0,az_c);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值