Javaな日々

NO JAVA, NO LIFE.

加速度センサの値のノイズ除去

Androidで加速度センサを使ったアプリを書いていて,センサのノイズに悩まされた.
加速度センサの値をそのまま使うとセンサ自体の精度や感度による誤差と小さなブレによって大きなノイズが入る.センサを安定した水平な机に置いていてもセンサの値が常に大きくブレてしまう.

このノイズを除去するために,ローパスフィルタという仕組みがある.

最終的な値X = ひとつ前のXの値 * 0.9 + センサの値 * 0.1

こうすることで高周波な細かいブレが平均化されて,値の推移が滑らかになる.
値の推移の速さはひとつ前のXの値とセンサの値の比率を変えれば変更できる.また,値の精度をもっと高くしたい場合は使う過去の値を増やせばいい.

実際にAndroidでコードを書いてみるとこんな感じ.

public class MainActivity extends Activity implements SensorEventListener {
    
    private SensorManager sensorManager;
    private float x, y, z = 0;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }
    
    @Override
    public void onSensorChanged(SensorEvent event) {
        if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            x = (float) (x * 0.9 + event.values[0] * 0.1);
            y = (float) (y * 0.9 + event.values[1] * 0.1);
            z = (float) (z * 0.9 + event.values[2] * 0.1);
        }
    }
}