0
私はPOIを使って拡張現実感アプリを構築しています。 アプリのほとんどは実行されましたが、今はセンサーの安定化、特に加速度センサーの安定化を目指しています。私はローパスフィルターを使用していますが、POIは依然として大きなバウンスをしています。私がしようとしていたことは、加速度計を5回以上読み取ってからnで割ります。それは私に良い読書を与えるはずですが、私はそれを作る方法は分かりません。私はforループを作ることができますが、i ++は加速度計の値が変更された場合にのみ実行する必要があるため、for(int i=0; i<n; i++)
を作ることはできません。単純なforループで実行すると、ループが速く行われてからセンサーが変更されるため、エラーが発生します。私が探していたことは、センサが変更されたときだけ変更されるタイマーです。より正確なAndroid Accelerometer
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();
}