0
我正在構建帶POI的增強現實應用程序。 大部分的應用程序已完成,但現在我正試圖找到一個更好的穩定我的傳感器,特別是加速度計。我已經使用了低通濾波器,但是POI依然在反彈。我試圖做的事情是獲得5個或更多讀數的加速度計,然後除以n。這應該給我更好的閱讀,但我不知道如何做到這一點。我可以做一個for循環,但我不能只製作for(int i=0; i<n; i++)
,因爲只有當加速度計的值發生變化時才應該執行i ++。如果我用一個簡單的for循環做,我會得到一個錯誤,因爲循環完成得更快,然後傳感器被更改。我一直在尋找的是一個計時器,只有當傳感器也改變時纔會改變。更高精度的Android加速度計
這是我迄今所做的:
static final float ALPHA = 0.15f; // if ALPHA = 1 OR 0, no filter applies.
// low level pass filter, so i can get steadier reading of mobile sensors
// using only accelerometer and compass
protected float[] lowPass(float[] input, float[] output) {
if (output == null) return input;
for (int i = 0; i < input.length; i++) {
output[i] = output[i] + ALPHA * (input[i] - output[i]);
// output[i] = input[i]*ALPHA + output[i]*(1.0f-ALPHA);
}
return output;
}
public void onSensorChanged(SensorEvent event) {
StringBuilder msg = new StringBuilder(event.sensor.getName())
.append(" ");
for (float value : event.values) {
msg.append("[").append(String.format("%.3f", value)).append("]");
}
switch (event.sensor.getType()) {
case Sensor.TYPE_ACCELEROMETER:
lastAccelerometer = lowPass(event.values.clone(), lastAccelerometer);
accelData = msg.toString();
break;
case Sensor.TYPE_GYROSCOPE:
gyroData = msg.toString();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
lastCompass = lowPass(event.values.clone(), lastCompass);
compassData = msg.toString();
break;
}
this.invalidate();
}