用卡尔曼滤波处理四元数,以前用过单变量的卡尔曼滤波,但是这一次需要处理四个变量,有些不太清楚了,有做过的坛友指教一下原理和公式~~下面是我四元数的后半部分程序:
tica, SimSun, sans-serif">- // 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;
- }
复制代码
不要把卡尔曼和普通滤波混淆了。你对加速度做的只是个平均滤波,那可算不上卡尔曼。
是的,我说的是代替。单变量卡尔曼只能滤波不能融合。
一周热门 更多>