android从加速度计读数中删除重力

标签 android accelerometer gravity

我正在开发一个 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/

相关文章:

java - 将对象从一个 Activity 传递到另一个 Activity 以更改它们的值

Android Studio : link to external module?

java - 如何修复错误 :java. util.concurrent.ExecutionException : com. android.ide.common.process.ProcessException:

ios - 带外部磁力计和加速度计的倾斜补偿罗盘

Android加速度计传感器监听器频率意外变化

iphone - 计算圆形 wrapper ?

jquery - Google.code 重力脚本(Mr.Doob)在鼠标移动时触发/激活,而不是在(文档).ready 时触发/激活

安卓。当我以编程方式定义 ListView 高度时,为什么 layout_gravity 不起作用?

javascript - 使用重力效果拖动元素

android - 我们还应该使用 MediaStore.Images.Media.insertImage() 方法吗?