Forum: Mikrocontroller und Digitale Elektronik Kompass mit Magnetsensor BM1422AGMV


von Frager (Gast)


Lesenswert?

Hallo!

Ich versuche aktuell mittels BM1422AGMV Magnetsensor einen Kompass zu 
bauen.

Ich bis bereits soweit, dass ich mit einem Raspberry Pi die Werte für X, 
Y und Z bekomme. Der Offset ist auch schon grob kalibriert.

Aber wie fahre ich nun mit diesen Werten fort?

Ich habe überlegt, eine Feinkalibrierung zu machen, indem das Gerät in 
allen Achsen um 360° gedreht wird, währenddessen pro Achse Max und Min 
Werte erfasst werden und am Ende der Kalibrierung ein Fein-Offset 
berechnet wird, das dann immer von den Messwerten abgezogen wird.

Dies habe ich auch schon realisiert, aber irgendwie führt das nicht zum 
gewünschten Ergebnis. Die Winkelwerte (die auch schon berechnet werden) 
passen einfach nicht und weichen auch nach jeder Kalibrierung irgendwie 
anders ab.

Hat jemand eine Idee, was ich vom Prinzip her falsch mache?

Bin für alle Ratschläge dankbar, inkl. Links, Libraries, etc...

Danke für jeden Hinweis im Voraus!

von Alt G. (altgr)


Lesenswert?

Dein problem ist dass je nach wohnort das magnetfeld schräg in die erde 
geht. Je nördlicher je steiler. Schau mal wo x= maximal und y,z=minimal 
hinzeigt. Richtig, nach schräg unten.

Lösen kannst du das indem du zum äquator umziehst.
Oder indem der sensor mit wasserwaage ausgerichtet wird und du Z 
vernachlässigst.

: Bearbeitet durch User
von W.A. (Gast)


Lesenswert?

Alt G. schrieb:
> Lösen kannst du das indem du zum äquator umziehst.

Wenn man keine Ahnung hat, einfach mal die ...... halten.
https://de.wikipedia.org/wiki/Datei:World_Magnetic_Inclination_2010.pdf

von Gaussi (Gast)


Lesenswert?

W.A. schrieb:
> Wenn man keine Ahnung hat, einfach mal die ...... halten.
und du meinst du kannst "DEINE" um so weiter aufreisen :-(

Alt G. schrieb:
> Lösen kannst du das indem du zum äquator umziehst.
> Oder indem der sensor mit wasserwaage ausgerichtet wird und du Z
> vernachlässigst.

Diese Aussage ist richtig ! Das heisst ja nicht, dass dies die einzige 
Lösung sein muss.

von Günni (Gast)


Lesenswert?

Zuerst muss man einen Ort finden, an dem das Erdmagnetfeld unverfälscht 
wirkt. In Gebäuden ist das oftmals nicht der Fall. Prüfen kann man das, 
indem man mit einem Kompass (mit Kompassnadel) die angezeigte 
Nord-Richtung feststellt. Ändert sich diese, wenn man den Kompass 
verschiebt, ist das Erdmagnetfeld in Richtung und vermutlich auch Stärke 
beeinflusst.

Wenn man nun um eine Achse dreht, müssen die andere Achsen vollkommen 
stabil bleiben. Das geht, wenn man einen Drehteller auf einer festen 
Fläche montiert. Die Fläche muss dann abwechselnd horizontal oder 
vertikal ausgerichtet sein, wobei sie für jede Messreihe möglichst exakt 
um 90° gedreht bzw. gekippt werden muss. Dass die für die Fläche, den 
Drehteller und die Halterung nur unmagnetische Materialien verwendet 
werden dürfen, sollte klar sein. (Gern werden dabei Schrauben, 
Kugellager, Schraubzwingen o.ä. übersehen und auch ein im Handwerk 
üblicher Winkelmesser hat oftmals magnetische Teile.)

von W.A. (Gast)


Lesenswert?

Gaussi schrieb:
> Diese Aussage ist richtig ! Das heisst ja nicht, dass dies die einzige
> Lösung sein muss.

Hast du dir die verlinkte Inklinationskarte überhaupt angesehen?
Auch am Äquator weicht die Inklination teilweise um mehr als 20° von der 
Senkrechten ab.
https://www.ngdc.noaa.gov/geomag/WMM/data/WMM2010/WMM2010_I_MERC.pdf

von Frager (Gast)


Lesenswert?

Danke schon mal für alle Antworten!

Ich glaube, ich kann jetzt besser vorstellen, wo das Problem liegt. 
(Schiefes Magnetfeld...)

Wenn ich das Gerät beim Kalibrieren einfach am Tisch herumdrehe, kommen 
danach schon recht gute Winkelwerte heraus. Das Problem ist aber, dass 
das Gerät so ähnlich wie ein Handy, lageunabhängig messen soll, also 
auch wenn es dann hochkant oder in einem bestimmten Winkel geneigt steht 
und nicht mehr einfach am Tisch liegt.

Wenn ich es richtig verstehe, sollte man dann trotzdem immer die Werte 
in der horizontalen Ebene messen, richtig? Also müsste ich den 
Neigungswinkel des Gerätes miteinbeziehen (dieser wird glücklicherweise 
ebenfalls gemessen) und das Koordinatensystem transformieren? Gibt es 
eine fertige Library für sowas? Ich werde vermutlich nicht der erste 
Mensch sein, der sowas macht...

Danke für alle weiteren Hinweise im Voraus!

von Alt G. (altgr)


Lesenswert?

IMU.
Heisst du verkuppelst gyro, acc umd mag werte.
Findet sich bei jeder opensource quadcopter-soft die magnetsensor kann.

Darum sind bei mpu9050 z.b. auch alle 3 sensoren in einem chip drin.

: Bearbeitet durch User
von Frager (Gast)


Lesenswert?

Hallo!

Gyroskop habe ich leider nicht verbaut nur Magnetsensor und 
Beschleunigungssensor. Dafür ist das Gerät, wenn gemessen werden soll, 
in Ruhe. Und das gerne für 1-2 Minuten.

Ich habe mich an folgende Anleitung gehalten:
http://robo.sntiitk.in/2017/12/21/Beginners-Guide-to-IMU.html
und folgende Formeln in meinen Code eingepflegt:

pitch = 180 * atan2(accelX, sqrt(accelY*accelY + accelZ*accelZ))/PI;
roll = 180 * atan2(accelY, sqrt(accelX*accelX + accelZ*accelZ))/PI;


mag_x = magReadX*cos(pitch) + magReadY*sin(roll)*sin(pitch) + 
magReadZ*cos(roll)*sin(pitch)
mag_y = magReadY * cos(roll) - magReadZ * sin(roll)
yaw = 180 * atan2(-mag_y,mag_x)/M_PI;


Dabei habe ich darauf geachtet, dass ich die Werte der Achsen der 
einzelnen Chips so in die Formeln einpflege, dass es die Werte für die 
Achse des gesamten Gerätes sind. (z.B. hat der Magnetsensor seine 
x-Achse in Richtung -y des Gerätes, also wird statt dem y-Wert -x 
eingespielt.)

Ebenso habe ich darauf geachtet, dass die Winkelwerte in Radianten in 
die entsprechenden Funktionen eingespeist werden.

Auch habe ich beim Magnetsensor die Werte normiert, also durch (max-min) 
dividiert.

Roll und Pitch passen auch, soweit ich das beurteilen kann.

Yaw passt, solang das Gerät am Tisch steht. wenn Pitch und Roll 
zunehmen, passt es nicht mehr. Wieso?

von Alt G. (altgr)


Lesenswert?

Vorgehen ist einen vektor aus MAG und einen aus ACC zu bilden. Dann 
projezierst du den MAG vektor auf die XY ebene des ACC vektors. Das ist 
dann nord.

Anders ausgedrückt du musst den MAG vektor, der im sensor 
koordinatensystem ist, in das ACC koordinatensystem drehen. Das ist eine 
3D vektor rotation. Erst dann machst du den atan2(x,y).

Deine formeln funktionieren auf dem tisch weil da die sensor XY ebene da 
mit der ACC xy ebene übereinstimmt.

: Bearbeitet durch User
von Frager (Gast)


Lesenswert?

Hmmm…
Ich dachte, dass das genau für diesen Zweck fertige Formeln sind!?

Sind die Richtigen irgendwo beschrieben?

von my2ct (Gast)


Lesenswert?

Frager schrieb:
> Sind die Richtigen irgendwo beschrieben?

Die kommen sogar im Vernünftigen Schulunterricht bei der Vektorrechnung 
dran - Skalarprodukt und 3D-Drehmatrix.

von Jester (Gast)


Lesenswert?

my2ct schrieb:
> Frager schrieb:
>> Sind die Richtigen irgendwo beschrieben?
>
> Die kommen sogar im Vernünftigen Schulunterricht bei der Vektorrechnung
> dran - Skalarprodukt und 3D-Drehmatrix.

Wo gibt es noch vernünftigen Schulunterricht? Oder was machen die 
älteren Semester, bei den das schon zu lange her ist?

Also ich schau da immer in meinen "Bronstein" (Taschenbuch der 
Mathematik, Verlag Harri Deutsch) -- und finde da das Kapitel 
"Analytische Geometrie des Raumes" mit dem Unterkapitel "Transformation 
rechtwinkliger Koordinaten".

Sollte auch antiquarisch für einen schmalen Euro erhältlich sein.

von Frager (Gast)


Lesenswert?

Mir ist natürlich bewusst, dass man das alles mathematisch selber 
herleiten kann und ich denke schon, dass ich das noch schaffen würde, 
aber soetwas muss es doch schon fertig geben? Man muss ja auch nicht 
Schaltungen diskret aufbauen, die es schon als fertige ICs gibt!?

Außerdem schauen die Formeln, die ich aus der Anleitung kopiert und auch 
hier gepostet habe, für mich so aus, als würden die genau das machen. Es 
wird ja Roll und Pitch mithilfe des Beschleunigeungssensors errechnet 
und dann in die Formeln danach eingesetzt. Warum würde man sonst Roll 
und Pitch für die Berechnung der Himmelsrichtung brauchen, wenn nicht, 
um den Magnetfeld-Vektor in die Ebene zu bringen, die horizontal zum 
Boden ist?

von Alt G. (altgr)


Lesenswert?

Denkst du irgendwer hat lust für lau deine fomeln zu checken?

Warum schaust du nicht wie andere das machen?
Betaflight IMU?
Ardupilot IMU?
Jede opensource kompass-android app?

Hier Mimimi zu schreien bringt nix.

: Bearbeitet durch User
von Frager (Gast)


Lesenswert?

So. Hab's gelöst. Da ihr so viel geholfen habt, poste ich euch meine 
Lösung:

von Alt G. (altgr)


Lesenswert?

Frager schrieb:
> Hab's gelöst. Da ihr so viel geholfen habt, poste ich euch meine
> Lösung

Toll für dich. Hab leider keine zeit das durchzusehen.
Hast ja recht lange gebraucht. Ein narkolepsie problem?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Frager schrieb:
> So. Hab's gelöst. Da ihr so viel geholfen habt, poste ich euch meine
> Lösung:

???

von Alt G. (altgr)


Lesenswert?

Wolfgang schrieb:
> ?
Er
> ?
verscheissert
> ?
dich

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.