Forum: Mikrocontroller und Digitale Elektronik Neigungskompensation Magnetsensor


von Sven (Gast)


Lesenswert?

Hallo.

Ich habe mit einem 3-achsigen Magnetfeldsensor einen elektronischen 
Kompass realisiert.
Dieser funktioniert schon ziemlich gut, allerdings nur,wenn ich ihn in 
horizontaler Lage halte.

Zusätzlich möchte aber nun noch eine Neigungskompensation mit Hilfe 
eines Beschleunigungssensors für den Kompass realisieren.
Im Internet habe ich schon mehrere Pdf´s gefunden,die größtenteils alle 
auf die selben Formeln zur Neigungskompensation zurückgreifen:

X' = X*cos(alpha) + Y*sin(alpha)*sin(beta) - Z*cos(beta)*sin(alpha)

Y' = Y*cos(beta) + Z*sin(beta)

azimuth = atan(Y'/X') / PI * 180

Diese Formel habe ich in meinen Controller programmiert. Wenn ich mir 
nun die azimuth-Werte z.B. bei einer X-Achsen-Neigung des 
Beschleunigungssensors um +/-20° ausgeben lassen,dann schwanken diese in 
einem Bereich von ca. 80°

(azimuth nei -20°:ca. 310°; azimuth bei Nulllage: 16°; azimuth bei +20°: 
30°)

Meine Frage nun: Was ist an der Formel falsch bzw. muss ich noch weitere 
Berechnungen ergänzen,damit ich bei Neigung des Kompasses die Richtung 
nahezu konstant bleibt?

Mfg,Sven

von Sven (Gast)


Lesenswert?

Hat keiner nen Tipp?

Irgendwie bezweifle ich,dass dies diese Formel korrekt ist!
Überprüfen kann ich dies eigentlich gut,da ich ein Eval-Board von dem 
HMC5843 hier habe mit mitgelieferter Simulationssoftware.Dabei wird die 
Neigung auch gut kompensiert und die ausgegebene Richtung bleibt 
konstant.

Wenn ich nämlich die Werte der einzelnen Achsen des Magnetsensors bzw. 
des Beschleunigungssensors in die Formeln wie in obigem Post 
einsetze,dann kommen bei Neigung des Magnetsensors völlig andere 
Richtungswerte raus.

MfG,Sven

von Karl H. (kbuchegg)


Lesenswert?

Sven schrieb:
> Hat keiner nen Tipp?

Was ist X, Y und Z?
Wo kommen alpha und beta her?
Hast du auch nicht vergessen in Radianten und nicht in Grad einzusetzen?
Hast du dir die entsprechenden Werte angesehen?
Hast du schon versucht die Formel herzuleiten? (Auch wenn das ganze 3D 
ist, recht viel mehr als Phythagoras und sin/cos im rechtwinkeligen 
Dreieck brauchst du dazu nicht. Kugel aufmalen, Ausgangswerte 
einzeichnen, Endwerte einzeichnen, und festlegen um welche Achsen du in 
welcher Reihenfolge drehen musst um den 3D Vektor in die Äquatorebene 
zurückzubringen. Mit Rotationsmatrizen gehts einfacher, aber wenn du 
damit keine Erfahrung hast, gehts auch so.)

von didadu (Gast)


Lesenswert?

Ich hätte in dem Formelsatz auf jeden Fall eine klare Symmetrie zwischen 
zwei von den drei Raumachsen erwartet.

Da muss also etwas falsch sein oder fehlen.

von Sven (Gast)


Lesenswert?

X,Y und Z sind die Werte der entsprechenden Magnetsensorachsen.
alpha ist der Winkel der X-Achse des Beschleunigungssensors (Pitch) und 
beta und demzufolge der Winkel der Y-Achse des Beschl.-Sensors (Roll).

Ja,ich rechne mit den Radienten.
Naja,herleiten selbst nicht direkt,aber ich habe genügend App-notes in 
denen dies gemacht wurde.Ich selbst kann die Herleitung auch 
nachvollziehen und wie schon bereits oben erwähnt, kommen am Ende in 
fast jeder App-Note die beiden Formeln für X' und Y' wie von mir bereits 
oben beschrieben raus.

Mal ein Beispiel der Achsenwerte vom Eval-Board,wobei alpha und beta die 
Werte sind,die wie folgt berechnet werden: ADC-Wert*Sensorauflösung:

 X    Y     Z    alpha    beta    Sensorneigung
18  -430  -360   0.002    0.007   keine Neigung
47  -292  -446   -0.32    0.004   Sensor um -20° entlang der X-Achse 
geneigt

Bei der -20°-Neigung sollte nun eigentlich der gleiche Richtungswert 
rauskommen,als wenn der Sensor nicht geneigt wird!

von Karl H. (kbuchegg)


Lesenswert?

didadu schrieb:
> Ich hätte in dem Formelsatz auf jeden Fall eine klare Symmetrie zwischen
> zwei von den drei Raumachsen erwartet.
>
> Da muss also etwas falsch sein oder fehlen.

Nicht unbedingt.
Wenn man sich die allgmeine Rotationsmatrix (Drehung um alle 3 
Raumachsen) ansieht und algebraisch ausrechnet, dann sieht man, dass die 
Matrix nicht symetrisch bezüglich der Diagonalen ist, obwohl es die 
Ausgangsmatrizen sind. Das ist auch gut so, sonst könnte man eine Matrix 
nicht mehr in Eulerwinkel zerlegen :-)

Edit:
Eines ist allerdings wirklich seltsam: Im Ausdruck für Y' kommt alpha 
nicht vor.

von Karl H. (kbuchegg)


Lesenswert?

> alpha ist der Winkel der X-Achse des Beschleunigungssensors (Pitch)
> und beta und demzufolge der Winkel der Y-Achse des Beschl.-Sensors
> (Roll).

>  X    Y     Z    alpha    beta    Sensorneigung
> 18  -430  -360   0.002    0.007   keine Neigung
> 47  -292  -446   -0.32    0.004   Sensor um -20° entlang der X-Achse
> geneigt

ich denke du hast da einen Hund in den Winkeln. Wenn alpha der Winkel 
der X-Achse ist, dann ist alpha eine Drehung um die Y-Achse (oder Z? 
hast du ein rechteHand-System bei dem Z nach oben schaut?). Bei einer 
Drehung um die Y-Achse ändern aber X und Z die Werte. Bei dir ändern 
sich aber Y und Z

von Sven (Gast)


Lesenswert?

Ja das ist richtig.Wenn ich den Sensor um die Y-Achse rotiere,dann 
ändern sich die Werte für X und Z.So ist es auch bei mir.

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.