Daten aus einem Beschleunigungssensor darstellen?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Hallo zusammen,

ich suche nach einer Möglichkeit, in Python die Daten von einem Beschleunigungssensor zu visualisieren... Die Daten liegen als Quaternionen und Beschleunigung in einem .csv File vor:

PacketCounter SampleTimeFine Quat_W Quat_X Quat_Y Quat_Z Gyr_X Gyr_Y Gyr_Z
1 1193045878 0.122512 0.007565 0.00524 -0.992425 0.000007 -0.000004 0.000008
2 1193062545 0.121574 0.007709 0.005255 -0.992539 0.380022 -0.480955 0.42948
3 1193079212 0.121075 0.00776 0.005306 -0.992599 0.356407 -0.550647 0.358392
4 1193095879 0.121059 0.007882 0.005335 -0.9926 0.35286 -0.511755 0.423858

und ich würde sie gerne irgendwie grafisch dargestellt haben (als Plot z.B). Ist sowas möglich?

Freundliche Grüsse,
PeterP
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Klar. In 2D mache ich das mit Bokeh. In 3D mit pyqtchart oder so etwas ähnlichem. Da stelle ich ein „Gizmo“ dar.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Hallo _deets_.

danke für die schnelle und kompetente Antwort. Als Python Neuling bin ich damit leider noch etwas überfordert :). Könntest Du das vielleicht etwas genauer ausführen? Ich versuche, mir in Zwischenzeit möglichst viel anzulesen.

Danke und Gruss,
PeterP
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich fände es sehr hilfreich, wenn du mal etwas weiter ausholst, was genau du vor hast. Denn einfach mal so auf Verdacht zwei verfahren detailliert darzulegen ist ein bisschen viel des guteN.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe das gestern auf die schnelle mit dem iPhone nicht gefunden - hier ist mein Code fuer die Darstellung eines Datenstroms von Quaternionen: https://github.com/deets/new-joy-tracker/tree/master/qi
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Hallo _deets_

Ich versuche im Endeffekt folgendes:

Ich habe einen Xsens Dot Sensor, den ich an einem Schläger (ein ähnliches Gerät wie beim Baseball) fixiert habe. Damit zeichne ich meine Schwünge auf. Mit den aus dem Sensor exportierten Daten würde ich gerne den Weg des Schlägers und die jeweilige Beschleunigung darstellen, um meine Präzision und die Abschlagsweite zu erhöhen. Cool wäre eine Visualisierung in Art einer parametrischen Kurve (das war ein Beispiel im matlibplot Tutorial) bei der die Farbe des Kurvenabschnitts dann die aktuelle Beschleunigung (z.B. rot hoch / blau niedrig) anzeigt. Aber jede andere Form der grafischen Visualisierung wäre auch schon hilfreich. Bis zum Human Modell in 3D braucht’s ja nicht gerade zu gehen...

Ich hoffe, ich habe dich jetzt weder verwirrt noch vergrault :-).

Gruss,
PeterP
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn der Sensor nur ein quaternion liefert, dann geht das nicht. Denn in dem steckt keine Beschleunigungsinformation. Nur eine Orientierung. Deren Webseite ist recht voll mit Marketing. Darum kann ich das nicht abschließend beurteilen. Sie reden ja von motion capturing. Aber so wie es du das bisher sehe, kann das Ding nicht, was du willst.

Wenn es das wider Erwarten doch kann, dann findest du hier Beispiele wie man das darstellen kann: https://matplotlib.org/mpl_toolkits/mpl ... tter-plots
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Die Beschleunigungsdaten für das jeweilige Quaternion kommen ja parallel vom Gyro. Das sind die Gyr_X, Gyr_Y und Gyr_Z Daten aus der csv Tabelle aus dem ersten Post.
Und es stimmt leider, das deren Website nicht sonderlich hilfreich ist für dieses Thema.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sind keine Beschleunigungsdaten, sondern Drehraten. Die Beschleunigungsdensoren (Acc XYZ) wird bei sowas eigentlich auch nur genutzt, um die driftenden Sensor Gyros mit Sensor Fusion an die Leine zu nehmen. Soviel geht aus deren Seite auch vor.

Ich sehe nicht, wie man deinen Wunsch damit umsetzen kann. Du kannst schrittweise einen konstanten Vektor rotieren und addieren. Und das gibt dann irgendeine Bahn. Aber am Ende ist das wie bei der WII: man musste nicht die richtige Bewegung machen, es reichte eine Rotation aus dem Gelenk. Ob das also den gewünschten Nutzen hat - kA.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Ah ok, crap (!) :)

Ich dachte das sind Beschleunigungsdaten, weil der Sensor ja auch Winkelgeschwindigkeit und freie Beschleunigung messen kann. Das habe ich wohl falsch interpretiert. Dann werde ich mir, ein anderes Setup suchen müssen, wenn ich das richtig verstehe?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe nur Erfahrung mit Lagebestimmung, nicht mit Nutzung der Beschleunigungsdaten zur Positionsbestimmung. Ich weiß, dass die üblicherweise sehr verrauscht sind. Darum eignen die sich erstmal nicht so gut. Vor allem aber bekommst du sie ja gar nicht. Oder lässt sich da noch was drehen?

Und dann ist da natürlich noch die Frage nach der Abtastrate. Ein Baseballschläger ist etwa 130 km/h schnell. Also etwa 60cm pro 16ms, was wohl die Abtastrate deines Sensors ist. Ich denke mal nicht, dass das eine sinnvolle Auflösung für dein Problem darstellt. Ich vermute mal du brauchst mindestens das 10-fache.

Eine billige MPU6050 kann die ACC mit maximal 1KHz auslesen. Vielleicht kannst du damit was basteln - https://www.google.de/search?q=mpu6050+ ... =819&dpr=2

Aber ich glaube, das sowas nur mit externen Hochgeschwindigkeitskameras wirklich akkurat genug geht.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Beim reinen Recording ist die Abtastrate eben 120Hz, bzw. 800 Hz wenn man sie direkt aus dem Sensor zieht. Daher suche ich auch nach einer Darstellungsmöglichkeit der recorded/logged Daten. Die 30cm von 120Hz würden mir wohl langen, weil mein Abschlaggerät ist knapp 3m lang. Durch den Umfang von knapp 20m ergeben sich dann hoffentlich genug Datenpunkte zur Auswertung des Abschlags. Neben Quaternions kann ich auch Eulerwinkel oder z.B. freie Beschleunigung (kompensiert um die Erdanziehung) loggen lassen. Für Quaternionen und ACC sähe das dann so aus (sry, kommt vom iPhone):

sep=
DeviceTag: Xsens DOT
FirmwareVersion: 1.6.0
AppVersion: 2020.4.1
SyncStatus: Un-synced
OutputRate: 60Hz
FilterProfile: Dynamic
Measurement Mode: Sensor fusion Mode - Extended(Quaternion)
StartTime: 2021-01-17_21:13:20_756 GMT+1
© Xsens Technologies B. V. 2005-2020
PacketCounter SampleTimeFine Quat_W Quat_X Quat_Y Quat_Z FreeAcc_X FreeAcc_Y FreeAcc_Z Status
1 683939112 0.615815 -0.000931 0.002483 -0.787888 -0.001394 0.006103 -0.071470 0
2 683955779 0.615845 -0.000860 0.002535 -0.787864 -0.002669 0.002893 -0.075724 0
3 683972446 0.615954 -0.000822 0.002561 -0.787779 0.005263 0.001928 -0.083133 0
4 683989113 0.615993 -0.000757 0.002546 -0.787749 -0.003528 0.003630 -0.087347 0
5 684005780 0.615970 -0.000714 0.002536 -0.787766 0.000861 -0.017395 -0.080033 0
6 684022447 0.615879 -0.000695 0.002483 -0.787838 -0.011306 0.007262 -0.090596 0
7 684039114 0.615875 -0.000687 0.002479 -0.787840 -0.008618 0.007418 -0.113487 0
8 684055781 0.615931 -0.000674 0.002475 -0.787797 -0.011271 -0.009891 -0.087337 0
9 684072448 0.615956 -0.000665 0.002467 -0.787778 -0.000355 0.001069 -0.072335 0
10 684089115 0.615944 -0.000646 0.002459 -0.787787 0.001662 0.006713 -0.085258 0

Könnte man damit was anfangen oder ist das immer noch dasselbe Problem? MPU6050 kann ich mir anschauen, damit wäre sowas dann deiner Meinung nach möglich? Die Daten müssten halt wireless (Kabel sind im dem Setup nicht möglich) kommen, das Sensorsystem wäre also um die Funktion zu erweitern.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das sind ja die Beschleunigungsdaten. Das ist dann ja die gewünschte Information. Die musst du jetzt zweimal integrieren, um die Position zu bekommen. Was im diskreten einfach bedeutet, zweimal die Summe zu bilden.

Und dir das dann mal anschauen, ob zb wiederholte Schläge mit dem Versuch, konsistent zu sein (das kann ja auch eine Ersatzbewegung sein, und muss dem eigentlichen Ablauf entsprechen), auch danach aussehen.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Dann war ich mit den Quaterionen auf dem falschen Dampfer und ich brauche nur die ACC-Daten für x,y,z zu integrieren und zu plotten? :roll:
Na toll und ich hab’s unglaublich verkompliziert...
Danke _deets_
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nö, du brauchst schon beides. Die Beschleunigung misst der ja immer in Richtung der 3 Achsen. Aber die sind ortsfest am Schläger. Wenn du den horizontal schwingst oder erst um 90 Grad drehst und dann hoch schwingst, messen die ACC das gleiche.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Hmmmm... das ist wieder einer der Momente in denen du dir wünscht, du hättest damals dem Prof geglaubt als es sagte:" Das werdet ihr mal noch brauchen". Verstehe ich das richtig, das Quaternion gibt die Lage des Sensors am Schläger wieder (in w,x,y,z), ACC zeigt die Beschleunigung in x,y,z-Richtung zum Zeitpunkt der Messung. Beschleunigung 2x integrieren ergibt die Strecke/Vektor, die in der entsprechenden Achse zurückgelegt wurde/wird. Dann müsste ich jeweils das Quaternion mit der Strecke/dem Vektor multiplizieren und das ergibt die neue Position, die dann z.B. mit pyqtchart zu plotten wäre?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ehhhh. Vielleicht. Das ist jetzt zu unklar formuliert. Kann also sein. Kann auch nicht.

Das quaternion sollte in Weltkoordinaten sein, Modulo natürlich des unbekannten Startzustandes. Die Beschleunigung bildet ja letztlich auch einen Vektor - die Richtung, in die der Gegenstand sich bewegt hat. Multipliziert mit dem Zeit-Delta d (1/60s oder was der für eine Rate hat) ergibt das die Änderung der Geschwindigkeit. Und die rotierst du mit dem Q und addierst das Ergebnis auf den letzten Geschwindigkeitsvektor. Und den dann wieder auf den letzten Positionsvektor. Wobei auch da wieder wahrscheinlich mit d multipliziert werden muss.

Bei dir klingt es so, als ob die Multiplikation mit Q zu spät kommt.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Hmmm ja, klingt so als würde bei mir ein Teil fehlen, z.B der mit der alten Position, was natürlich Sinn macht. Wie würdest du es denn rechnen bzw. welche Formel anwenden? Dann kann ich das vielleicht eher nachvollziehen...
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe das eigentlich schon recht detailliert dargestellt. Programmieren musst du das schon selbst. Es gibt auch Projekte da draußen, die sowas vormachen. Vielleicht in arduino C, aber das lässt sich ja adaptieren.
PeterPython
User
Beiträge: 10
Registriert: Freitag 15. Januar 2021, 21:26

Programmieren bzw. adaptieren will ich es schon selber, das ist ja der spassige Teil. Dann schaue ich mal, wie ich das hinbekomme.
Nochmals vielen Dank für deine Hilfe!
Antworten