【问题标题】:Android accelerometer filtersAndroid 加速度计过滤器
【发布时间】:2014-03-09 22:21:19
【问题描述】:

试图了解加速度计传感器的官方 Android 文档。据说there

显然,为了测量设备的真实加速度,必须消除重力的影响。这可以通过应用高通滤波器来实现。相反,可以使用低通滤波器来隔离重力。

过滤器的代码是:

 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];
 }

好的。假设我以 6 m / s^2 的加速度将设备纵向推向天空。我认为在那种情况下,我应该在event.values 中得到类似[0, 15, 0] 的东西,对吧?

因此,当我在 Excel 中对 20 个点应用此过滤器时,结果表明 gravity 往往等于 [0, 15, 0],而 linear_acceleration 的目标是 [0, 0, 0]

我错过了什么?

附:我知道TYPE_GRAVITY,只是想理解数学。

附言另外,为什么TYPE_GRAVITY 传感器在纵向模式下返回正值y 值(+9.806)?不应该是-9.806吗?

【问题讨论】:

  • 我实际上发现 Android 网站上的这种说法非常具有误导性。他们在示例中应用的滤波器是一个低通滤波器,用于过滤噪声而不是重力。
  • @Kasra,是的,它就是这么做的!

标签: android accelerometer android-sensors sensormanager


【解决方案1】:

关于 TYPE_GRAVITY,这样想:

你坐在一个漂浮在没有重力的空间中的盒子里。如果喷气机以 +9.8 的加速度向上推动您(在 +Y 方向)。你感觉到的是向下 9.8 的重力。因此,从技术上讲,您因重力而感受到的力,相当于将您向上推的空间中的力。

这就是你得到 +9.8 的原因。但同样,这些就是它们的“定义”方式。如果他们将重力定义为 -9.8,则没有任何问题。您需要做的就是使数学的所有部分都遵循相同的规则。不要改变约定...

【讨论】:

  • 那么,在每台设备上都是阳性的吗?还是只在我身上?
  • 规则是肯定的。但是,请记住,有些设备甚至没有 TYPE_GRAVITY。我“总是”使用加速度计,并执行一个简单的过滤器,就像您编写的示例中描述的过滤器一样。这是因为加速度计始终是基于硬件的传感器。而旋转、重力等可能是基于软件的,并且这些不是由 Android 团队“直接”完成的——大多数是由制造商修改的。当工作交给制造商时,总会有出错的余地......
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多