Android getOrientation Azimut wird verschmutzt, wenn das Telefon gekippt wird

8

Ich habe ein wirklich nerviges Problem mit einer AR-Ansicht, die wie ein Kompass funktioniert. Wenn ich also das Telefon im Hochformat halte (so dass der Bildschirm auf mein Gesicht zeigt), rufe ich remapCoordinateSystem an, dass die Tonhöhe 0 ist, wenn ich es im Hochformat halte. Dann ist der Azimut (Kompassfunktion) perfekt, aber sobald ich das Telefon kippe, 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 verwende 2 Sensoren, um die Messwerte zu erhalten, Sensor.TYPE_MAGNETIC_FIELD und Sensor.TYPE_GRAVITY .

Ich verwende einen Tiefpassfilter, der ziemlich einfach ist, er wird mit einer alpha -Konstante implementiert und direkt auf die gelesenen Werte der Sensoren angewendet.

Hier ist mein Code:

%Vor%

Wie Sie sehen, gibt es hier keine Magie. Ich nenne dieses Stück Code, wenn die GravitymeterValues ​​und die MagnetometerValues ​​bereit sind, verwendet zu werden.

Meine Frage ist, wie verhindere ich, dass der Azimut verrückt wird, wenn ich das Telefon kippe?

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

Ich habe zwei Lösungen im Sinn:

  1. Lassen Sie die AR-Ansicht nur in sehr eingeschränkten Neigungswinkeln arbeiten, im Moment habe ich etwas wie pitch >= -5 && pitch <= 30 . Ist dies nicht der Fall, wird dem Benutzer ein Bildschirm angezeigt, in dem er aufgefordert wird, das Telefon in Hochformat zu drehen.

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

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

Vielen Dank im Voraus!

    
Johan S 31.07.2013, 19:30
quelle

1 Antwort

14

Den vollständigen Code finden Sie unter Ссылка Behalte eine Historie und Durchschnitt, ich kenne nicht die richtige Interpretation von Pitch and Roll, so dass der folgende Code nur für Azimut ist.

Klassenmitglieder

%Vor%

onSensorChanged

%Vor%     
Hoan Nguyen 31.07.2013, 21:32
quelle