Nun ja, der erste Sensor hat mir die Rohdaten der drei Achsen geliefert. xAcc_raw, yAcc_raw und zAcc_raw. Damit konnte ich die nötigen Winkel berechnen.
Der Sensor, den ich jetzt teste, liefert mit einen Winkel, der quasi die Drehung um die Z-Achse bestimmt (Azimuth) und einen Winkel, der den Winkel zur Z-Achse bestimmt (Zenith)
In dieser Wikipediagrafik entsprechend:
Azimuth (Sensor) = Azimuth (Grafik)
Zanith (Sensor) = Meridian (Grafik) = 90° - Höhe
http://upload.wikimedia.org/wikipedi.../9c/HorSys.svg
Somit kann die Lage eindeutig bestimmt werden, jedoch im dreidimensionalen Raum.
Für meine Messung benötige ich jedoch nur die Neigung um eine Achse. Sagen wir den Winkel (Grafik) zwischen Z- und X-Achse.
Um nun eine Kalibrierung vorzunehmen, richte ich den Sensor an bestimmten Messpunkten aus und errechne mir eine virtuelle Ebene, die quasi die 0°-Stellung des Sensors darstellt (man kann so einen Sensor nie 100% in einem Gehäuse ausrichten...daher ist die Kalibrierung nötig).
Mit dem alten Sensor habe ich nun den Winkel um die unwichtigere Achse ausgewertet und anhand dieser Winkelbestimmung die Relevante Achse mit meiner virtuellen Ebene verrechnet, um eine kalibrierte Neigung zu bekommen.
Das funktioniert aber nur, wenn ich die Sensorwerte für alle drei Achsen habe.
Nun überlege ich, wie ich aus dem Azimuth- und dem Zenith-Winkel des neuen Sensors pseudo-Rohdaten berechnen kann, damit ich diese mit meiner bereits existierenden Kalibrierung nutzen kann.
Sollte das nicht funktionieren, muss ich versuchen die beiden ausgegebenen Winkel auf eine Ebene zu projezieren.
Da ich den Winkel X-Z haben möchte:
Stell dir vor, du schaust entlang der Y-Achse und siehst die Z-Achse senkrecht vor die. Der ausgegebene Vektor stellt nun den gesuchten Winkel auf der X-Z-Ebene dar.
Ich weiß nur noch nicht, wie ich das projezieren kann und wie ich meine Kalibrierung dahin portieren kann.
Am einfachsten wäre es, wenn ich die Rohdaten des Sensors auslesen könnte.
Die Grundlage zur Auswertung des Sensors ist der beispielcode von Toradex:
http://files.toradex.com/Oak/Linux/O...x_0081.tar.bz2
im Unterordner src gibts die oaklinux.cpp, welche den Sensor erkennt und die Deviceinfos sowie die Daten ausliest.
Aber hier steig ich noch nicht so ganz durch. Ich muss gestehen, dass ich jetzt etliche Stunden gebraucht habe, den Code überhaupt so zu kompilieren, dass ich Sensorinfos bekommen habe.
Die Ausgabe des Beispielcodes sieht dann wie folgt aus:
Code:
Device Name: Toradex Inclinometer
Volatile User Device Name: oaktilt
Persistent User Device Name: oaktilt
Serial Number: 08490303
VendorID: 0x1b67 :: ProductID: 0x4 :: Version 0x104
Number of channels: 4
Report mode: 0
Led Mode: 0
Report rate: 2000
Sample rate: 2000
Channel 0:
Name: Frame Number [s]
Persistent user channel name: oaktilt
Volatile user channel name: oaktilt
Data type: 16 bits (unsigned)
Unit exponent: -3
Unit s (USB code 0x1001)
Channel 1:
Name: Acceleration [m/s2]
Persistent user channel name: Frame Number
Volatile user channel name: Frame Number
Data type: 16 bits (unsigned)
Unit exponent: -3
Unit m/s2 (USB code 0xe011)
Channel 2:
Name: Zenith [rad]
Persistent user channel name: Acceleration
Volatile user channel name: Acceleration
Data type: 16 bits (unsigned)
Unit exponent: -4
Unit rad (USB code 0x12)
Channel 3:
Name: Azimuth [rad]
Persistent user channel name: Angle from Z axis
Volatile user channel name: Angle from Z axis
Data type: 16 bits (unsigned)
Unit exponent: -4
Unit rad (USB code 0x12)
Frame Number [s]: 2003x10e-3
Acceleration [m/s2]: 9717x10e-3
Zenith [rad]: 37x10e-4
Azimuth [rad]: 31416x10e-4
Frame Number [s]: 1954x10e-3
Acceleration [m/s2]: 9768x10e-3
Zenith [rad]: 117x10e-4
Azimuth [rad]: 32660x10e-4
Frame Number [s]: 1907x10e-3
Acceleration [m/s2]: 9717x10e-3
Zenith [rad]: 30x10e-4
Azimuth [rad]: 25535x10e-4
Im Endeffekt geht es um die Messwerte, die in den letzten 3 Codeblocks ausgegeben werden:
Code:
Zenith [rad]: 30x10e-4
Azimuth [rad]: 25535x10e-4
Diese möchte ich umrechnen, um die Drehung um die Y-(oder X-)Achse zu bestimmen.
Lesezeichen