Android getOrientation Azimut wird verschmutzt, wenn das Telefon gekippt wird

Ich habe ein wirklich ärgerliches Problem mit einer AR-Ansicht, die sich wie ein Kompass verhält. Wenn ich das Telefon im Hochformat halte (so dass der Bildschirm auf mein Gesicht zeigt), rufe ich das anremapCoordinateSystem dass die Tonhöhe 0 ist, wenn Sie es im Hochformat halten. Dann ist der Azimut (Kompassfunktion) perfekt, aber sobald ich das Telefon neige, wird der Azimut ruiniert, wenn ich mich nach vorne beuge, nimmt der Azimut zu und wenn ich mich nach hinten beuge, nimmt er ab.

Ich benutze 2 Sensoren, um die Messwerte zu erhalten,Sensor.TYPE_MAGNETIC_FIELD undSensor.TYPE_GRAVITY.

Ich benutze einen Tiefpassfilter, der ziemlich einfach ist und mit einem implementiert wirdAlpha konstant und wird direkt auf die von den Sensoren gelesenen Werte angewendet.

Hier ist mein Code:

float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, gravitymeterValues,
    magnetometerValues);

float[] remappedRotationMatrix = new float[9];

SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X,
    SensorManager.AXIS_Z, remappedRotationMatrix);

float results[] = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, results);

float azimuth = (float) (results[0] * 180 / Math.PI);
if (azimuth < 0) {
    azimuth += 360;
}

float pitch = (float) (results[1] * 180 / Math.PI);
float roll = (float) (results[2] * 180 / Math.PI);

Wie Sie sehen, gibt es hier keine Magie. Ich nenne diesen Code, wenn die Schwerkraftmesser- und Magnetometerwerte einsatzbereit sind.

Meine Frage ist, wie ich verhindern kann, dass der Azimut verrückt wird, wenn ich das Telefon neige.

Ich habe eine kostenlose App im Google Play Store überprüft.Kompass und es hat dieses Problem nicht gelöst, aber ich hoffe, es gibt eine Lösung.

Ich habe zwei Lösungen im Sinn:

Stellen Sie sicher, dass die AR-Ansicht nur in sehr eingeschränkten Neigungswinkeln funktioniertpitch >= -5 && pitch <= 30. Ist dies nicht der Fall, wird dem Benutzer ein Bildschirm angezeigt, in dem er aufgefordert wird, das Telefon auf Hochformat zu drehen.

Verwenden Sie die Tonhöhe, um den Azimut zu unterdrücken. Dies scheint zwar eine ziemlich gerätespezifische Lösung zu sein, aber ich bin natürlich offen für Vorschläge.

Ich kann auch hinzufügen, dass ich ein paar Stunden nach einer anständigen Lösung gesucht habe und keine gefunden habe, die mir bessere Lösungen als 2) hier gegeben hat.

Danke im Voraus!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage