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.
:
Bearbeitet durch User
Man braucht keine komplizierten Mathe Formeln wie Rotationsmatrizen Quaternionen zu kennen. Mit atan2f(x, z)*180/3.14 geht problemlos
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.
:
Bearbeitet durch User
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
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.
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.