请教各位大神,下面这段卡尔曼滤波程序中,协方差矩阵以及其更新是怎么计算的,写成公式是怎么样的?还有我只知道不做融合(单独一个陀螺仪数据)时卡尔曼增益和协方差的关系,做了融合后,两者之间的关系又变成什么样了,表示线代太差看不懂。。。还有R_angle 和 Q_angle是不是就是卡尔曼滤波理论中的测量协方差和预测协方差(陀螺仪的),也就是说R_angle 越小测量值的可信度越高?Q_gyro是什么,如果是加速度计的测量协方差,那加速度计怎么没有预测协方差 ?
求哪位好心人指点,我下了好多资料,包括卡尔曼的论文都仔细看了,还看了好多论坛的帖子,就是没找到答案,当然也可能是没看懂忽略了,好像网上的论文要么泛泛而谈,要么直接给出那5个式子,要么就太难。
刚加入这个论坛不久,看到好像有好多高人,请各位高人指点,我在这里拜谢了!!!
//float gyro_m:陀螺仪测得的量(角速度) //float incAngle:加计测得的角度值 #define dt 0.02//卡尔曼滤波采样频率 #define R_angle 0.5 //测量噪声的协方差(即是测量偏差) #define Q_angle 0.0001//过程噪声的协方差 #define Q_gyro 0.0003 //过程噪声的协方差 过程噪声协方差为一个一行两列矩阵 float kalmanUpdate(const float gyro_m,constfloat incAngle) { float K_0;//含有卡尔曼增益的另外一个函数,用于计算最优估计值 float K_1;//含有卡尔曼增益的函数,用于计算最优估计值的偏差 float Y_0; float Y_1; float Rate;//去除偏差后的角速度 float Pdot[4];//过程协方差矩阵的微分矩阵 float angle_err;//角度偏量 float E;//计算的过程量 static float angle = 0; //下时刻最优估计值角度 static float q_bias = 0; //陀螺仪的偏差 static float P[2][2] = {{ 1, 0 }, { 0, 1 }};//过程协方差矩阵 |1 0| |0 1| //计算过程协方差矩阵的微分矩阵 Pdot[0] = Q_angle - P[0][1] - P[1][0];//?????? | 0.0001 - 1 | Pdot[1] = - P[1][1]; // |- 1 0.0003 | Pdot[2] = - P[1][1]; Pdot[3] = Q_gyro;//?????? angle += Rate * dt; //角速度积分得出角度 P[0][0] += Pdot[0] * dt; //计算协方差矩阵 | 1.00002 -0.02 | P[0][1] += Pdot[1] * dt; // |- 0.02 1.00006 | P[1][0] += Pdot[2] * dt; P[1][1] += Pdot[3] * dt; Rate = gyro_m - q_bias;// 去除偏差后的角速度 angle_err = incAngle - angle; //计算角度偏差 E = R_angle + P[0][0]; K_0 = P[0][0] / E; //计算卡尔曼增益 K_1 = P[1][0] / E; Y_0 = P[0][0]; Y_1 = 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; angle += K_0 * angle_err; //给出最优估计值 q_bias += K_1 * angle_err;//跟新最优估计值偏差 return angle; }
|