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
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.
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.
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.
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.
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).
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.