中级会员
- 积分
- 488
- 威望
- 296
- 贡献
- 76
- 兑换币
- 2
- 注册时间
- 2011-10-27
- 在线时间
- 58 小时
|
想问下 你的卡尔曼是不是用这个
void Kalman_Filter(float angle_m,float gyro_m) //gyro_m:gyro_measure
{
angle+=(gyro_m-q_bias) * dt;//先验估计
Pdot[0]=Q_angle - P[0][1] - P[1][0];// Pk-' 先验估计误差协方差的微分
Pdot[1]=- P[1][1];
Pdot[2]=- P[1][1];
Pdot[3]=Q_gyro;
//更新协方差矩阵 其中
*
* state_update is called every dt with a biased gyro measurement
* by the user of the module. It updates the current angle and
* rate estimate.
*
* The pitch gyro measurement should be scaled into real units, but
* does not need any bias removal. The filter will track the bias.
*
* A = [ 0 -1 ]
* [ 0 0 ]
*/
*
* Compute the derivative of the covariance matrix
* (equation 22-1)
* Pdot = A*P + P*A' + Q
*
*/
P[0][0] += Pdot[0] * dt;// Pk- 先验估计误差协方差微分的积分 = 先验估计误差协方差
P[0][1] += Pdot[1] * dt;
P[1][0] += Pdot[2] * dt;
P[1][1] += Pdot[3] * dt;
angle_err = angle_m - angle;//zk-先验估计
PCt_0 = C_0 * P[0][0];
PCt_1 = C_0 * P[1][0];
//误差估计 算出卡尔曼滤波
E = R_angle + C_0 * PCt_0; //R_angle为测量噪声(white gaussian noise)
//更新卡尔曼滤波增益
K_0 = PCt_0 / E;//Kk
K_1 = PCt_1 / E;
//t_0,t_1为测量系统参数,为下面的后验协方差提供。
t_0 = PCt_0;
t_1 = C_0 * P[0][1];
//由卡尔曼增益更新协方差。
P[0][0] -= K_0 * t_0;//后验估计误差协方差
P[0][1] -= K_0 * t_1;
P[1][0] -= K_1 * t_0;
P[1][1] -= K_1 * t_1;
//现在状态的最优估算
angle += K_0 * angle_err;//后验估计
q_bias += K_1 * angle_err;//后验估计
angle_dot = gyro_m-q_bias;//输出值(后验估计)的微分 = 角速度
} |
|