11

シンプルな拡張現実アプリを構築しようとしているので、センサー データの操作を開始します。

このスレッド ( Android コンパスの例) と例 ( http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html ) によると、 Sensor.TYPE_ACCELEROMETERSensorを使用した向きの計算。 TYPE_MAGNETIC_FIELDは、実際には適合しません。

そのため、「良い」値を取得できません。方位角の値はまったく意味がないので、電話を上に動かすと、値が極端に変化します。電話を回転させただけでも、値は電話の向きを表していません。

与えられた例に従って値の品質を改善するアイデアはありますか?

4

5 に答える 5

15

Tíbó からの回答は良好ですが、ロール値をログに記録すると、不規則な数値が予想されます。(ARブラウザはロールが重要)

これは、に起因するものです

SensorManager.remapCoordinateSystem(mRotationMatrix,
                    SensorManager.AXIS_X, SensorManager.AXIS_Z,
                    mRotationMatrix);

リマップの内外で異なるマトリックスを使用する必要があります。この次のコードは、正しいロール値で機能します。

@Override
public void onSensorChanged(SensorEvent event)
{
    // It is good practice to check that we received the proper sensor event
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR)
    {
        // Convert the rotation-vector to a 4x4 matrix.
        SensorManager.getRotationMatrixFromVector(mRotationMatrixFromVector, event.values);
        SensorManager.remapCoordinateSystem(mRotationMatrixFromVector,
                    SensorManager.AXIS_X, SensorManager.AXIS_Z,
                    mRotationMatrix);
        SensorManager.getOrientation(mRotationMatrix, orientationVals);

        // Optionally convert the result from radians to degrees
        orientationVals[0] = (float) Math.toDegrees(orientationVals[0]);
        orientationVals[1] = (float) Math.toDegrees(orientationVals[1]);
        orientationVals[2] = (float) Math.toDegrees(orientationVals[2]);

        tv.setText(" Yaw: " + orientationVals[0] + "\n Pitch: "
                + orientationVals[1] + "\n Roll (not used): "
                + orientationVals[2]);

    }
}
于 2014-02-28T10:53:12.980 に答える
8

おそらくパーティーに遅れた。とにかく、これが方位角を取得した方法です

private final int sensorType =  Sensor.TYPE_ROTATION_VECTOR;
float[] rotMat = new float[9];
float[] vals = new float[3];

@Override
public void onSensorChanged(SensorEvent event) {
    sensorHasChanged = false;
    if (event.sensor.getType() == sensorType){
        SensorManager.getRotationMatrixFromVector(rotMat,
                event.values);
        SensorManager
                .remapCoordinateSystem(rotMat,
                        SensorManager.AXIS_X, SensorManager.AXIS_Y,
                        rotMat);
        SensorManager.getOrientation(rotMat, vals);
        azimuth = deg(vals[0]); // in degrees [-180, +180]
        pitch = deg(vals[1]);
        roll = deg(vals[2]);
        sensorHasChanged = true;
    }
}

それが役に立てば幸い

于 2013-09-13T14:29:07.763 に答える
0

複合(センサー融合)タイプのSensor.TYPE_ROTATION_VECTORを試しましたか。これにより、より良い結果が得られる場合があります。https ://developer.android.com/reference/android/hardware/SensorEvent.html に移動し、「rotation_vector」を検索してください。

于 2013-02-06T23:47:55.580 に答える