Magnetometer-Neigungskompensation ohne Beschleunigungsmesser

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

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:

  1. Sollte die aquafarbene Größe nicht flach sein? Das Tal ist 30 gegenüber 45 für den flachen Teil. Andernfalls ist dies ein Hinweis darauf, dass dieser Sensor grob falsch kalibriert ist? Oder ist dies ein Hinweis darauf, dass eine Neigungskompensation erforderlich ist?
  2. Die x- und y-Spitzen sind leicht versetzt und haben leicht unterschiedliche Bereiche, aber nicht so viel. Ich bin bereit, dies als Fehler abzutun, im Gegensatz zu dem Unterschied von 30:45 für die Größenordnung, der ausreicht, um alle Berechnungen durcheinander zu bringen.
  3. Das Z ist wie erwartet flach
Was ist, wenn der Vektor der magnetischen Intensität in Richtung der z-Achse zeigt?
Was für ein Magnetometer? Ein zweiachsiges Fluxgate? Ist die Ausrichtung der z-Achse festgelegt? (parallel zum G-Feld der Erde angenommen) Kennen Sie den Magnetfeldvektor, wo Sie sich befinden? In welche Richtung weist es? Wird es innerhalb eines Gebäudes verwendet?
+1 an GeorgeHerold. Außerdem kann das Magnetometer mit einer viel höheren Rate abgetastet werden, als es sich bewegt, dh viele Male höher als die Nyquist-Rate . Wie langsam müssen Sie möglicherweise erkennen? (Ich wundere mich über Drift). Welche Einschränkung, wenn überhaupt, könnten Sie lockern oder beseitigen, wenn die Antwort lautet: „Es geht nicht“.
Bitte beachten Sie die Bearbeitungen am Ende der Frage für die Antworten auf die von Ihnen angesprochenen Punkte.
Dies ist unmöglich, da die Drehung entlang des Magnetfeldvektors nicht nachweisbar ist.
@venny Wie in den Änderungen der Frage angegeben, wird die Anwendung nicht in Situationen verwendet, in denen die Drehung entlang des Magnetfeldvektors erfolgt, sodass dieser Fall kein Problem darstellt. Wie ich gemessen habe, ist die Rotation in allen anderen Fällen nachweisbar, aber ich versuche herauszufinden, wie ich sie neigungskompensieren kann.
Korrigieren Sie mich also, wenn ich falsch liege, aber entgegen dem Titel Ihrer Frage verstehe ich, dass Sie keine Neigungskompensation wünschen. Vielmehr möchten Sie wissen, ob sich das Gerät in seiner eigenen XY-Ebene gedreht hat, wobei Sie das vorherrschende Magnetfeld als Referenz verwenden, oder? Wie Venny betont, ist dies nicht möglich, wenn die Z-Achse parallel zum Feld ist, aber solange der Feldvektor eine Projektion ungleich Null in der XY-Ebene hat, sehe ich kein Problem bei der Messung seiner Winkeländerungen. Wo genau steckst du fest?
@DaveTweed Du hast genau recht. Ich versuche, die Differenz zwischen zwei Winkeln in der eigenen XY-Ebene des Geräts zu berechnen, die dadurch verursacht wird, dass der Benutzer das Gerät wie einen Türknauf dreht. Die Winkel werden trivial aus den x- und y-Projektionen mit atan2 abgeleitet, zB dAngle = atan(x1,y1) - atan(x1,y2). Das Problem, das ich sehe, ist, dass dAngle anders ist, wenn der Benutzer sich um den gleichen Betrag dreht, während er das Gerät vertikal oder horizontal hält oder nach Osten oder Norden zeigt. Aus diesem Grund habe ich im Titel von der Neigungskompensation gesprochen: Dies scheint das gleiche Problem zu sein, aber auf eine andere Art und Weise mit anderen Einschränkungen.
Es wird je nach Ausrichtung unterschiedlich sein, wenn die xy-Ebene senkrecht zum Erdfeld ist, werden keine Änderungen registriert, wenn sie parallel zum Feld ist, sehen Sie die meisten Änderungen.
Wie sehr unterscheidet sich dAngle? Und welche Art von Genauigkeit/Wiederholbarkeit suchen Sie? Möglicherweise stoßen Sie einfach an die Auflösungsgrenzen des 13-Bit-Sensors (0,3 uT/Zählung). Versuchen Sie, einige der rohen Sensordaten zu zeichnen und die Arithmetik zur Überprüfung durchzuarbeiten.
@DaveTweed: Wenn das Gerät mit der xy-Ebene senkrecht zum B-Feld der Erde gehalten wird, wird nur eine z-Komponente (Modulo-Rauschen) registriert. Es kann also (in diesem Fall) keine Drehung um die z-Richtung erkennen. Genauso wie wenn ich bei Magnetic North bin, ist ein gewöhnlicher Kompass für die Richtungsbestimmung nutzlos.
Quantisierungsfehler sind das Letzte, wovor ich Angst haben würde. Aber Null-Gauss-Offset ist ± 1000 L S B und Empfindlichkeit können je nach variieren ± 5 % . Und wenn Sie sicherstellen möchten, dass die Projektion in XY ungleich Null ist, beschränken Sie sich auf die horizontale Position.
@Copper.hat Ich arbeite gerade an weiteren Daten, gemäß den Vorschlägen von DaveTweed
@copper.hat: JA, WIR HABEN ES! Das muss man nicht immer wieder sagen! Das Gerät kann auch in anderen Ausrichtungen nützlich sein.
@copper.hat: Ich glaube, wir reden hier aneinander vorbei. Das Ziel besteht darin, zu bestimmen, um wie viel sich das Gerät in seiner eigenen XY-Ebene gedreht hat, vorausgesetzt, dass die Richtung des externen Magnetfelds fest ist. Das sollte durchaus machbar sein. Warum sollte die Änderungsrate des Winkels um irgendeinen Betrag unterschätzt werden?
@Venny hat jedoch einen guten Punkt zu Sensor-Offset-Fehlern. Welche Art von Kalibrierungsverfahren verwenden Sie, um diese zu beseitigen?
@copper.hat: Du denkst das nicht zu Ende. Solange etwas in der XY-Ebene zu sehen ist, sollte die Messung des Rotationswinkels möglich sein, innerhalb der Auflösungsgrenzen, auf die ich zuvor hingewiesen habe. Die Größe der Projektion spielt keine Rolle (es sei denn, sie ist natürlich Null).
Schauen Sie sich die Grafik an, die ich gerade der Frage und den Kommentaren hinzugefügt habe. Läuten irgendwelche Glocken?
Die Y-Achse ist in Gauß und die X-Achse im Bogenmaß?
@venny X-Achse ist verstrichene Sekunden, Y-Achse ist uT. Die Rotation beginnt bei ~5 Sekunden und endet bei ~12
Es ist sinusförmig und um 90 Grad von y verschoben . Der Unterschied in der Amplitude kann durch eine unvollkommene Ausrichtung der z-Achse mit der Stuhlachse verursacht werden. Aber es gibt auch einen ernsthaften Offset, der real ist und kalibriert werden muss.
@venny Chair besteht hauptsächlich aus Aluminium und Kunststoff. Das y ist die gleiche Sinuskurve wie das z, nur wie erwartet um 90 Grad versetzt.
@copper.hat Das tut es. Zeichnen Sie ein Kästchen zwischen 5s und 12s, kopieren Sie es mehrmals und Sie sehen zwei verschobene Sinuskurven.
Niemand kommentiert diese Beule in der Größenordnung (aqua)! Warum sollte das keine gerade Linie sein?
Mit idealem Sensor wäre es flach. Dieser Sensor hat eine garantierte Anfangsgenauigkeit von ± 300 μ T , also sind diese Ergebnisse eigentlich ziemlich gut.
@venny: Natürlich, dumm von mir.
@MilesK: Versuchen Sie basierend auf dem, was Sie haben, ein Min/Max von x,y separat herauszufinden, normalisieren Sie dann jedes separat und nehmen Sie dann die Größe. Ich denke, Sie haben einfach nicht zusammengepasst X , j Bereiche (und Nullen).
@venny Könnten Sie Ihren Kommentar zu "Anfangsgenauigkeit von 300 uT" verstärken? Ist das ein Offset, Nichtlinearität oder was? Kann das auch ein Druckfehler sein? 300 µT für einen Sensor mit 0,3 µT LSB-Genauigkeit erscheinen faul.
@MilesK Es ist ein Null-Gauss-Offset. Überzeugen Sie sich selbst im Datenblatt , Seite 8. Ich glaube nicht, dass es sich um einen Druckfehler handelt, ein ähnlicher Sensor von ST hat einen typischen Offset von ± 100 μ T
@venny Ich verstehe. Wie erzeugt der konstante Offset einen Buckel in der Kurve? Was vermisse ich?
@MilesK Jede Achse hat wahrscheinlich einen anderen Versatz, und selbst wenn alle gleich wären, wäre das Ergebnis nicht flach, weil X 2 + j 2 + z 2 ist keine Linearkombination von x,y,z. Die Senke ist am Minimum der blauen Linie zentriert, was nicht niedrig genug ist.
@venny Natürlich! Es sieht also so aus, als würde ich eine schlechte Harteisenkalibrierung als Hauptursache betrachten.
Sehen Sie sich diesen Anwendungshinweis von Freescale an, insbesondere die Abbildung auf Seite 11, die zeigt, dass unkalibrierte Werte weit abweichen können. Eine Kalibrierung durch Drehen in allen Achsen (wie bei einem Mobiltelefon) ist wahrscheinlich erforderlich.
@MilesK: Ich habe Beschleunigungsmesser kalibriert, die ähnliche Probleme haben. Ich habe viele Punkte gemessen und eine SVD-Technik verwendet, um sie an eine Kugel anzupassen, aus der ich Mittelwerte und Bereiche extrahiert habe. Ich würde sowas erstmal machen.
@MilesK: Entschuldigen Sie, dass ich hier aufhole, aber sagen Sie, dass sich der Benutzer nur in der xy-Ebene des Geräts dreht? Das heißt, ist die Ausrichtung der z-Achse für die Messung festgelegt ?
@copper.hat Yup, z ist für die Dauer festgelegt.
Leute, ich wünschte, ich hätte genug Ruf, um einige Ihrer Kommentare positiv zu bewerten. Mit der 4-Parameter-Kalibrierung, die in der von @venny verlinkten Freescale-Anwendungsnotiz beschrieben ist, konnte ich das Magnetometer neu kalibrieren, um eine flache Magnitude zu erhalten. DAS HAT ALLES zum Besseren verändert.
Ich stehe korrigiert...
Bei richtiger Kalibrierung habe ich einige Tests durchgeführt, bei denen ich das Gerät um 360 Grad in XY gedreht habe. In allen Ausrichtungen ist das Diagramm von x vs. y nun vollkommen rund. Dies beweist empirisch, dass DaveTweed vollkommen richtig liegt: Der Rotationswinkel ist einfach atan2(x, y).

Antworten (2)

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 X Mindest , X max und analog für die anderen Achsen. Aus dieser Schätzung X null = 1 2 ( X Mindest + X max ) , Und R X = 1 2 ( X max X Mindest ) , usw.

Dann für eine Lesung, berechnen X Europäische Sommerzeit = X messen X null R X usw. Hoffentlich wird dies im Bereich sein ± 1 .

Das würde ich prüfen | z Europäische Sommerzeit | ist (1) nicht größer als eine Zahl ( < 1 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 atan2 ( j Europäische Sommerzeit , X Europäische Sommerzeit ) (ü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.

Nebenbei: Im Folgenden wird die Mathematik hinter einer Klasse von Ansätzen zur Kalibrierung diskutiert ulb.ac.be/assoc/bms/Bulletin/sup962/gander.pdf .
Wie von venny erwähnt, scheint der Anwendungshinweis von Freescale robuster für begrenzte Zeitrahmen zu sein, in denen Sie nicht garantieren können, dass der Benutzer den gesamten Winkelbereich in allen Dimensionen durchlaufen hat.
@MilesK: Von dem, was ich in der App sehe. Beachten Sie, dass sie die kleinsten Quadrate verwenden, um sie an ihr Modell (eine stärker parametrisierte Ellipse) anzupassen, das auch die Deklination modelliert. Sie können eine schnelle Kalibrierung mit Messungen und einer SVD vornehmen, die die Parameter der Ellipse schätzt. Ich habe das Obige geschrieben, damit Sie (hoffentlich) aus Ihren Messwerten einen Sinn machen können.

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.