常驻嘉宾
- 积分
- 3787
- 威望
- 1857
- 贡献
- 918
- 兑换币
- 704
- 注册时间
- 2012-3-12
- 在线时间
- 506 小时
|
我用的是矩阵式卡尔曼滤波,代码如下
float dt=0.005; //采样周期
float P[2][2]={{1,0},{0,1}};
//float g_fcarspeed;
float q_bias=0;
float rate, angle_dot;
float R_angle=0.001; //加速度计测量误差协方差
float Q_angle = 0.001; //系统过程噪声协方差矩阵
float Q_gyro = 0.0015; //数值越小表明越信任
//A=[0 -1]
// [0 0]
float q;
float Pdot[4];
void state_update(void)
{
//float angle_err;
// float PHt_0 , PHt_1;
// float E,K_0,K_1,Y_0,Y_1;
q = g_fanglespeed - q_bias; //先验估计 当前角速度=测量值-偏差
g_fcarspeed += q*dt; //角速度积分累加到估计角度
//计算协方差矩阵的微分
Pdot[0] = Q_angle - P[0][1] - P[1][0];
Pdot[1] = -P[1][1];
Pdot[2] = -P[1][1];
Pdot[3] = Q_gyro;
rate = q; //保存陀螺仪的无偏估计值
//更新协方差矩阵
P[0][0]+=Pdot[0]*dt;
P[0][1]+=Pdot[0]*dt;
P[1][0]+=Pdot[0]*dt;
P[1][1]+=Pdot[0]*dt;
}
float h_0 = 1;
float angle_err;
float PHt_0 , PHt_1;
float E,K_0,K_1,Y_0,Y_1;
float angle_dot ;
void kalman_update(void)
{
angle_err =g_fgravityangle - g_fcarspeed; //计算测量角度和观测的角度的误差
PHt_0=h_0*P[0][0];
PHt_1=h_0*P[1][0];
//计算误差估计 E=HPH' + R
E = R_angle+(h_0*PHt_0);
//计算卡尔曼增益
K_0 = PHt_0 *1.0/E;
K_1 = PHt_1 *1.0/E;
//更新协方差矩阵
Y_0 = PHt_0;
Y_1 = h_0*P[0][1];
P[0][0] -= K_0*Y_0;
P[0][1] -= K_0*Y_1;
P[1][0] -= K_1*Y_0;
P[1][1] -= K_1*Y_1;
//更新状态估计 Xnew = X + K*error;
//err是加速度计测得角度和估计的角度的差
g_fcarspeed += K_0*angle_err;
q_bias += K_1*angle_err;
angle_dot=g_fanglespeed - q_bias ;
}
但是输出的角度一直不变是怎么回事?
还奇怪啊
|
|