Beschleunigungssensor Neigungskompensation

Gast #4457129
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
Gast #4457150
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.
Gast #4457167
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.
#4457194
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.
Gast #4457197
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.
Gast #4457267
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.
Gast #4457269
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.
#4457285
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.
#4457344
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).
Gast #4457358
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.
#4457380
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.