Dynamische Kalibrierung des Magnetometers

19

Ich arbeite an einem Magnetometer AK8975, das Teil einer IMU ist. Das scheint mir sehr knifflig zu sein. Dieser Chip liefert einen 3D-Vektor als Ausgabe, der das Erdmagnetfeld an einem beliebigen Ort auf der Erde oder in der Nähe beschreibt.

Ich habe zwei Arten von Steuerkursberechnungsalgorithmen ausprobiert: Eine ist einfach, arctan(-y/x)und eine andere ist die Neigungsberechnung (Pitch) und die Bankberechnung (Roll). Sowohl bei Neigung als auch bei Böschungen wird falsch ausgegeben.

Ich bin in der Lage, die richtige Richtung für die Erde zu finden (unter Verwendung von einfachen verfügbaren, offenen Lernressourcen), wenn sie gedreht wird und mit einer der beiden Algen horizontal zum Grundriss gehalten wird.

Ich habe versucht, die Kalibrierung für Weich- und Harteisenfehler durchzuführen. Ich konnte es in 3D zeichnen und zeigt eine perfekte 3D-Kugel. Funktioniert immer noch nicht auf Neigung oder Neigung.

Jeder Zeiger wird hilfreich sein.

Der Code und seine Implementierungen lauten wie folgt:

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

Wo magnetom_x, #_yund #_zsind Komponenten eines 3D - Vektor , die tatsächlich RAW Werte aus dem Magnetometer. Roll und Pitch stammen von einem mysteriösen Kalman-Filter, der vom integrierten Beschleunigungsmesser und Gyroskop ausgegeben wird. Diese drei Sensoren befinden sich in ATAVRSBIN1 . Roll und Pitch sind bis zu diesem Zeitpunkt in Ordnung.

Jetzt eine einfache Überschrift Berechnung nach journal_of_sensors_renaudin et al_2010c.pdf hätte sein sollen MAG_Heading = atan2(-magnetom_y, magnetom_x) ;und mit Kompensation wie oben.

Der Gesamtcode stammt einfach von OPEN AHRS .


Daten in den Formaten Roll, Pitch und Yaw. Ich habe das Gerät nur mit der Hand gedreht. Die ersten drei konzentrierten sich auf Roll, Pitch und Yaw. Die restlichen zwei werden zuerst um 45 Grad entlang X (gerollt) und dann entlang des lokalen Z des Magnetometers gedreht. Dann wird dasselbe mit einer Drehung um 45 Grad entlang Y (geneigt) und dann entlang des lokalen Z des Magnetometers wiederholt.

Die Diagramme liegen im Bereich von -180 bis 180 Grad.

Rollen Winkel in Grad in einer Datei Die YAW-Eigenschaften auf Rolle.

Tonhöhe Winkel in Grad in einer Datei Die YAW-Eigenschaften auf der Tonhöhe.

Gieren Winkel in Grad in einer Datei Die YAW-Eigenschaften von Yaw selbst.

Gieren um 45 Grad geneigt (gerollt) Winkel in Grad in einer Datei Die YAW-Eigenschaften auf Yaw mit 45 Grad gerollt.

Gieren um 45 Grad geneigt Winkel in Grad in einer Datei Die YAW-Eigenschaften auf Yaw mit einer Neigung von 45 Grad.

Hinweis: Für die letzten 2 Bilder: Zuerst in Ausgangsposition gehalten, das ist für alle gleich (siehe txt-Dateien). Dann 45 Grad gerollt und dann mit dem Flugzeuggerät (mit Magnetometer) entlang der Z-Achse des Magnetometers gedreht.

In ähnlicher Weise wurde das Gerät für das letzte Bild um 45 Grad entlang der Z-Achse des Magnetometers geneigt.

Ich hoffe, dass dies zur Lösung meines Problems beiträgt.


Neue Entwicklungen sind wie folgt:

Ich habe einige an der Überschrift gearbeitet. Ich habe folgende Ausgabe bekommen. Rollen csv

Tonhöhe csv

Gieren csv


Rick2047
quelle
noch keine Antwort !!
4
Ich denke, Sie erhalten mehr Antwort, wenn Sie die Mathematik, die Sie implementieren möchten, und den Code, den Sie zum Implementieren verwendet haben, anzeigen. Wir haben nur sehr wenig zu tun, außer "Es funktioniert nicht, Hilfe" - so lautet Ihre Frage. Es tut uns leid!
Martin Thompson
Die Verwendung von Magnetometern ist ein sehr spezialisiertes Gebiet, mit dem vergleichsweise wenige Menschen vertraut sein werden. Wenn ich Ihre Frage ein paar Mal durchlese, bin ich mir immer noch nicht sicher, was genau los ist. Sie sagen, es gibt die "falsche Ausgabe", aber das ist ziemlich vage. Vielleicht einige numerische Beispiele?
Jason R
1
Ist dies eine Frage zur Interpretation der Sensorausgaben oder zur Berechnung nützlicher Navigationsmaße aus dem vom Sensor bereitgestellten x-, y-, z-Vektor? Sind Ihre Messungen mit einer anderen Instanz desselben Sensors wiederholbar?
Vicatcu
1
@ Rahul - Ich bin überrascht, dass dies nicht mehr Aufmerksamkeit bekommt!
Kevin Vermeer

Antworten:

8

Ich mag deine Grafiken. Sie zeigen deutlich, dass Rollen, Nicken und Gieren zu funktionieren scheinen. Herzliche Glückwünsche! Das ist schon mehr Fortschritt als die meisten Leute machen.

Ich vermute, dass der von Ihnen präsentierte Code "den falschen" MAG_Heading-Wert berechnet, der sich von dem von Ihnen erwarteten MAG_Heading-Wert unterscheidet.

Es wäre für uns viel einfacher, Ihnen zu helfen, wenn Sie uns Folgendes geben würden: (Dies ist der Abschnitt "Beschreiben der Symptome" in "So stellen Sie Fragen auf intelligente Weise". )

  • Die Ausgangswerte des AK8975- Magnetometers sind m_x, m_y und m_z zu einem bestimmten Zeitpunkt.
  • Die Nick- und Rollwerte zum gleichen Zeitpunkt
  • der angeblich falsche MAG_Heading-Ausgabewert, der aus diesen Werten berechnet wird
  • was du erwartet hast das richtige MAG_Heading zu sein

Ich muss also spekulieren, dass Sie vielleicht auf die gleichen Probleme stoßen, die ich mir selbst mache :-).

  • Welches Winkelformat erwarten deine Funktionen sin () und cos () und atan2 ()? Müssen Sie eine Art Konvertierung zwischen dem Format vornehmen, in dem Pitch und Roll in diesem Format gespeichert sind? Müssen Sie von diesem Format in das Format konvertieren, das Sie für MAG_heading benötigen? (Brad, Grad oder Bogenmaß? Gleitkomma oder Festkomma?)
  • Gibt es einen Offset in den Rohwerten m_x, m_y, m_z, der abgezogen werden muss?
  • Sind alle Teile so angeordnet, wie es der Code vorsieht? Insbesondere ist die Nick- und Rollachse mit der Magnetometerachse ausgerichtet? (Soll m_x entlang der Rollachse nach vorne zeigen? Soll m_y entlang der Nickachse nach rechts zeigen?)
  • Möglicherweise muss ein Sensorwert oder ein anderer - möglicherweise m_z - negiert werden, bevor dieser Code eingegeben wird?
  • Wird dieser Code möglicherweise durch den einen oder anderen Interrupt unterbrochen, der seine internen Werte beschädigt? Ich scheine mich an ein anderes Projekt zu erinnern, bei dem, nachdem jemand eine "Teilung" in eine Interruptroutine eingefügt hatte, jede Triggerfunktionsberechnung überall im Programm oft das falsche Ergebnis lieferte.
  • Werden Interrupts möglicherweise so oft ausgelöst, dass dieser Code nie vollständig ausgeführt wird?

Es scheint andere Leute zu geben, die an anderer Stelle sehr ähnlichen Code diskutieren: http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843-Magnetometer ; etc.

Davidcary
quelle
Ich habe es jetzt gesehen. Ich komme wieder.
Rick2047
\ 1 / Ich erstelle eine CSV-Datei für [Roll, Pitch, Yaw und (Mx, My, Mz)]. \ 2 / Ich gehe davon aus, dass sich die MAG_Heading bei Änderung von Roll und Pitch mindestens bis zu zwei aufeinanderfolgenden Quadranten nicht ändern sollte. Die Überschrift bedeutet, wenn es sich um die Überschrift NE handelt, sollte sie weiterhin auf NE zeigen, bis sie den 90-Grad-Winkel vom Horizont in Aufwärts- oder Abwärtsrotationsrichtung für die Neigung überschreitet, und sollte bei Schräglage oder Kombination gleich sein.
Rick2047
\ 3 / Alle internen Berechnungen wurden im Bogenmaß durchgeführt und alle Consine-Funktionen erwarten nur den Bogenmaß. Zur Anzeige werden nur die Werte kopiert und in Grad umgerechnet. \ 4 / Gleitkomma. \ 5 / Alle Sensoren sind ausgerichtet und es wurden auch alle möglichen relevanten Kombinationen für die Ausrichtung mit SENSOR_SIGN [9] ausprobiert. \ 6 / Ich rufe gerade ab, sodass auf Interrupt-Basis nicht alle Probleme vorliegen.
Rick2047
Für meinen Punkt \ 1 / hier für alle Grafiken habe ich auch die entsprechenden CSV-Dateien angehängt. Oder Sie haben nach etwas anderem gefragt. Danke für diese gute Antwort. :) Ich werde "How To Ask Questions The Smart Way" implementieren, soweit es mein Aufwand und meine Zeit erlauben. :)
Rick2047
\ 1 / Ich arbeite eher für [Rollen, Nick, Gieren und (Mx, My, Mz) (Überschrift, Deklination)].
Rick2047
1

Der Anwendungshinweis für das LSM303 enthält eine nützliche Anleitung zum Kalibrieren eines Kompasses mit Neigungskompensation, der für Ihr Problem geeignet ist. Es ist ziemlich detailliert, sonst hätte ich die Berechnungen hier umgeschrieben. Beachten Sie, dass die Beschleunigungsmesserwerte für die Berechnung der vollständigen Nick-, Roll- und Gierbewegungen erforderlich sind, da eine Drehung um die Achse der Magnetfeldlinien zu keiner Änderung der Magnetometerwerte führt. Ebenso für die Schwerkraft mit dem Beschleunigungsmesser.

geometrikal
quelle
Der Link zeigt in der gleichen Gleichung ein unterschiedliches Vorzeichen. Ich werde alle anderen Kombinationen ausprobieren.
Rick2047