Du musst den Pythagoras auf die 3 Werte anwenden.
Wert bei 1g = sqrt(x^2+y^2+z^2)
Hi,
auch wenn der Titel im ersten Moment etwas komisch wirkt, hab ich eine plausible Frage dazu:
Ich messe mit einem stillstehendem Accelerometer die Beschleunigung in 3 Achsen (X, Y & Z). Daraus kann ich auch die Winkel in X & Y Richtung errechnen, bis dahin kein Problem.
Da ich allerdings mehrere Boards habe, muss / möchte ich den Ausgabewert bei einer Beschleunigung von 1g errechnen. Hintergrund ist, dass die Sensoren alle ein bisschen streuen und ich die MÖGLICHST GENAUEN Ausgabewerte brauche, da die Werte anschließend integriert werden sollen (Integral wird natürlich gestützt, aber um so genauer es ist, umso genauer ist im Endeffekt das Resultat).
Mein erster Gedanke war eine Art Dreisatz, allerdings komme ich nicht auf einen grünen Zweig...
Ich kenne: Beschleunigung (X, Y, Z) , Winkel (X , Y , (Z kann berechnet werden).
Ich will wissen: Beschleunigung bei 1g
Die Beschleunigung bei einem gegebenem Winkel kann ich über sin(Winkel) errechnen, den Winkel bei gegebener Beschleunigung über arcsin(Beschleunigung).
Ich hoffe, ihr könnt mir bei meinem kleinen Problem helfen.
Vielen Dank & Gruß
Chris
EDIT:
Achja, eigentlich dachte ich, es reicht, wenn ich Beschleunigung1g = BeschleunigungX + BeschleunigungY + BeschleunigungZ rechne, aber sowohl mit, als auch ohne den Beträgen funktionierts nicht ... Je weiter der Sensor geneigt ist, desto größer werden die Werte, obwohl doch die Beschleunigung immer 1g beträgt (bei Stillstand)?!
Geändert von Che Guevara (22.09.2013 um 01:21 Uhr)
Du musst den Pythagoras auf die 3 Werte anwenden.
Wert bei 1g = sqrt(x^2+y^2+z^2)
Hi,
das stimmt leider nicht ganz.. Wenn der Sensor um mehr als ca. 20° geneigt ist, weichen die Werte bereits um ca. 200 ab ... Bei mehr als 40° weichen sie dann schon um bis zu 2000 ab ... (1g = 16384)
Eigentlich dachte ich auch an eine etwas andere Lösung:
Ich errechne den Winkel, um den die Z-Achse schief steht, berechne die daraus resultierende Beschleunigung und berechne anschließend irgendwie (???) die Beschleunigung bei 1g...
Den Winkel der Z-Achse kann ich berechnen, indem ich den Pythagoras von WinkelX & WinkelY berechne und von 90° abziehe, oder?
Die Beschleunigung errechne ich dann anhand der sinus-Funktion.
Stimmt mein Ansatz soweit?
Gruß
Chris
EDIT:
So ungefähr stelle ich mir das vor:
1. WinkelZ = 90 - pythagoras(WinkelX,WinkelY);
2. BeschleunigungZ = sin(WinkelZ);
3. Beschleunigung1g = 90/WinkelZ * BeschleunigungZ;
Bei Formel 3 bin ich mir noch unschlüßig, da das Verhältnis Winkel / Beschleunigung nicht linear ist ... evtl. komme ich da mit dem arcsin weiter?
Geändert von Che Guevara (22.09.2013 um 13:55 Uhr)
Die Beschleunigung ist ein dreidimensionaler Vektor. Dein Sensor liefert dir, da er in Wirklichkeit aus 3 orthogonal angeordneten Sensoren besteht, die 3 Komponenten des Beschleunigungsvektors in kartesischen Koordinaten.
Die Größe der (Erd)Beschleunigung ist der Betrag des Beschleunigungsvektors. Und der Betrag ist die Wurzel aus dem Skalarprodukt des Vektors mit sich selber. Bei rechtwinkligen Koordinaten also a = sqrt(ax^2 + ay^2 + az^2). Sind die Sensoren nicht rechtwinklig, braucht man den Kosinussatz.
Dieser Betrag ist die Beschleunigung. Das gilt für alle Winkel. Wenn man nur die Beschleunigung wissen will, braucht man den Winkel nicht extra auszurechnen.
Zwei Spezialfälle zu Prüfung: die Z-Achse steht senkrecht, ax = ay = 0, az ist die Beschleunigung, a = sqrt(0^2 + 0^2 + az^2) = az
Der Sensor liegt auf der Seite, die Y-Achse steht senkrecht, ax = az = 0, ay ist die Beschleunigung, a = sqrt(0^2 + ay^2 + 0^2) = ay
Wenn man den Winkel nicht wissen will, braucht man ihn auch nicht extra auszurechnen. Da sqrt() gern länglich wird, versucht man die Funktion zu vermeiden. Ist der Winkel (eigentlich zwei Winkel) bekannt, kann man den Betrag des Vektors auch anders rechnen. Muß man die Winkel erst berechnen, läufts auf das gleiche hinaus.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Hi,
also so ganz schlau werde ich nicht aus deinem Beitrag, ist mir wohl ein bisschen zu mathematisch ...
Wenn ich die Formel a = sqrt(ax^2+ay^2+az^2) verwende, kommt je nach Schrägstellung des Sensors (in Ruhelage) ein etwas anderer Wert heraus, wie oben geschrieben ...
Außerdem habe ich dann wieder das Problem, wenn die einzelnen Achsen versch. Offsets haben, dass dann der Wert wieder etwas daneben liegt.
Deswegen wollte ich den Dreisatz anwenden, allerdings scheitere ich daran, dass das Verhältnis von Winkel & Beschleunigung nicht linear ist.
Ich kenne die Beschleunigung der Z Achse und auch deren Winkel, daraus möchte ich die Beschleunigung bei einem Winkel von 90° errechnen.
Was meinst du mit "da sqrt() gern länglich wird"? Meinst du die Ausführungszeit? Das wäre egal, da der Wert nur einmal zum Start des Programms errechnet werden müsste.
Gruß
Chris
sqrt benötigt recht viel Rechenzeit. Die Implementierung auf Prozessoren bassiert auf einer Taylorreihe. Genauso wie die trigonometrischen Funktionen.
http://de.wikipedia.org/wiki/Taylorreihe
Geändert von schorsch_76 (22.09.2013 um 17:57 Uhr) Grund: Link
Die Physik sagt aber, der Wert muß konstant sein. Was du hier also siehst, sind die Messfehler deines Sensors.
Dein wirkliches Problem ist nicht die Formel, auch wenn sie kompliziert wäre, sondern daß du den Winkel nicht kennst. Erst wenn du deinen Sensor kalibriert hast, kannst du den Winkel berechnen. Ist dein Sensor kalibriert, brauchst du den Winkel zum kalibrieren nicht mehr.Außerdem habe ich dann wieder das Problem, wenn die einzelnen Achsen versch. Offsets haben, dass dann der Wert wieder etwas daneben liegt.
Deswegen wollte ich den Dreisatz anwenden, allerdings scheitere ich daran, dass das Verhältnis von Winkel & Beschleunigung nicht linear ist.
Zum Kalibrieren deines Sensors brauchst du (solange er linear ist) 6 Werte: 3 Offsets und 3 Faktoren. Und das gilt auch nur, wenn der Sensor Zeit- und Temperaturstabil ist. Wenn du dann auch noch zwei Sensoren vergleichen willst, sind es 12 Werte, 6 für jeden Sensor. Um das zu vereinfachen, muß man sich den Sensor genau ansehen und entscheiden, für welchen der 6 Werte man z.B. konstante, feste Werte ansetzen kann. Wie du selbst sagst, ist der Offset ein Problem. Also muß er gegen einen anderen Sensor (z.B. Wasserwaage oder Lot) kalibriert werden. Alles andere ist der Versuch, sich an den eigenen Haaren aus dem Sumpf zu ziehen.
MfG Klebwax
Strom fließt auch durch krumme Drähte !
Eventuell könnte man einen Regressionsansatz wählen. was ja konstant ist, g. Gleichungssystem aufstellen und viele Messwerte reinballern. Mit der Methode der kleinsten Quadrate dann die optimalen Offsets berechnen.
Die Frage ist, wie muss das Gleichungssystem aussehen.
Gruß Georg
Hi,
also wie man einen ACC kalibriert, darüber hab ich mir schonmal Gedanken gemacht ...
Ich brauche je Achse einen Offset-Wert und einen Bereichs-Wert, der den maximalen Ausgabewert enthält.
Der Sensor-Wert wird wird dann wie folgt berechnet:
Allerdings dachte ich bis jetzt immer, ich komme auch ohne Kalibrierung aus ... Aber anscheinend muss ich das wohl wirklich mal in Angriff nehmen, damits gescheit funktioniert.Code:if(accx<accx_min) accx_min = accx; if(accx>accx_max) accx_max = accx; accx_offset = (accx_min+accx_max)>>1; accx_range = (labs(accx_min)+labs(accx_max)); accx_corrected = (accx-accx_offset)/accx_range*32768;
Gruß
Chris
Hab mir auch grad Gedanken gemacht wie man so einen Sensor am besten mathematisch beschreibt. Kannst du ein paar Beispieldaten hier reinsetzten? Also die Werte der 3 Ausgänge in unterschiedlichen Lagen. Schätze so ca. 6-8 Werte wären hilfreich. Bitte alle bei Stillstand
Gruß
Georg
- - - Aktualisiert - - -
Das hier scheint mir exakt dies zu bewirken.
http://de.wikipedia.org/wiki/Basiswechsel_(Vektorraum)
Dazu eben die Funktion
B1: Basisvektor 1
B2: Basisvektor 2
B3: Basisvektor 3
s1: Array mit Werten aus dem Sensor 1
s2: Array mit Werten aus dem Sensor 2
s3: Array mit Werten aus dem Sensor 3
S:sum((((len(s1[i]*B1)^2 + len(s2[i]*B2)^2 + len(s3[i]*B3)^2))-g^2)^2,i,1,length(s1));
das ganze dann nach den 9 Kooeffizienten der Matrix ableiten und 0 setzen (kleinster Abstand).
Jetzt müssten nur noch genügend Daten vorhanden sein, um richtige Kalibrierwerte zu bekommen.
Gruß
Georg
Lesezeichen