Du musst den Pythagoras auf die 3 Werte anwenden.
Wert bei 1g = sqrt(x^2+y^2+z^2)
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 12: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 16: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
Lesezeichen