如何在得到四元数之后进行卡尔曼滤波?
时间:10-02
整理:3721RD
点击:
用卡尔曼滤波处理四元数,以前用过单变量的卡尔曼滤波,但是这一次需要处理四个变量,有些不太清楚了,有做过的坛友指教一下原理和公式~~下面是我四元数的后半部分程序:
- // integrate quaternion rate and normalise
- q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
- q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
- q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
- q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
-
- // normalise quaternion
- norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
- q0 = q0 * norm;
- q1 = q1 * norm;
- q2 = q2 * norm;
- q3 = q3 * norm;
- float KalmanGain;// 卡尔曼增益
- float EstimateCovariance;//估计协方差
- float MeasureCovariance;//测量协方差
- float EstimateValue;//估计值
-
- void KalmanFilterInit(void)
- {
- EstimateValue = 0;
- EstimateCovariance = 1;
- MeasureCovariance = 2;
- }
- float KalmanFilter(float Measure)
- {
- //计算卡尔曼增益
- KalmanGain=EstimateCovariance*sqrt(1/(EstimateCovariance*EstimateCovariance+MeasureCovariance*MeasureCovariance));
- //计算本次滤波估计值
- EstimateValue=EstimateValue+KalmanGain * (Measure-EstimateValue);
-
- //更新估计协方差
- EstimateCovariance=sqrt(1-KalmanGain) * EstimateCovariance;
-
- //更新测量方差
- MeasureCovariance=sqrt(1-KalmanGain) * MeasureCovariance;
-
- //返回估计值
- return EstimateValue;
- }
首先,你要把单变量要都变成矩阵。
我觉得要是单变量卡尔曼用起来的话,先把加速度做卡尔曼(我现在用的是20次滑动平均),在传入四元素里面融合,应该会有不少的提升。
不要把卡尔曼和普通滤波混淆了。你对加速度做的只是个平均滤波,那可算不上卡尔曼。
是的,我说的是代替。单变量卡尔曼只能滤波不能融合。