Ich muss das Magnetometer in einem Gerät verwenden, um genau zu bestimmen, um wie viel Grad der Benutzer es dreht (in der xy-Ebene dreht). Die absolute Ausrichtung interessiert mich nicht, nur das Winkeldelta. Natürlich kann der Benutzer das Gerät in jeder Ausrichtung halten. Im Wesentlichen ist dies wie ein Türknauf, der an nichts befestigt ist.
Ich habe atan2 (x, y) ausprobiert, aber das resultierende Winkeldelta variiert je nach Ausrichtung des Geräts. Einige Untersuchungen deuten darauf hin, dass eine Neigungskompensation erforderlich ist, aber alle Lösungen dienen der Korrektur von Kompassen auf der Grundlage der Kenntnis des Schwerkraftvektors.
In dieser Anwendung sind Beschleunigungsmesser-, Schwerkraft- und Kreiseldaten nicht verfügbar – nur das Magnetometer. Dies bedeutet, dass das Pitch & Roll, das in typischen Lösungen verwendet wird, nicht verfügbar ist. Ich suche jedoch keine wahren Überschriften, sondern nur eine Drehung in xy.
Kann jemand die Mathematik und Lösung dafür erklären? Mir ist klar, dass dies streng genommen eine Programmierfrage ist, aber das sind Dinge, die nur ein EE wissen würde.
Die Anwendung wird typischerweise so verwendet, dass die xy-Ebene selten, wenn überhaupt, senkrecht zum Erdfeld ist, also sqrt(x 2+y 2) > 0.
Das Magnetometer ist ein AK8975 3-Achsen-MEMS, das an das Gerät ohne kardanische Nivellieranordnung gelötet ist. Für die Harteisenkalibrierung ist bereits gesorgt. Die Abtastrate beträgt 40 Hz, während Sie Ihre Hand am schnellsten hin und her drehen können, bei weniger als 5 Hz. Die Ausrichtung des Magnetometers ist völlig unbekannt, da die Achse des Magnetometers am Gerät befestigt ist und das Gerät beliebig ausgerichtet sein kann. Über die Schwerkraft, die Ausrichtung oder den Standort des Geräts ist nichts bekannt oder kann angenommen werden.
[Später] Führte ein Experiment durch, bei dem ich das Gerät nahm und es flach auf einen Drehstuhl legte, der nach Norden ausgerichtet war, und es dann um 360° drehte. Der Sitz des Stuhls ist eben mit dem Boden. Hier ist das Diagramm:
x=blau, y=dunkelgrün, z=rot, sqrt(x^2+y^2+z^2)=aqua Die x-Achse ist die verstrichenen Sekunden, die y-Achse ist uT.
Zwei Dinge fallen mir auf:
Wenn die Ausrichtung des Geräts während der Messung fixiert ist, ist die Berechnung relativ einfach, wie Dave Tweed betont hat.
Das Hauptproblem ist die Kalibrierung. Ein schneller Weg wäre, ein ungefähres Minimum, Maximum für jede x-, y-, z-Richtung festzulegen. Hoffentlich liegen die Nullstellen ungefähr auf den Mittelwerten von Min und Max. Das heißt, dies wird ein geben , und analog für die anderen Achsen. Aus dieser Schätzung , Und , usw.
Dann für eine Lesung, berechnen usw. Hoffentlich wird dies im Bereich sein .
Das würde ich prüfen ist (1) nicht größer als eine Zahl ( hier), damit Sie eine aussagekräftige Richtung erhalten, und (2) dass sie für die Dauer einer Messung ziemlich konstant bleibt.
Um einen Winkel zu berechnen, verwenden Sie (überprüfen Sie Ihre spezielle API). Um die Differenz mit einem anderen (hoffentlich nahen) Winkel zu berechnen, seien Sie einfach vorsichtig mit dem Grenze.
Dies ist offensichtlich ein kurzer Überblick, bei dem viele Optimierungen und Plausibilitätsprüfungen weggelassen wurden.
Wenn die Orientierung absolut unbekannt ist, versuchen Sie, ein 3D-Problem mit einer 2D-Berechnung zu lösen. Das kann nicht funktionieren. Sie müssen das Problem in 3D lösen.
In Bezug auf die Kalibrierung ist die Lösung von @copper.hat korrekt, aber Sie müssen die Kalibrierung in 3D durchführen, was erheblich schwieriger durchzuführen ist < Sie müssen entweder (1: mehr Bewegungen) zufälligen 3D-Bewegungen folgen, die den Bereich möglicher Positionen abdecken , oder (2: komplexer mechanischer Aufbau) beginnen Sie mit der Definition einer Vorzugsrichtung, die auf das 3D-Erdfeld ausgerichtet ist, kalibrieren Sie dann 2D um diese Achse, kalibrieren Sie dann die dritte Dimension um eine senkrechte Achse, oder (3: komplexe Berechnung) wählen Sie eine zufällige orthogonale Basis und kehren Sie die trigonometrische Berechnung um, um Ihre Kalibrierungsvariablen zu erhalten - dies ist der rauschempfindlichste Ansatz>. (1) wird von einfachen Verbraucherobjekten (wie dem PS3-Controller) ausgeführt, (2) wird in einer industriellen Umgebung ausgeführt, (3) wird ausgeführt, wenn die anderen beiden nicht verfügbar sind.
Venny
Georg Herold
gbulmer
MilesK
Venny
MilesK
David Tweed
MilesK
kupfer.hut
David Tweed
kupfer.hut
Venny
MilesK
David Tweed
David Tweed
David Tweed
David Tweed
MilesK
Venny
MilesK
Venny
MilesK
Venny
MilesK
Venny
kupfer.hut
kupfer.hut
MilesK
Venny
MilesK
Venny
MilesK
Venny
kupfer.hut
kupfer.hut
MilesK
MilesK
kupfer.hut
MilesK