我正在开发一个 Android 应用程序,我需要从加速度计读数中消除重力。我已经阅读了关于这个问题的多个讨论,我还找到了一个算法here http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_ACCELEROMETER,但我并没有真正理解它。
我想从每个轴过滤重力,而不是从总加速度。
你能帮我一下吗?我的代码应该是这样的:
public void onSensorChanged(SensorEvent sensorEvent) {
float vals[] = sensorEvent.values;
float accelerationX = filterGravity(vals[0]);
float accelerationY = filterGravity(vals[1]);
float accelerationZ = filterGravity(vals[2]);
}
我应该在 filterGravity() 方法中放置哪些代码?
对于基本解决方案,您需要一个低通滤波器 http://en.wikipedia.org/wiki/Low_pass_filter其他方法(例如卡尔曼滤波器)在背后的数学方面非常困难。 Android 的一个简单示例是点击一下链接即可http://developer.android.com/reference/android/hardware/SensorEvent.html#values http://developer.android.com/reference/android/hardware/SensorEvent.html#values.
简而言之,低通滤波器根据所有历史值构建加权平均值。例如,如果过滤系数为 0.1,则意味着当前值的 10% 将添加到之前的平均值中:newMeanValue = currentValue 的 10% + oldMeanValue 的 90%。这意味着即使出现突然的峰值,由于 10% 的原因,它也只会缓慢地推动平均值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)