2017-03-27 7 views
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(); 

} 

答えて

0

を、私は解決策を見つけた:

これは私がこれまでに行ったことある

protected float[] getMovingAvg() { 
    float [] output = new float [3]; 
    for(int i = 0; i< moveVector.size(); i++) { 
     output[0] += moveVector.get(i)[0]; 
     output[1] += moveVector.get(i)[1]; 
     output[2] += moveVector.get(i)[2]; 

    } 
    output[0] = output[0]/moveVector.size(); 
    output[1] = output[1]/moveVector.size(); 
    output[2] = output[2]/moveVector.size(); 

    if(moveVector.size() >= 70) { 
     moveVector.remove(0); 
    } 

    return output; 
} 
関連する問題