我正在为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()方法中放置什么代码?
答案 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);
}
在游戏环境中,当传感器处于完全倾斜状态时,您的物体将处于最大速度