Hallo zusammen, ich möchte in meinem Projekt mit einem IMU die Orientierung bestimmen. Dafür verwende ich den LSM9DS0 Sensor. Dieser liefert mir Beschleunigungs-, Gyroskop- und Magnet/Compasswerte.. Desweiteren werden die Euler Winkel berechnet womit ich eine Orientierungsänderung erkenne. Ich möchte nun zu Beginn meiner Messung die absolute Orientierung mit Bezug auf das Erdkoordinatensystem bestimmen und die weiteren Werte dann in Relation dazu berechnen. Jetzt ist die Frage: Wie bekomme ich diese absolute Position? Wie kann ich aus den Magnetwerten die Orientierung bezüglich Himmelsrichtung erhalten? Ich hoffe ihr könnt mir helfen:)
Ein GPS System habe ich leider nicht zur Verfügung, es sollte ausschließlich mit IMUs funktionieren, da es auch indoor nutzbar sein sollte...
Ich verstehe nicht ganz das Problem. Willst du sozusagen die Magnetometerwerte in "Kompasswerte" umrechnen?
Na ja, in NS-Richtung gibt es wohl ein Maximum der Komponenten, oder ?
Hier ein paar Hilfreiche AppNotes http://cache.freescale.com/files/sensors/doc/app_note/AN4246.pdf http://cache.freescale.com/files/sensors/doc/app_note/AN4248.pdf http://cache.freescale.com/files/sensors/doc/app_note/AN4249.pdf http://cache.freescale.com/files/sensors/doc/app_note/AN4247.pdf
:
Bearbeitet durch User
Mirko W. schrieb: > Ich verstehe nicht ganz das Problem. Willst du sozusagen die > Magnetometerwerte in "Kompasswerte" umrechnen? Ich möchte im Prinzip Zu Beginn der Messung eine "Anfangsposition" bestimmen, auf die dann alle Werte bezogen werden. Vielleicht zum Verständnis ein Beispiel: Die Sensoren sind mit einekm Gurt an meiner Stirn befestigt. Ich stehe ruhig und schaue z.B. in Richtung Norden. Dann setze ich mein Yaw Winkel auf 0 und wenn ich jetzt gerade aus laufe bleibt der Yaw winkel bei 0, wenn ich mich drehe zeigt der yaw winkel z.B. 90° an. Das funktioniert auch alles schon. ich möchte eben nun die Orientierung der Anfangsposition erhalten/messen (bezogen aufs Erdkoordinatensystem) Im Prinzip soll einfahc nur die Richtung bestimmt werden, in die ich am Anfang der Messung schaue..
:
Bearbeitet durch User
Zur Verdeutlichung ein kleines Bild. Der Sensor ist so wie auf dem Bild angeordnet, entscheident is der Yaw Winkel...Drehe ich den Sensor um die Z-Achse(Yaw), ändern sich die Magnetwerte von X und Y... kann ich daraus die Orientierung bestimmen? Es ist vielleicht anzumerken dass der Sensor normal auf der großen Seite liegt, jedoch is es für die Anbringung am Körper sinnvoller ihn um 90° zu kippen
Tobi C. schrieb: > (bezogen aufs Erdkoordinatensystem) Was hälst Du von manueller Eingabe eines Wertes? Den Wert bekommst Du aus Google. Ansonsten fällt mir nur GPS ein. BTW: die Fehler werden sich aufsummieren wenn Du nicht gelegentlich neue Absolutwerte angibst. rgds
Hm, was willst Du denn? Suchst du eine absolute oder relative Position? Am Anfang ist die relative nun mal "0" und dann musst Du die Sensorwerte (mit ihren Fehlern und ihrer Drift) über die Zeit aufintegrieren. Die Absolute Position ergibt sich dann durch ein Offset ;-) Aber das funktioniert alles wahrscheinlich nur theoretisch oder für eine kurze Zeit, da die Ungenauigkeit und Drift dazukommt. In der Realität muss man immer wieder koppeln (GPS, bekannte Marken)
6a66 schrieb: > Was hälst Du von manueller Eingabe eines Wertes? > Den Wert bekommst Du aus Google. > Ansonsten fällt mir nur GPS ein. > > BTW: die Fehler werden sich aufsummieren wenn Du nicht gelegentlich neue > Absolutwerte angibst. > > rgds Das Problem ist dass es kein Internet dabei gibt, wirklich rein mit IMUs.. Die Fehler werden denk ich kein großes Problem... Es sollen nur kurze messung (5-20s) gemacht werden und dabei nur einfache Bewegungsabläufe.. z.B. 3m geradeaus laufen und dann drehen und 4m nach rechts oder so, wirklich nichts kompliertes.. es muss eben nur die richtung für die ersten meter geradeaus bestimmt werden
Tobi C. schrieb: > Magnetwerte von X und Y... kann ich daraus > die Orientierung bestimmen? Suchst Du den "Arkustangens"?
micha schrieb: > Hm, was willst Du denn? Suchst du eine absolute oder relative Position? > Am Anfang ist die relative nun mal "0" und dann musst Du die Sensorwerte > (mit ihren Fehlern und ihrer Drift) über die Zeit aufintegrieren. Die > Absolute Position ergibt sich dann durch ein Offset ;-) Aber das > funktioniert alles wahrscheinlich nur theoretisch oder für eine kurze > Zeit, da die Ungenauigkeit und Drift dazukommt. In der Realität muss man > immer wieder koppeln (GPS, bekannte Marken) Genau das ist es, relativ gesehen ist die Anfangsposition für pitch roll und yaw 0.. auf diese werden dann alle werte bezogen. funktioniert auch alles super. nur möchte ich eben wissen wie dieses Anfangsposition zum Erdkoordinatensystem liegt. Ja es werden nur Messungen im Sekundenbreich durchgeführt, und auch nur einfache Abläufe... GPS gibt doch eigentlich nur die Position an und nicht die Orientierung, oder liege ich da falsch?
Torsten C. schrieb: > Tobi C. schrieb: >> Magnetwerte von X und Y... kann ich daraus >> die Orientierung bestimmen? > > Suchst Du den "Arkustangens"? Kann ich mit dem die orientierung bestimmen? z.B habe ich Mag X: -30µT und Mag Y: -10µT, kann ich damit Berechnen in welche Himmelsrichtung der Sensor liegt?
Tobi C. schrieb: > kann ich damit Berechnen in > welche Himmelsrichtung der Sensor liegt? Genau. Entweder musst Du mit "if / else" noch die Vorzeichen auswerten oder Du benutzt "atan2()": http://www.cplusplus.com/reference/cmath/atan2/
Hier noch der link zum code vom video oben: http://g6ejd.redirectme.net/computing/COMPASS_display.htm Alles entscheidende spielt sich in der loop ab. Das es ein anderer Sensor ist muss vermutlich das Auslesen der XYZ Werte angepasst werden.
Torsten C. schrieb: > Genau. Entweder musst Du mit "if / else" noch die Vorzeichen auswerten > oder Du benutzt "atan2()": > > http://www.cplusplus.com/reference/cmath/atan2/ und dabei beachten, dass das mathematische Koordinatensystem und das "geographische" nicht übereinstimmen. Am einfachsten vertauscht man IMHO die X und Y Koordinaten im atan2 ;-)
Wenn das Teil waagerecht liegt, sollten die X+Y Accels 0 liefern und der Z-Accel 1.0g (Erdbeschleunigung). Für die Drehachse um Z musst du einmal den Kompass mit einem 'echten Kompass' auf Norden kalibrieren und die Meswerte irgendwo abspeichern (EEPROM). Dannach kannst du nach dem einschalten immer ziemlich genau die Anfangsorientierung bestimmen.
Peter S. schrieb: > Wenn das Teil waagerecht liegt, sollten die X+Y Accels 0 liefern und der > Z-Accel 1.0g (Erdbeschleunigung). Für die Drehachse um Z musst du einmal > den Kompass mit einem 'echten Kompass' auf Norden kalibrieren und die > Meswerte irgendwo abspeichern (EEPROM). Dannach kannst du nach dem > einschalten immer ziemlich genau die Anfangsorientierung bestimmen. Der Sensor sollte aber so liegen das Accel X 1g ist und Y- und Z-Accel 0 ist, quasi um 90 grad gedreht... Ich werde dann wohl mal eure Antworten auswerten und eine rückmeldung geben:) Danke
hp-freund schrieb: > Hier noch der link zum code vom video oben: > > http://g6ejd.redirectme.net/computing/COMPASS_display.htm > > Alles entscheidende spielt sich in der loop ab. > Das es ein anderer Sensor ist muss vermutlich das Auslesen der XYZ Werte > angepasst werden. Der Sensor sollte ziemlich ähnlich sein, nur dass der mein Sensor noch ein Gyroskop hat.. Im Prinzip brauche ich eine Funktion mit den Inputs Accelerometer und Magnetometer und als Output die Himmelsrichtung ( Wie auf dem Kompass Angezeigt z.B. 30° Nord). Das kann gerne auch offline passieren, da die Daten erst nach der Messung ausgewertet werden. Das wird dann wohl diese Funktion sein: angle= atan2((double)y + y_offset,(double)x + x_offset)* (180 / 3.141592654) + 180; Aber woher kommen die offset werte?
:
Bearbeitet durch User
Tobi C. schrieb: > Aber woher kommen die offset werte? Das dürften die Korrekturwerte der Achsen bei der Nord-Orientierung sein. Also erste Messung mit offset=0 und dann die ermittelten Werte (-) eintragen.
hp-freund schrieb: > Tobi C. schrieb: >> Aber woher kommen die offset werte? > > Das dürften die Korrekturwerte der Achsen bei der Nord-Orientierung > sein. > Also erste Messung mit offset=0 und dann die ermittelten Werte (-) > eintragen. Das heißt: 1. Ich richte den Sensor nach Norden aus und Messe die Werte? Diese werden dann als Offset angenommen 2. ich implementiere die oben genannte Funktion und Berechne somit den Winkel Welche Werte nehme ich dafür? Die Magnetwerte? Einheiten dürften dann ja aufgrund des Bruchstriches egal sein oder? (Magnetwerte sind in µT gemessen)
1. den Betrag der Werte -> positive als offset abziehen 2. ja der Sensor gibt nur mag Werte, also diese in die Gleichung einsetzen. Der Faktor ergibt sich nach der Konfiguration. Lässt sich aber auch leicht mit einer 90° oder 180° Drehung kontrollieren.
hp-freund schrieb: > 1. den Betrag der Werte -> positive als offset abziehen > 2. ja > > der Sensor gibt nur mag Werte, also diese in die Gleichung einsetzen. > Der Faktor ergibt sich nach der Konfiguration. Lässt sich aber auch > leicht mit einer 90° oder 180° Drehung kontrollieren. Wieso nur den Betrag? Meinst du es reicht den sensor bei der ersten Messung nach einem smartphone kompass auszurichten oder ist das zu ungenau? Und wie soll ich ihn ausrichten? Quasi dass die Achse die von der stirn gerade nach vorne zeigt richtung Norden zeigt? Man muss immer n bisschen umdenken weil ich den sensor ja um 90° gekippt verwende:D
Tobi C. schrieb: > Das heißt: > 1. Ich richte den Sensor nach Norden aus und Messe die Werte? > Diese werden dann als Offset angenommen Nein, du musst für jede Achse den Min und Max wert bestimmen. Also Messung starten und den Sensor in alle erdenklichen Richtungen 360° drehen. Die Min und Max werte addierst du und das teilst du durch 2. Also X_mag_offset = (X_mag_min + X_mag_max)/2 X_mag_compensated = X_mag_raw - X_mag_offset.
Timmo H. schrieb: > Tobi C. schrieb: >> Das heißt: >> 1. Ich richte den Sensor nach Norden aus und Messe die Werte? >> Diese werden dann als Offset angenommen > Nein, du musst für jede Achse den Min und Max wert bestimmen. Also > Messung starten und den Sensor in alle erdenklichen Richtungen 360° > drehen. Die Min und Max werte addierst du und das teilst du durch 2. > > Also > > X_mag_offset = (X_mag_min + X_mag_max)/2 > X_mag_compensated = X_mag_raw - X_mag_offset. Und dann: angle= atan2((double)X_mag_compensated ,(double)Y_mag_compensated )* (180 / M_PI) + 180; oder wie? Das Min/Max bestimmen hört sich nicht sooo genau an... Ich drehe in quasi um alle 3 Achsen jeweils um 360° und schreib mir die Werte auf, wie oft muss ich das denn dann machen? Sorry für die dummen fragen...
https://www.youtube.com/results?search_query=LSM9DS0+calibraton Schau dir erst mal die videos für deinen chip an. Das erklärt sicher schon einiges.
Tobi C. schrieb: > Das Min/Max bestimmen hört sich nicht sooo genau an... Ich drehe in > quasi um alle 3 Achsen jeweils um 360° aber nicht gleichzeitig! eine Achse nach der anderen! > und schreib mir die Werte auf, > wie oft muss ich das denn dann machen? So oft bis du einigermassen reproduzierbare Werte hast. WEnn beim Drehen um die Z Achse der X-Wert zwischen +300 und -200 schwankt, dann hast du offenbar einen Offset im Sensor von +50. Denn da sich die äusseren Einflüsse ja nicht ändern, sollte ein idealer Sensor ja beim Drehen denselben Wert rauskriegen, wenn seine Messachse in Richtung der Quelle zeigt und wenn sie von ihm wegzeigt. EIn Messer wird ja auch nicht kürzer, wenn es auf dem Tisch liegt und du es um 180° drehst. Genau das sagen dir aber deine Messwerte: in der einen Richtung misst der Sensor +300 und wenn du das Messer (samt Sensor) um 180° drehst, dann misst er -200. Das - ist klar, schliesslich hast du um 180° gedreht. Aber die Zahlenwerte stimmen nicht überein. Eigentlich hätte er in der einen Richtung +250 ausgeben sollen und nach einer Drehung um 180° hätte das Ergebnis -250 lauten sollen. D.h. wenn der Sensor eigentlich 0 messen sollte, misst er nicht 0, sondern +50. Und diese ziehst du in weiterer Folge dann immer von deinen Messwerten ab, da hier ganz offensichtlich der Sensor einen Offsetfehler von +50 hat. Wenn der Sensor also einen Messwert von +300 auswirft, dann sind das in Wirklichkeit +250. Und wenn er -200 auswirft, dann sind das in Wirklichkeit -250. Drehst du nach dieser Korrektur den Sensor erneut, dann zeigt er bei einer Drehung um 180° denselben Zahlenwert, aber mit umgekehrten Vorzeichen an. Genau so wie es sein soll. Zeigt er zb (nach Korrektur) +78 und drehst du den Sensor um 180°, dann müssten -78 am Display stehen. > Sorry für die dummen fragen... Schön langsam wirds allerdings wirklich Zeit, dass du selber auch mal ein bisschen mitdenkst und dir nicht alles vorkauen lässt. Dein Projekt klingt eigentlich recht anspruchsvoll. Im Gegensatz dazu bist du ziemlich blauäugig unterwegs. Recht viel mehr als ein bischen Hausverstand und Grundkentnisse in Trigonometrie aus der Schule braucht man dazu nicht. (im 2D, im 3D wirds ein wenig schwieriger.) Und natürlich muss man sich mal von der Vorstellung lösen, dass alle Sensoren immer absolut und immer 100% genau sind und ideale Messwerte liefern. Das wird in der Theorie (im Physikunterricht) so vermittelt, hat aber nichts mit der Realität zu tun.
:
Bearbeitet durch User
hp-freund schrieb: > https://www.youtube.com/results?search_query=LSM9DS0+calibraton > > Schau dir erst mal die videos für deinen chip an. > Das erklärt sicher schon einiges. So wirklich gute Videos wie für den LSM303 gibts dort irgendwie garnicht so.. Ich denke der Code aus dem anderen Video wird auch schon der richtige Weg sein... Nur die Offsetwerte erhalten seh ich noch als Problem...
Karl H. schrieb: > Schön langsam wirds allerdings wirklich Zeit, dass du selber auch mal > ein bisschen mitdenkst und dir nicht alles vorkauen lässt. Dein Projekt > klingt eigentlich recht anspruchsvoll. Im Gegensatz dazu bist du > ziemlich blauäugig unterwegs. Ich werde mir das ganze jetzt nochmal in Ruhe durchlesen und testen... Aber es sollte ja nicht soo schwer sein einen Kompass zu bauen...
Tobi C. schrieb: > Ich werde mir das ganze jetzt nochmal in Ruhe durchlesen und testen... > Aber es sollte ja nicht soo schwer sein einen Kompass zu bauen... Ist es auch nicht. Zumindest nicht auf diesem Niveau. Nur musst du dich halt mal von der Vorstellung lösen, dass dir dein Sensor ideale Messwerte rauswirft, die du nur noch aufs Display geben brauchst. Was es mit dem Offset auf sich hat, hätte dir allerdings auch auffallen müssen, wenn du dir den X Wert einfach mal ausgeben lässt, den Sensor am Tisch liegen hast und dann den Sensor einfach mal am Tisch liegend drehst. Dann muss dir das auffallen, dass er in den absoluten Maximalwerten mgl. bei 180° unterschiedliche Werte bringt. Ich finds immer wieder erstaunlich, dass Leute Projekte bauen, und nie mit ihren Bauteilen im Vorfeld "gespielt" haben um rauszufinden, wie sie sich verhalten und wie die Werte aussehen, die sie zb von Sensoren kriegen.
:
Bearbeitet durch User
Eine Frage wäre da allerdings noch: Ich habe jetzt mal die Offsetmessung für jede Achse durchgeführt... Jetzt erhalte ich aber pro Achse 2 Offset Werte, müssen die noch miteinader verrechnet werden oder tausch ich die einfach je nach Orientierung aus? Die Messung habe ich auch mal angehängt... Ich denke die Ungenauigkeiten bei der Werte der Drehachse kommen von den Sensorungenauigkeiten und von meiner Bewegung?
Tobi C. schrieb: > Eine Frage wäre da allerdings noch: > Ich habe jetzt mal die Offsetmessung für jede Achse durchgeführt... > Jetzt erhalte ich aber pro Achse 2 Offset Werte, Ich würd den jeweils betragsmässig grösseren nehmen. Was du hier siehst, dass ist das das Erdmagnetfeld nicht parallel zu deinem Sensor (und wenn der am Tisch liegt damit nicht horizontal) verläuft, sondern geneigt ist. Idealerweise würdest du eine schiefe Ebene so anpassen, dass sich der Wert in der Achse, um die du drehst, nicht ändert. Diese schiefe Ebene liegt dann in der Ebene der Magnetfeldlinien an deinem Ort. Aber: so genau braucht das für einen Wald und Wiesen Kompass dann auch wieder nicht sein. Denn in der Praxis hast du sowieso je nach Umgebung noch Missweisungen. Magnetfelder, hervorgerufen durch Metalle, Elektromotore, Kabel in der Wand, etc. die sich mit dem Erdmagnetfeld überlagern. D.h. der Wert, den dein Kompass dann letzten Endes ergibt ist sowieso fehlerbehaftet.
:
Bearbeitet durch User
Karl H. schrieb: > Ich würd den jeweils betragsmässig grösseren nehmen. > > Was du hier siehst, dass ist das das Erdmagnetfeld nicht parallel zu > deinem Sensor (und wenn der am Tisch liegt damit nicht horizontal) > verläuft, sondern geneigt ist. > Idealerweise würdest du eine schiefe Ebene so anpassen, dass sich der > Wert in der Achse, um die du drehst, nicht ändert. Diese schiefe Ebene > liegt dann in der Ebene der Magnetfeldlinien an deinem Ort. > Aber: so genau braucht das für einen Wald und Wiesen Kompass dann auch > wieder nicht sein. Denn in der Praxis hast du sowieso je nach Umgebung > noch Missweisungen. Magnetfelder, hervorgerufen durch Metalle, > Elektromotore, Kabel in der Wand, etc. die sich mit dem Erdmagnetfeld > überlagern. D.h. der Wert, den dein Kompass dann letzten Endes ergibt > ist sowieso fehlerbehaftet. Ja ich denke das wird von der Genauigkeit genügen... ich habe die Min/Max Werte mit einer Beispiel GUI für diesen sensor ermittelt da sind die Werte im Bereich von -40 bis +40 in meinem eigenen Programm nutze ich die Rohdaten und habe Werte von -1000 bis +1000, da wird wohl noch irgend eine Umrechnung enthalten sein, die muss ich noch implementieren und dann kann das ganze mal getestet werden:) Danke für die Hilfe
Ein paar Gedanken zur Rechnerei. Und nicht vergessen: In einem Computer kriegst du Winkel aus atan2 in Radianten raus und nicht in Grad. Generell: Bei Winkelfunktionen werden Winkel immer in Radianten angegeben.
Karl H. schrieb: > Ein paar Gedanken zur Rechnerei. > > Und nicht vergessen: In einem Computer kriegst du Winkel aus atan2 in > Radianten raus und nicht in Grad. Generell: Bei Winkelfunktionen werden > Winkel immer in Radianten angegeben. Danke für die Datei.. ja die Winkel werden mit pi und 180° in grad umgerechnet... jetzt muss ich mal schauen dass auch wirklich nur winkel zwischen 0 und 360° rauskommen... Wenn der Winkel= Arctan(x/y) ist dann müsste im Prinzip wenn die y-Achse nach Nordne zeigt die Magnetwerte X=0 y=1 sein und Z ist egal weil das die Drehachse ist...Seh ich das richtig?
Tobi C. schrieb: > Karl H. schrieb: >> Ein paar Gedanken zur Rechnerei. >> >> Und nicht vergessen: In einem Computer kriegst du Winkel aus atan2 in >> Radianten raus und nicht in Grad. Generell: Bei Winkelfunktionen werden >> Winkel immer in Radianten angegeben. > > Danke für die Datei.. ja die Winkel werden mit pi und 180° in grad > umgerechnet... jetzt muss ich mal schauen dass auch wirklich nur winkel > zwischen 0 und 360° rauskommen... > > Wenn der Winkel= Arctan(x/y) ist dann müsste im Prinzip wenn die y-Achse > nach Nordne zeigt die Magnetwerte X=0 y=1 sein und Z ist egal weil das > die Drehachse ist...Seh ich das richtig? Im Prinzip. Aber: das schöne am atan2 ist, dass du dir darüber keinen Kopf zu machen brauchst. denn der normiert die Dinge schon so, wie man das braucht. Und er bestimmt auch den Quadranten, in dem das Ergebnis liegen muss. Man könnte das alles auch mit sin/cos (bzw. eigentlich asin bzw. acos) ausrechnen, müsste dann aber selber normieren und auch selber den Quadranten bestimmen. Dem atan2 wirfst du einfach die Längen der Katheten im rechtwinkeligen Dreieck rein und den Rest macht er.
Was ist denn das schon wieder, Karl-Heinz? "Sie Bastler in ihrer Bastlerwelt! Wir sind Angestellte, von uns wird Qualität verlangt! Wir müssen unsere Aufgaben termingerecht erfüllen, spezifikations- und kostengerecht! Wir sind Profis! Profis spielen nicht, sondern da sitzt schon jeder erste Handschlag! Wenn wir die Aufgabenpakete kriegen, dann sind die schon zu 100% durchkalkuliert, da ist keine einzige Minute für den Spieltrieb üblich. Den schminken sie sich mal ab! Sie brauchen nicht zu spielen, Karl-Heinz. Halten sie sich einfach an das Datenblatt. Der Hersteller ist ja auch DIN-ISO akkredidiert, darauf kann man sich verlassen! Abtreten!" [Zorn aus] Hach ja, wie waren die Bastelzeiten noch schön, als man das im Datenblatt wohlweislich verschwiegenen Phänomene der magnetischen Inklination und des Einflusses durch das Stahlgeflecht im Beton noch ausprobieren durfte! (Aber nach der Inklination wurde mein Auftrag nicht verlängert, weil ich "so kompliziert denke" - oder weil die Ergebnisse den rRoduktmanager so erschreckt haben.) Ciao Wolfgang Horn
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.