Ich erhalte Pitch- und Roll-Daten vom Gyroskop meines Geräts mit diesem Tutorial: Ссылка
Alle Messwerte sind extrem genau (auf den Code im Tutorial wird ein Filter angewendet, um die Gyro Drift zu eliminieren). Leider funktioniert der Code nur, wenn mein Gerät flach auf einer Oberfläche liegt, die parallel zum Boden ist. Die ideale Position für meine App wäre, wenn die Oberseite des Geräts gerade nach oben zeigt (dh das Gerät steht senkrecht zum Boden, wobei der Bildschirm dem Benutzer zugewandt ist). Wenn ich mein Gerät in dieser Position ausrich- te, gehen die Tonhöhenwerte wie erwartet auf +90 Grad. Ich möchte diese Position als 0-Grad-Punkt (oder Ausgangsposition) für mein Gerät einstellen, so dass die Neigungswerte 0 Grad sind, wenn mein Gerät aufrecht (im Hochformat) ausgerichtet ist und der Bildschirm dem Benutzer zugewandt ist / p>
Ich fragte den Autor des Tutorials mit Hilfe zu diesem Thema und er antwortete:
"Wenn Sie die aufrechte Position als die erste haben möchten, müssen Sie Ihren Referenzrahmen entsprechend drehen. Die einfachste Art wäre, die resultierende Rotationsmatrix um -90 Grad um die x-Achse zu drehen. Aber Sie müssen vorsichtig sein, an welcher Stelle des Algorithmus Sie diese Rotation anwenden.Erinnern Sie sich immer daran, dass Rotationen keine kommutativen Operationen sind. Um genauer zu sein, müsste ich den Code noch einmal überprüfen, da ich nicht damit gearbeitet habe für eine Weile. "
Ich bin wirklich sehr verwirrt und ratlos darüber, wie ich meinen Referenzrahmen drehen soll. Ich glaube, das Entscheidende ist, dass ich keine Ahnung habe, wie man die Matrix um -90 Grad um die x-Achse dreht. Wenn mir jemand mit diesem Teil helfen könnte, wäre das fantastisch. Hier ist mein Code für den Fall, dass jemand sich darauf beziehen möchte:
%Vor%Vielen Dank im Voraus für Ihre Hilfe!
Die Theorie ...
Ich bin nicht wirklich sicher über das Format, in dem Ihre Matrix "Bezugssystem" dargestellt wird, aber typischerweise werden Rotationen mit Matrixmultiplikation durchgeführt.
Grundsätzlich würden Sie Ihre "Rahmen der Referenzmatrix" nehmen und sie mit einer 90 Grad Rotationsmatrix multiplizieren.
Eine solche Matrix kann auf Wikipedia gefunden werden: Dreidimensionale Rotationsmatrizen
Da Ihr Winkel 90 Grad beträgt, würden Ihre Sinus- und Cosinus-Werte in 1 oder 0 aufgelöst, die Sie direkt in die Matrix einfügen können, anstatt die Sinus- und Cosinus-Werte zu berechnen. Zum Beispiel würde eine Matrix, die sich um 90 Grad gegen den Uhrzeigersinn um die x-Achse drehen würde, so aussehen:
%Vor%Bitte beachten Sie auch, dass Matrizen wie diese nicht auf Zeilenvektoren von x y z Koordinaten arbeiten. Wenn Sie zum Beispiel einen Punkt im Raum haben, der bei (2,5,7) steht und Sie ihn mit der obigen Matrix drehen möchten, müssen Sie die folgende Operation ausführen:
%Vor%Was [2 -7 5]
ergibt... wurde auf Ihren Code angewendet
Ich habe schnell auf Ihren Code geschaut und es scheint, als ob die Änderung, die Sie vornehmen müssen, die Ausgabe von calculateAccMagOrientation () beinhaltet, da sie dazu verwendet wird, die Ausrichtung des Geräts zu initialisieren.
%Vor%In Zeile 2 im obigen Snippet erhalten Sie Ihre anfängliche rotationMatrix. Versuchen Sie, rotationMatrix mit einer handgefertigten 90-Grad-Rotationsmatrix zu multiplizieren, bevor Sie getOrientation in Zeile 3 aufrufen. Ich denke, dies wird Ihre Referenzausrichtung effektiv neu ausrichten:
%Vor%Bitte beachten Sie, dass Sie abhängig davon, wie die Winkel in Android funktionieren, möglicherweise eine um 90 Grad im Uhrzeigersinn drehende Matrix anstelle eines Linkslaufs verwenden müssen.
Alternative Lösung
Es ist mir gerade in den Sinn gekommen, vielleicht könnten Sie auch einfach 90 vom endgültigen Tonhöhenergebnis subtrahieren, bevor Sie es anzeigen?
Tags und Links android accelerometer gyroscope android-sensors