|
下面是我看到别人写的多维卡尔曼滤波程序,实在是看不明白,请高手们详细的分享一下你们的调试经验和关于这段程序的解读。不胜感激
void Kalman_Filter_X(float Accel, float Gyro) //¿¨¶ûÂüº¯Êý
{
Angle_X_Final += (Gyro - Q_bias_x) * dt; //ÏÈÑé¹À¼Æ
Pdot[0] = Q_angle - PP[0][1] - PP[1][0]; // Pk-ÏÈÑé¹À¼ÆÎó²îз½²îµÄ΢·Ö
Pdot[1] = -PP[1][1];
Pdot[2] = -PP[1][1];
Pdot[3] = Q_gyro;
PP[0][0] += Pdot[0] * dt; // Pk-ÏÈÑé¹À¼ÆÎó²îз½²î΢·ÖµÄ»ý·Ö
PP[0][1] += Pdot[1] * dt; // =ÏÈÑé¹À¼ÆÎó²îз½²î
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;
Angle_err_x = Accel - Angle_X_Final; //zk-ÏÈÑé¹À¼Æ
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0; //ºóÑé¹À¼ÆÎó²îз½²î
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
Angle_X_Final += K_0 * Angle_err_x; //ºóÑé¹À¼Æ
Q_bias_x += K_1 * Angle_err_x; //ºóÑé¹À¼Æ
Gyro_x = Gyro - Q_bias_x; //Êä³öÖµ(ºóÑé¹À¼Æ)µÄ΢·Ö=½ÇËÙ¶È
}
void Kalman_Filter_Y(float Accel, float Gyro) //¿¨¶ûÂüº¯Êý
{
Angle_Y_Final += (Gyro - Q_bias_y) * dt; //ÏÈÑé¹À¼Æ
Pdot[0] = Q_angle - PP[0][1] - PP[1][0]; // Pk-ÏÈÑé¹À¼ÆÎó²îз½²îµÄ΢·Ö
Pdot[1] = -PP[1][1];
Pdot[2] = -PP[1][1];
Pdot[3] = Q_gyro;
PP[0][0] += Pdot[0] * dt; // Pk-ÏÈÑé¹À¼ÆÎó²îз½²î΢·ÖµÄ»ý·Ö
PP[0][1] += Pdot[1] * dt; // =ÏÈÑé¹À¼ÆÎó²îз½²î
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;
Angle_err_y = Accel - Angle_Y_Final; //zk-ÏÈÑé¹À¼Æ
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0; //ºóÑé¹À¼ÆÎó²îз½²î
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
Angle_Y_Final += K_0 * Angle_err_y; //ºóÑé¹À¼Æ
Q_bias_y += K_1 * Angle_err_y; //ºóÑé¹À¼Æ
Gyro_y = Gyro - Q_bias_y; //Êä³öÖµ(ºóÑé¹À¼Æ)µÄ΢·Ö=½ÇËÙ¶È
}
void Kalman_Filter_Z(float Accel, float Gyro) //¿¨¶ûÂüº¯Êý
{
Angle_Z_Final += (Gyro - Q_bias_z) * dt; //ÏÈÑé¹À¼Æ
Pdot[0] = Q_angle - PP[0][1] - PP[1][0]; // Pk-ÏÈÑé¹À¼ÆÎó²îз½²îµÄ΢·Ö
Pdot[1] = -PP[1][1];
Pdot[2] = -PP[1][1];
Pdot[3] = Q_gyro;
PP[0][0] += Pdot[0] * dt; // Pk-ÏÈÑé¹À¼ÆÎó²îз½²î΢·ÖµÄ»ý·Ö
PP[0][1] += Pdot[1] * dt; // =ÏÈÑé¹À¼ÆÎó²îз½²î
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;
Angle_err_z = Accel - Angle_Z_Final; //zk-ÏÈÑé¹À¼Æ
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0; //ºóÑé¹À¼ÆÎó²îз½²î
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
Angle_Z_Final += K_0 * Angle_err_z; //ºóÑé¹À¼Æ
Q_bias_z += K_1 * Angle_err_z; //ºóÑé¹À¼Æ
Gyro_z = Gyro - Q_bias_z; //Êä³öÖµ(ºóÑé¹À¼Æ)µÄ΢·Ö=½ÇËÙ¶È
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|