如何在得到四元数之后进行卡尔曼滤波?

2019-07-14 22:32发布

用卡尔曼滤波处理四元数,以前用过单变量的卡尔曼滤波,但是这一次需要处理四个变量,有些不太清楚了,有做过的坛友指教一下原理和公式~~下面是我四元数的后半部分程序:

tica, SimSun, sans-serif">
  1. // integrate quaternion rate and normalise
  2.   q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
  3.   q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
  4.   q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
  5.   q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  
  6.   
  7.   // normalise quaternion
  8.   norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
  9.   q0 = q0 * norm;
  10.   q1 = q1 * norm;
  11.   q2 = q2 * norm;
  12.   q3 = q3 * norm;
复制代码
这是单变量的卡尔曼滤波器:
  1. float KalmanGain;//  卡尔曼增益
  2. float EstimateCovariance;//估计协方差
  3. float MeasureCovariance;//测量协方差
  4. float EstimateValue;//估计值
  5.   
  6. void KalmanFilterInit(void)
  7. {
  8.         EstimateValue = 0;
  9.         EstimateCovariance = 1;
  10.         MeasureCovariance = 2;
  11. }

  12. float KalmanFilter(float Measure)
  13. {
  14.         //计算卡尔曼增益
  15.         KalmanGain=EstimateCovariance*sqrt(1/(EstimateCovariance*EstimateCovariance+MeasureCovariance*MeasureCovariance));

  16.         //计算本次滤波估计值
  17.         EstimateValue=EstimateValue+KalmanGain * (Measure-EstimateValue);
  18.         
  19.         //更新估计协方差
  20.         EstimateCovariance=sqrt(1-KalmanGain) * EstimateCovariance;
  21.         
  22.         //更新测量方差
  23.         MeasureCovariance=sqrt(1-KalmanGain) * MeasureCovariance;
  24.         
  25.         //返回估计值
  26.         return EstimateValue;
  27. }
复制代码




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。