1

コンパスと加速度計センサーを使用して、デバイスの回転角度と傾きを表示する独自のアプリケーションを Android で作成しました。必要なすべてのリスナーとオブジェクトを初期化しました (いくつかのチュートリアルに従いました)。問題は、センサーが返す測定値が正確でないことです。つまり、センサーから取得した度の値を丸めようとしても、妨害源から離れた芝生のフィールドにとどまっていても、1 秒ごとに -/+ 7 (または 8) 度の間で振動します。私が欲しいのは、センサーから受け取った値を丸める方法のような、度の正確な測定です。

    float[] mags = null;
    float[] accels = null;
    float[] R = new float[matrix_size];
    float[] outR = new float[matrix_size];
    float[] I = new float[matrix_size];
    float[] values = null;

    private void startSensor() {
    sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
    sensorMan.registerListener(this, sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);

}

@Override
public void onSensorChanged(SensorEvent event) {
    if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
        return;
    }

    switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
        mags = event.values.clone();
        break;
    case Sensor.TYPE_ACCELEROMETER:
        accels = event.values.clone();
        break;
    }

    if (mags != null && accels != null) {
        SensorManager.getRotationMatrix(R, I, accels, mags);
        // Correct if screen is in Landscape
        SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X,
                SensorManager.AXIS_Z, outR);

        SensorManager.getOrientation(outR, values);
        azimuth = (float) Math.round((Math.toDegrees(values[0]))*7)/7;
        azimuth = ( azimuth + 360)%360; 
        //here is inclination. The problem is just the same with compass
        //inclination=-Math.round((float) (values[1]*(360/(2*Math.PI))));

        //other code to update my view
        //in azimuth i have the degree value. It changes continuously
        //even if i aim still the same direction
    }
}
4

3 に答える 3

1

ここで私の答えを参照してください:センサーからのデータの平滑化

に渡す前に、加速度計と魔力計の両方のイベント値に対してこのフィルターを実行しますSensorManager.getRotationMatrix()。このアルゴリズムには、履歴値の大規模な配列を保持する必要がなく、以前のローパス出力配列だけを保持する必要があるという利点があると思います。

アルゴリズムは、このウィキペディアのエントリから派生しました: http://en.wikipedia.org/wiki/Low-pass_filter#Algorithmic_implementation

于 2011-08-24T12:24:48.683 に答える
0

あなたが見ているのは本物です。ほとんどの携帯電話の方向センサーは、大まかなコンパスの方向を示すのに十分です.

表示された値を滑らかにして、ランダムに変化しているように見えないようにする場合は、http://en.wikipedia.org/wiki/Moving_averageまたはその方向の結果に Java で他の平滑化フィルターを実装することをお勧めします。

最高のパフォーマンスを得るには、NDK を使用してフィルターを記述し、Boost Accumulator ライブラリを使用できます: http://www.boost.org/doc/libs/1_46_1/doc/html/accumulators.html

于 2011-06-28T20:14:20.580 に答える
0

ここからカルマン フィルターを使用してこれを行いました: Greg Czerniak の Web サイト

データをudpポートに送信し、Pythonを使用してPC上で平滑化しています。しかし、Java/Android 用のカルマン フィルターの実装を見つけることができると思います。

于 2012-10-22T13:40:58.647 に答える