0

次のコードを使用して、ヨー、ピッチ、ロールを検出しようとしています。

    @Override
    public void onSensorChanged(SensorEvent event) {

        if (event.sensor == mAccelerometer) {
            System.arraycopy(event.values.clone(), 0, mLastAccelerometer, 0, event.values.length);
            mLastAccelerometerSet = true;
        } else if (event.sensor == mMagnetometer) {
            System.arraycopy(event.values.clone(), 0, mLastMagnetometer, 0, event.values.length);
            mLastMagnetometerSet = true;
        }
        if (mLastAccelerometerSet && mLastMagnetometerSet) {
            SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
            SensorManager.getOrientation(mR, mOrientation);

            mOrientation[0] = (float) Math.toDegrees(mOrientation[0]);
            mOrientation[1] = (float) Math.toDegrees(mOrientation[1]);
            mOrientation[2] = (float) Math.toDegrees(mOrientation[2]);

            mLastAccelerometerSet = false;
            mLastMagnetometerSet = false;
            ManageSensorChanges();
        }
    }

これは、1 つの問題を除けば問題なく機能します。

電話が上下逆さまになっている場合、または上下逆さまになり始めると (ポートレート モードで少し前に傾けても)、角度が狂ってしまいます... ランダムな角度が吐き出されます!

なぜこれが起こっているのですか - そして - これに対する解決策はありますか?

4

1 に答える 1

1

この問題で立ち往生している場合:

Android の向きセンサーでの奇妙な動作

要約すると、問題はオイラー角の使用にあるため、デバイスの極端な角度で上記の問題を解決するためにできることはほとんどありません... クォータニオン (OpenGL または 3D プロジェクションに適しています) を使用することを除けば)。

アプリで2D描画に使用しているため(視差効果を作成するため)、加速度計の値を使用することになりました(範囲は明らかに-9.8から9.8です)...完璧に機能し、私の原油にとって厄介なほど簡単なソリューションですニーズ。この手法は 3D プロジェクションでは受け入れられません...正確な測定が必要な場合は、https://bitbucket.org/apacha/sensor-fusion-demoを参照してください。

于 2015-06-04T00:32:04.043 に答える