我正在开发一个 Android 应用程序,我需要从加速度计读数中消除重力。我已经阅读了关于这个问题的多个讨论,我还找到了一个算法 here ,但我不是很明白。
我想过滤每个轴的重力,而不是总加速度。
你能帮帮我吗?我的代码应该是这样的:
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() 方法中放置什么代码?
最佳答案
对于基本解决方案,您需要 low pass filter卡尔曼滤波器等其他方法对于背后的数学运算非常困难。 Android 的一个简单示例是单击 http://developer.android.com/reference/android/hardware/SensorEvent.html#values 上的链接。 .
简单地说,低通滤波器会根据您的所有历史值构建加权平均值。例如,如果您的过滤因子为 0.1,则意味着将当前值的 10% 添加到先前的平均值:newMeanValue = currentValue 的 10% + oldMeanValue 的 90%。这意味着即使有一个突然的峰值,也只会因为 10% 而缓慢地插入您的平均值。
关于android从加速度计读数中删除重力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6911900/