Forum: Mikrocontroller und Digitale Elektronik Beschleunigungssensor Neigungskompensation


von Samuel W. (Gast)


Lesenswert?

Hallo zusammen,
nach mehreren Google-Sessions und suchen hier auf der Seite scheine ich 
immer noch nicht so ganz die richtige Lösung für mein Problem zu finden. 
Vielleicht habt ihr was parat denn ich denke ich bin sicher nicht der 
erste mit diesem Problem.

Ausgangslage:
Ich habe einen 3-Achsen Beschleunigungssensor der geneigt/schief 
eingebaut ist.
Wenn meine Mathe-Kenntnisse noch einigermaßen funktionieren müsste ich 
ja auf jeden Fall über den Erdbeschleunigungsvektor (1g in Z-Richtung, 
0g in X- und Y-Richtung) im kompletten Ruhezustand die Neigungswinkel 
über acos(Rn/R) für n = x,y,z berechnen können. (Diese Werte kann ich 
mir als Kalibrierung sozusagen merken/abspeichern)

Problemstellung, Beispiel:
Wenn ich den Sensor in seiner schiefen Einbaulage jetzt senkrecht zur 
Erdoberfläche hochhebe hätte ich ja eine Beschleunigung entlang der 
Z-Achse, durch die schiefe Einbaulage aber habe ich ja theoretisch 
Messwerte in alle drei Achsen (durch das lokale Koordinatensystem). Mein 
Problem gedanklich ist jetzt wie ich über die kalibrierten 
Neigungswinkel und Rotationen auf meine tatsächliche Beschleunigung nur 
entlang der Z-Achse komme. Ich möchte also sozusagen die Einbaulage 
kompensieren.

Gruß,
Samuel

von Christian J. (Gast)


Lesenswert?

Samuel W. schrieb:
> Ich möchte also sozusagen die Einbaulage
> kompensieren.

Wo ist das Problem? Du machtst eine Messung in Ruhe und ziehst die Werte 
ab, bzw nutzt du die internen Kompensationsregister, die solche Chips 
haben. ich benutze den ADSL345 Sensor, bei dem klappt das prima. Sobald 
jemand mein Moped anfasst geht die Sirene los. Und egal ob es schräg 
steht oder an eine Wand gelehnt ist. Ziehe ich die Zündung ab nimmt die 
CPU die Werte und jede Veränderung wird als Bewegung erkannt.

von Soul E. (Gast)


Lesenswert?

Samuel W. schrieb:

> Wenn meine Mathe-Kenntnisse noch einigermaßen funktionieren müsste ich
> ja auf jeden Fall über den Erdbeschleunigungsvektor (1g in Z-Richtung,
> 0g in X- und Y-Richtung) im kompletten Ruhezustand die Neigungswinkel
> über acos(Rn/R) für n = x,y,z berechnen können. (Diese Werte kann ich
> mir als Kalibrierung sozusagen merken/abspeichern)

Du machst eine Basis-Transformation, welche die Basisvektoren XYZ = 
(xx,xy,xz; yx,yy,yz; zx,zx,zz) Deines Messsystems auf die kartesischen 
Einheitskoordinaten XYZ' = (1,0,0; 0,1,0; 0,0,1) abbildet. Das ist die 
mathematische Form, den Sensor zu drehen.

von Joe F. (easylife)


Lesenswert?

Wenn dich nur der Anteil in Z-Richtung interessiert, kannst du gut auf 
komplizierte Rotationsberechnungen verzichten.

Du speicherst dir den "Null-Vektor", ich nenne ihn mal R0 ab.
Er entspricht der Richtung "unten" und hat die Länge, die 1 g 
entspricht.

Dann nimmst du den jeweiligen Messwert (R), und multiplizierst ihn mit 
R0.
Dadurch ergibt sich der Anteil von R in Richtung R0.

Also Z = R0 * R (als Vektorrechnung)

Die Länge von Vektor Z entspricht dann der Beschleunigung in Richtung 
R0.

: Bearbeitet durch User
von Stm M. (stmfresser)


Lesenswert?

Man braucht keine komplizierten Mathe Formeln wie Rotationsmatrizen 
Quaternionen zu kennen. Mit atan2f(x, z)*180/3.14 geht problemlos

von Sascha (Gast)


Lesenswert?

Vektoren und Matrizen sind nicht verkehrt, aber ich glaube mit 
Pythagoras kommst du auch schon ans Ziel.

Das sind einfach 2 Kräftedreiecke die rechtwinklig zuaneinander stehen, 
also 1/4 einer Pyramide bilden (mit den ganzen rechten Winkeln genau 
unter der Pyramidenspitze.

von Samuel W. (Gast)


Lesenswert?

Hallo zusammen,
danke schonmal für die Antworten. Also mich interessieren schon alle 
Beschleunigungen (X,Y und Z-Achse). Das mit dem Hochheben war nur als 
Beispiel gedacht.
Ich baue quasi das Modul in Schräglage ein, kalibriere es und möchte 
dann im Betrieb die realen X/Y/Z Beschleunigungen (im globalen 
Koordinatensystem) aufgrund der Messwerte die ich bekomme und den 
Kalibrierdaten.

von Wolfgang (Gast)


Lesenswert?

Samuel W. schrieb:
> Ich baue quasi das Modul in Schräglage ein, kalibriere es und möchte
> dann im Betrieb die realen X/Y/Z Beschleunigungen (im globalen
> Koordinatensystem) aufgrund der Messwerte die ich bekomme und den
> Kalibrierdaten.

Dann bist du bei Drehmatrizen und Eulerwinkeln.

von Jim M. (turboj)


Lesenswert?

Samuel W. schrieb:
> Ich baue quasi das Modul in Schräglage ein, kalibriere es und möchte
> dann im Betrieb die realen X/Y/Z Beschleunigungen (im globalen
> Koordinatensystem) aufgrund der Messwerte die ich bekomme und den
> Kalibrierdaten.

Wenn das Modul in beliebiger Schräglage eingebaut werden kann, musst Du 
zweimal messen, die 2. Messung erfolgt mit einem um 90° gedrehten Gerät.

Bei einer Messung ist die Drehmatrix nicht (ohne weitere Constraints) 
vollständig bestimmbar, bei zwei um 90° versetzten Messungen ergibt sich 
die Drehmatrix aus den gemessenen Vektoren und ihrem Kreuzprodukt.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Jim M. schrieb:
> Wenn das Modul in beliebiger Schräglage eingebaut werden kann, musst Du
> zweimal messen, die 2. Messung erfolgt mit einem um 90° gedrehten Gerät.

... oder eben 3x messen, jeweils einen Null-Vektor für jede Richtung 
nehmen, und dann mit allen 3 Richtungen genau so verfahren wie mit der 
Z-Achse (multiplizieren des gemessenen Vektors mit den drei 
Null-Vektoren ergibt jeweils den Anteil in der Richtung der 
Null-Vektoren).

: Bearbeitet durch User
von Soul E. (Gast)


Lesenswert?

Joe F. schrieb:

> Jim M. schrieb:
>> Wenn das Modul in beliebiger Schräglage eingebaut werden kann, musst Du
>> zweimal messen, die 2. Messung erfolgt mit einem um 90° gedrehten Gerät.
>
> ... oder eben 3x messen, jeweils einen Null-Vektor für jede Richtung
> nehmen, und dann mit allen 3 Richtungen genau so verfahren wie mit der
> Z-Achse (multiplizieren des gemessenen Vektors mit den drei
> Null-Vektoren ergibt jeweils den Anteil in der Richtung der
> Null-Vektoren).

Der Mathematiker nennt das "Basistransformation". Müsstest Du in einem 
Mathebuch für Jgst. 12 oder 13 finden.

von Joe F. (easylife)


Lesenswert?

Bzw. ist das Stichwort auch "Skalarprodukt"

Einfacher ausgedrückt:

Du stellst dein Objekt so hin, dass die neue X-Achse genau nach unten 
zeigt. Die Sensorwerte (a, b, c) speicherst du dir als (ax, bx, cx) ab.

Du stellst dein Objekt so hin, dass die neue Y-Achse genau nach unten 
zeigt. Die Sensorwerte (a, b, c) speicherst du dir als (ay, by, cy) ab.

Du stellst dein Objekt so hin, dass die neue Z-Achse genau nach unten 
zeigt. Die Sensorwerte (a, b, c) speicherst du dir als (az, bz, cz) ab.


Die Transformation deiner Sensorwerte (a, b, c) in das Koordinatensystem 
des Objektes (x, y, z) geht dann so:

x = a*ax + b*bx + c*cx
y = a*ay + b*by + c*cy
z = a*az + b*bz + c*cz


Die Güte deiner Kalibrierungswerte kannst du noch prüfen, indem du 
jeweils das Skalarprodukt zweier Null-Vektoren berechnest (also (ax, bx, 
cx) * (ay, by, cy) = ax*ay + bx*by + cx*cy    usw.)

Da sollte für alle 3 Skalarprodukte jeweils annähernd 0 herauskommen, 
denn die Vektoren stehen ja senkrecht aufeinander.

: Bearbeitet durch User
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.