微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何在得到四元数之后进行卡尔曼滤波?

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

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

  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. }

复制代码




首先,你要把单变量要都变成矩阵。

我觉得要是单变量卡尔曼用起来的话,先把加速度做卡尔曼(我现在用的是20次滑动平均),在传入四元素里面融合,应该会有不少的提升。

不要把卡尔曼和普通滤波混淆了。你对加速度做的只是个平均滤波,那可算不上卡尔曼。

是的,我说的是代替。单变量卡尔曼只能滤波不能融合。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top