Magnetometer dynamische Kalibrierung

Ich arbeite an einem Magnetometer AK8975 als Teil einer IMU. Was für mich sehr schwierig zu sein scheint. Dieser Chip gibt als Ausgabe einen 3D-Vektor aus, der das Erdmagnetfeld an jedem beliebigen Ort auf der Erde oder in der Nähe davon beschreibt.

Ich habe zwei Arten von Kursberechnungsalgorithmen ausprobiert: Einer ist einfach arctan(-y/x)und der andere ist Neigungs- (Neigungs-) und Querneigungs- (Rollen-) Mathematik, wie unten erwähnt. Sowohl bei Neigung als auch bei Böschungen wird ein falsches Ausgangssignal ausgegeben.

Ich bin in der Lage, die korrekte Richtung bezüglich der Erde zu erhalten (unter Verwendung einfacher verfügbarer offener Studienressourcen), wenn sie gedreht wird und dabei horizontal bezüglich des Grundrisses bleibt, indem ich einen der beiden Algorithmen verwende.

Ich habe die Kalibrierung für weiche und harte Eisenfehler versucht. Ich könnte es in 3D plotten und zeigt eine perfekte 3D-Kugel. Funktioniert immer noch nicht bei Neigung oder Deklination.

Jeder Hinweis wird hilfreich sein.

Der Code und seine Implementierungen sind 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) ;

}

Wobei magnetom_x, #_yund #_zKomponenten eines 3D-Vektors sind, die eigentlich RAW-Werte vom Magnetometer sind. Rollen und Nicken stammen von einem mysteriösen Kalman-Filter-Ausgang von Onboard-Beschleunigungsmesser und Gyroskop. Diese drei Sensoren befinden sich in ATAVRSBIN1 . Rollen und Nicken sind bis zu diesem Zeitpunkt in Ordnung.

Nun hätte eine einfache Kursberechnung nach journal_of_sensors_renaudin et al_2010c.pdf erfolgen sollen MAG_Heading = atan2(-magnetom_y, magnetom_x) ;und mit Ausgleich wie oben.

Gesamtcode ist einfach von OPEN AHRS .


Daten im Format Roll, Pitch und Yaw. Ich habe das Gerät nur mit der Hand gedreht. Die ersten drei haben sich jeweils nur auf Rollen, Nicken und Gieren konzentriert. Bei Rest zwei wird das Gerät zuerst um 45 Grad entlang X gedreht (gerollt), dann entlang des lokalen Z des Magnetometers gedreht. Dann wurde dasselbe mit einer Drehung um etwa 45 Grad entlang Y (schräg) wiederholt, dann entlang des lokalen Z des Magnetometers gedreht.

Die Diagramme wurden im Bereich von -180 bis 180 Grad dargestellt.

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

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

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

Gieren bzgl. 45 Grad geneigt (gerollt) Winkel in Grad in einer Datei Die YAW-Eigenschaften beim Gieren mit 45 Grad Rollwinkel.

Gieren bzgl. 45 Grad geneigt (geneigt) Winkel in Grad in einer Datei Die GIER-Eigenschaften beim Gieren mit 45 Grad Neigung.

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

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

Ich hoffe, diese helfen bei der Lösung meines Problems.


Neue Entwicklungen sind wie folgt:

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

Tonhöhe csv

Gieren csv


noch keine Antwort !!
Ich denke, Sie werden mehr Antworten erhalten, wenn Sie die Mathematik zeigen, die Sie zu implementieren versuchen, und den Code, den Sie zur Implementierung verwendet haben. Wir können nur sehr wenig weitermachen als "es funktioniert nicht, Hilfe" - so lautet Ihre Frage. Verzeihung!
Die Verwendung von Magnetometern ist ein sehr spezialisiertes Gebiet, mit dem vergleichsweise wenige Menschen Erfahrung haben werden. Nachdem ich Ihre Frage ein paar Mal gelesen habe, bin ich mir immer noch nicht sicher, was genau falsch ist. Sie sagen, es gibt die "falsche Ausgabe", aber das ist ziemlich vage. Vielleicht ein paar Zahlenbeispiele?
Ich denke, das könnte in Elektrotechnik besser sein . Ich migriere es dorthin, um zu sehen, ob Sie bessere Antworten erhalten.
Danke ' yoda ' und ' Jason R ' .. aber ich sehe, ob ich hier etwas für (wie in) numerische Beispiele einfügen kann. Hey 'Yoda' ist ein intelligenter Agent. Beeindruckend.
Ich tippe nur, um Leute hier anzulocken.
Ich bin mir nicht ganz sicher, wonach du hier fragst? Wollen Sie damit sagen, dass Sie den Feldvektor (x,y,z) haben und diesen in (heading,elevation) umwandeln möchten?
Ist dies eine Frage, wie die Sensorausgaben zu interpretieren sind oder wie man aus dem x,y,z-Vektor, den der Sensor liefert, für die Navigation nützliche Maße berechnet? Sind Ihre Messungen mit einer anderen Instanz desselben Sensors wiederholbar?
@Rocketmagnet: ja.
@vicatcu: Um sicher navigatorisch nützliche Maßnahmen zu berechnen. Sie meinen, ob es zu unterschiedlichen Zeiten am selben Ort denselben Wert anzeigt, oder? Ja, die sind jederzeit wiederholbar.
Ich tippe nur, um Leute hier anzulocken. :)
@Rahul - Ich bin überrascht, dass das nicht mehr Aufmerksamkeit bekommt!
@KevinVermeer: ​​Ich stimme zu, also füge ich dieser Frage ein Kopfgeld hinzu.
Haben Sie die Verwendung von Quaternionen in Betracht gezogen, um die "Gimbal-Sperre" zu vermeiden?
Ich habe es jetzt gesehen. Ich komme wieder ... ich ziehe an einen anderen Ort.
Ich bin enttäuscht, dass niemand eine bessere Antwort auf diese Frage geben konnte. Wenn Robotics an die Öffentlichkeit geht, würde es vielleicht eine bessere Antwort geben, diese Frage dorthin zu verschieben?
Ja, es sollte dorthin migriert werden, wo Menschen eng mit fliegender Robotik oder ähnlichen Bereichen verwandt sind. Ich habe dieses Projekt pausiert. weil ich denke, dass das Magnetometer fehlerhaft oder nicht richtig dokumentiert ist oder nicht zum Zweck der Bewertung von Yaw, Pitch n Roll. Was soll ich noch sagen? :\
übrigens was ist "heading wrt"?

Antworten (2)

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

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

Es wäre viel einfacher für uns, Ihnen zu helfen, wenn Sie uns Folgendes geben würden: (Dies ist der Abschnitt „Beschreiben Sie die Symptome“ von „How To Ask Questions The Smart Way“ )

  • die AK8975- Magnetometer-Ausgangswerte 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 wurde
  • wie Sie die richtige MAG_Heading erwartet haben

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

  • Welches Winkelformat erwarten Ihre 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 gewünschte MAG_heading konvertieren? (Brads, Grad oder Bogenmaß? Fließkomma oder Festkomma?)
  • Gibt es einen Versatz in den rohen m_x-, m_y-, m_z-Werten, der abgezogen werden muss?
  • Sind alle Teile so angeordnet, wie es der Code vorsieht? Ist insbesondere 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?)
  • Vielleicht muss der eine oder andere Sensorwert - vielleicht m_z - negiert werden, bevor er in diesen Code eingespeist wird?
  • Wird dieser Code vielleicht durch den einen oder anderen Interrupt unterbrochen, der seine internen Werte beschädigt? Ich erinnere mich an ein anderes Projekt, bei dem, nachdem jemand eine "Division" in eine Interrupt-Routine eingefügt hatte, jede Trig-Funktionsberechnung überall sonst im Programm oft das falsche Ergebnis lieferte.
  • Werden Interrupts vielleicht so oft ausgelöst, dass dieser Code nie wirklich zu Ende läuft?

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!!! -Neu -IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Halten-Sie-den-Kurs-mit-HMC5843-Magnetometer ; usw.

Ich habe es jetzt gesehen.. Ich werde zurückkommen.
\1/ Ich erstelle eine CSV-Datei für [ Roll, Pitch, Yaw und ( Mx, My, Mz ) ]. \2/ Ich erwarte, dass sich der MAG_Heading bei Änderungen in Roll und Pitch nicht ändert, zumindest bis zwei aufeinanderfolgende Quadranten. Der Kurs bedeutet, wenn er in Richtung NE geht, sollte er weiter nach NE zeigen, bis er die 90 Grad vom Horizont in entweder der Aufwärts- oder Abwärtsdrehrichtung für die Neigung kreuzt, und sollte im Falle einer Schräglage oder Kombination gleich sein.
\3/ Alle internen Berechnungen wurden im Bogenmaß durchgeführt und alle Konsinusfunktionen erwarten nur Bogenmaß. Nur zur Anzeige werden die Werte kopiert und in Grad umgerechnet. \4/ Fließkommazahl. \5/ Alle Sensoren sind ausgerichtet und auch alle möglichen relevanten Kombinationen wurden für die Ausrichtung mit SENSOR_SIGN [9] ausprobiert. \6/ Ich mache es in der Abfrage, also werden alle Probleme auf Unterbrechungsbasis nicht hier sein.
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" so weit umsetzen, wie es meine Bemühungen und meine Zeit zulassen. :)
\1/ Ich arbeite eher für [ Roll, Nick, Gieren und ( Mx, My, Mz ) (Kurs, Deklination) ].
Die angehängten CSV-Dateien sind nett, aber sie sagen mir nur 3 Werte zu jedem Zeitpunkt (Pitch, Roll, Yaw). Es wäre schön, wenn Sie zu jedem Zeitpunkt eine CSV-Datei mit allen 7 Werten anhängen könnten: Nicken, Rollen, Gieren, Mx, My, Mz und die aus diesen 6 Eingaben berechnete mag_heading.
k Große Arbeit. Ich muss diese Arbeit noch einmal wiederholen. Die stelle ich nach Fertigstellung hier ein. oder wenn Sie eine Verknüpfung haben.
Ich habe beobachtet, dass die Deklination hier 'keine Zahl' (kann unendlich sein) kommt. Wenn Sie versuchen, etwas anderes zu überwinden, wird die Deklination entfernt und hier eingefügt.
Ich habe es im Format: RPY[, 38.074, 8.5236,-100.80,] MAG[,-36.000, 32.000,-132.00,] ACC[,-138.00, 216.00, 392.00,] GYR[,-253.00,-203.00,- 1580.0,MH:,-90.434
Exzellent! Diese Datei mit allen 13 Werten pro Zeitschritt sagt uns genau, was los ist. Ich muss bald verreisen – vielleicht kann jemand anderes das herausfinden, jetzt wo alle Daten verfügbar sind, während ich offline bin.
Jeder außer @davidcary.

Der Anwendungshinweis für das LSM303 enthält eine nützliche Anleitung zur Kalibrierung eines neigungskompensierten Kompasses, die auf Ihr Problem anwendbar ist. Es ist ziemlich detailliert, sonst hätte ich die Berechnungen hier umgeschrieben. Beachten Sie, dass die Beschleunigungsmesserwerte für vollständige Nick-, Roll- und Gierberechnungen 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.

Der Link zeigt unterschiedliche Vorzeichen in derselben Gleichung. Alle anderen Kombinationen werde ich ausprobieren.