【发布时间】: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