Kompass-Richtung ist unterschiedlich je nach Telefon Orientierung

Meine augmented-reality-app muss die Kompassrichtung von der Kamera-Ansicht, und es gibt viele Beispiele, immer die Richtung, aus der sensormanager.

Aber ich finde die daraus resultierenden unterschiedlichen Wert je nach Telefon Orientierung - Querformat gedreht nach rechts ist etwa 10 Grad unterschiedlichen auf Querformat gedreht nach Links (Unterschied zwischen ROTATION_0 und ROTATION_180 ist weniger, aber immer noch anders). Dieser Unterschied ist ausreichend ruinieren jede AR-Effekt.

Ist es etwas zu tun mit der Kalibrierung? (Ich bin nicht überzeugt, ich mache die Abbildung von 8 richtig - ich habe versucht, verschiedene Möglichkeiten, die ich auf youtube gefunden habe).

Irgendwelche Ideen, warum es einen Unterschied? Habe ich versaut bis auf die rotation matrix-Zeug? Ich habe die option, die Einschränkung der Anwendung nur für eine einzige Orientierung, aber es beschäftigt mich immer noch, dass der Kompass immer noch nicht sehr präzise (auch wenn nach dem filtern ist es ziemlich stabil)

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

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)  mGravity = event.values;
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values;

        if (mGravity != null && mGeomagnetic != null) {

            float[] rotationMatrixA = mRotationMatrixA;
            if (SensorManager.getRotationMatrix(rotationMatrixA, null, mGravity, mGeomagnetic)) {

                float[] rotationMatrixB = mRotationMatrixB;

                Display display = getWindowManager().getDefaultDisplay(); 
                int deviceRot = display.getRotation();

                switch (deviceRot)
                {
                //portrait - normal
                case Surface.ROTATION_0: SensorManager.remapCoordinateSystem(rotationMatrixA,
                        SensorManager.AXIS_X, SensorManager.AXIS_Z,
                        rotationMatrixB);
                break;
                //rotated left (landscape - keys to bottom)
                case Surface.ROTATION_90: SensorManager.remapCoordinateSystem(rotationMatrixA,
                        SensorManager.AXIS_Z, SensorManager.AXIS_MINUS_X,
                        rotationMatrixB); 
                break;
                //upside down
                case Surface.ROTATION_180: SensorManager.remapCoordinateSystem(rotationMatrixA,
                        SensorManager.AXIS_X, SensorManager.AXIS_Z,
                        rotationMatrixB); 
                break;
                //rotated right
                case Surface.ROTATION_270: SensorManager.remapCoordinateSystem(rotationMatrixA,
                        SensorManager.AXIS_MINUS_Z, SensorManager.AXIS_X,
                        rotationMatrixB); 
                break;

                default:  break;
                }

                float[] dv = new float[3]; 
                SensorManager.getOrientation(rotationMatrixB, dv);
                //add to smoothing filter
                fd.AddLatest((double)dv[0]); 
            }
            mDraw.invalidate();     
        }
    }
InformationsquelleAutor Mush | 2011-12-24
Schreibe einen Kommentar