Beschleunigungssensor Neigungskompensation

Gast #4457129
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
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
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.
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
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
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
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.
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.
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
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.
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.