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

时间:2011-08-02 12:14:11

标签: 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()方法中放置什么代码?

4 个答案:

答案 0 :(得分:23)

对于一个基本的解决方案,你需要一个low pass filter其他方法,如卡尔曼滤波器,对于背后的数学非常困难。 Android上的一个简单示例是在http://developer.android.com/reference/android/hardware/SensorEvent.html#values点击一下您的链接。

简单地说,低通滤波器会根据您的所有历史值建立加权平均值。例如,如果您的过滤因子为0.1,则表示当前值的10%被添加到先前的平均值:newMeanValue = currentValue的10%+ oldMeanValue的90%。这意味着即使有一个突然的峰值,它也只会因为10%而缓慢地推动你的平均值。

答案 1 :(得分:12)

线性加速是您所需要的。检查Sensor.TYPE_LINEAR_ACCELERATION here

答案 2 :(得分:10)

如果您没有配备TYPE_LINEAR_ACCELERATION的手机,则会遇到TYPE_ACCELERATION,它无法将重力(倾斜)与线性加速度分开。

一种选择是应用低通滤波器。如果陀螺仪可用,另一种方法是使用传感器融合。这两种方法都有其优点和缺点。

我在开源项目Acceleration Explorer中有很多工作示例。

答案 3 :(得分:-2)

不太确定你想要完成什么,但是如果你正在寻找幅度(这将得到0到1之间的结果)那么你所做的就是将结果除以10

public void onSensorChanged(SensorEvent sensorEvent) {
float vals[] = sensorEvent.values;
float accelerationX = (vals[0]/10);
float accelerationY = (vals[1]/10);
float accelerationZ = (vals[2]/10);

}

在游戏环境中,当传感器处于完全倾斜状态时,您的物体将处于最大速度