从加速度计读数中消除重力效应

时间:2014-04-27 14:16:19

标签: java android accelerometer

我正在开发一个应用程序,其中我使用 Accelerometer 来感知线性加速度,但过了一段时间后我才知道Accelerometer没有显示线性加速度( 也会对它产生重力影响)。

因此,为了消除重力,我尝试了一些方法并得出结论,我必须设计一个过滤器。

为了设计过滤器,我尝试了以下代码。

public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

取自Android Developers

现在我在上面的代码中遇到了一些问题:

  1. 什么是alpha,t和dt?
  2. 如何获取t和dt的值以及如何计算它们?
  3. 另请告诉我,我用于获取线性加速的代码是否有效?

1 个答案:

答案 0 :(得分:0)

此方法“阻尼”传感器值的变化。它被称为"exponential smoothing"。在快速变化的变量中,您可以通过获取最新值来找到平均值的估计值,并将其计算为分数(alpha)。

此算法使用此过滤器来查找常量,“必须”是重力。总加速度=重力+瞬时加速度,因此瞬时加速度可以通过event.values - gravity计算。

除非您是不断加速(火箭发射,加速在高速公路上......)。因子alpha告诉您“平均”可以变化的速度,并且当您想要测量快速变化的加速度时需要更大。这由术语dt反映:当相对于滤波器时间常数更小(更高的事件率)时,α变得更大。时间常数告诉您纹波的影响在平均值中衰减的速度有多快。