Kompass Kalibrierung

Ich möchte den Kompass HMC5883L kalibrieren. Es sollen soft und hard iron eliminiert werden. Das Ziel ist es, die Rohdaten so zu berechnen, dass ich am Ende einen Plot (x,y,z) als kugelförmige Wolke zu erhalte.

Durch Internet-Recherche habe ich herausgefunden, dass man den Sensor um 3 Achsen rotieren muss und dann alle maximalen und minimalen Werte ermitteln. Das steht zum Beispiel hier: http://www.bot-thoughts.com/2011/04/quick-and-dirty-compass-calibration-in.html.

Jedoch weiß ich nicht, wie ich diese maximalen und minimalen Werte ermitteln soll. Ich habe den Sensor schon um alle 3 Achsen rotiert. Für jede Rotation um je eine Achse erhalte ich für die anderen beiden Achsen jeweils ein Minimum und ein Maximum. Nach drei Rotationen würde ich also für jede Achse jeweils 2 Minimum und 2 Maximum.

In diesem Datenblatt wird eine 2D-Kalibrierung erklärt: http://www.jameco.com/Jameco/Products/ProdDS/2150248.pdf (ab Seite 21).

Wie kann ich eine 3D-Kalibrierung genau durchführen?

Moin, der Sensor ist ein Gengiger Sensor der in den MultiWii (Flugsteuerung für Multicopter) verwendet wird. Der Code ist Open Source, evtl findest Du da etwas. Das mit dem Rotieren um die drei Achsen ist soweit richtig. Ansonnsten such mal nach 9DOF Sensor. Auf die schnelle habe ich das hier gefunden. http://forum.arduino.cc/index.php/topic,143471.0.html Gruß Ingo

Auf meinem Chip sind insgesamt 4 Sensoren enthalten (Temperatur-, Beschleunigungssensor, Magnetometer und ein Gyrometer). Davon brauch ich nur den Beschleunigungssensor und das Magnetometer (beide 3-achsig), um die Neigung zu messen. Dafür müsste ich aber zunächst das Magnetometer kalibrieren. Das Problem, das ist hab, ist, dass ich nicht weiß, wie ich nach Rotation um den drei Achsen Xmin/Xmax, Ymin/Ymax, Zmin/Zmax erhalte. Ich bekomme jeweils immer doppelt Xmin/Xmax, Ymin/Ymax, Zmin/Zmax, da ich bei jeder Rotation um einer Achse die Feldstärken der beiden anderen Achsen erhalte. Das sind die Formeln, in denen ich Xmin/Xmax, Ymin/Ymax, Zmin/Zmax einsetzen muss:

Mx_Sensitivity = (Mx_max-Mx_min)/2 My_Sensitivity = (My_max-My_min)/2 Mz_Sensitivity = (Mz_max-Mz_min)/2

Mx_Offset = (Mx_max+Mx_min)/2 My_Offset = (My_max+My_min)/2 Mz_Offset = (Mz_max+Mz_min)/2

Damit sieht der Korrekturansatz dann folgendermaßen aus:

Mx_cal = (Mx- Mx_Offset) / Mx_Sensitivity My_cal = (My- My_Offset) / My_Sensitivity Mz_cal = (Mz- Mz_Offset) / Mz_Sensitivity

Ich habe schon viele verschiedene Codes aus dem Internet. Die meisten basieren auf die oben genannten Formeln, wo man die Werte für Xmin/Xmax, Ymin/Ymax, Zmin/Zmax einfach in dem Code einsetzen muss.