Ich habe eine Reihe von CSV-Dateien mit Zeitstempelkoordinaten (X, Y und Z in mm). Was wäre der einfachste Weg, Bewegungsdaten von ihnen zu extrahieren?
Zu den Informationen, die ich extrahieren möchte, gehören die folgenden:
Idealerweise möchte ich schließlich Bewegungsmuster kategorisieren können, also Bonuspunkte für alle, die einen Weg vorschlagen können, dies zu tun. Es fällt mir auf, dass ich dies zum Beispiel tun könnte, um aus den Koordinaten Bilder / Videos der Bewegung zu erzeugen und die Menschen zu bitten, sie zu kategorisieren - Vorschläge, wie ich das tun würde, sind sehr willkommen.
Eine Komplikation ist die Tatsache, dass die Messwerte mit Geräuschen belastet sind. Um dies zu überwinden, ist jeder Aufzeichnung eine Ruhezeit von mindestens 20 Sekunden vorangestellt, die als eine Art "Rauschprofil" dienen kann. Ich bin mir nicht sicher, wie ich das umsetzen soll.
Wenn es hilft, ist die Bewegung, die aufgezeichnet wird, die einer Personenhand während einer einfachen Greifaufgabe. Die Daten werden mit einem am Handgelenk befestigten magnetischen Bewegungssensor erzeugt. Außerdem verwende ich C #, aber ich denke, die Mathematik ist sprachunabhängig.
Für die Bounty würde ich gerne einige (Pseudo-) Codebeispiele sehen.
Sehen wir, was Sie mit Ihren Beispieldaten machen können.
Haftungsausschluss: Ich habe Ihre Hardware-Spezifikationen nicht gelesen (tl; dr:))
Ich werde das in Mathematica aus Bequemlichkeit ausarbeiten. Die relevanten Algorithmen (nicht viele) werden als Links zur Verfügung gestellt.
Die erste Beobachtung ist, dass alle Ihre Messungen zeitlich gleich beabstandet sind, was am einfachsten ist, um den Ansatz und die Algorithmen zu vereinfachen. Wir werden "Zeit" oder "Ticks" (Messungen) zu unserer Bequemlichkeit darstellen, da sie gleichwertig sind.
Lassen Sie uns zuerst Ihre Position nach Achse darstellen, um zu sehen, worum es bei dem Problem geht:
%Vor%
Nun, zwei Beobachtungen:
Also werden wir Ihre Daten leicht umrechnen, indem wir eine Nullstelle subtrahieren und bei 950 beginnen.
%Vor%
Da die Kurven genug Rauschen haben, um die Berechnungen zu verkomplizieren, werden wir sie mit einem Gaussian Kernel um es zu verwerfen:
%Vor%
So können Sie unter den ursprünglichen und geglätteten Trajektorien sehen:
Jetzt sind wir bereit, Derivate für Geschwindigkeit und Beschleunigung zu nehmen. Wir werden Annäherungen vierter Ordnung für die erste und zweite Ableitung verwenden. Wir werden sie auch wie zuvor mit einem Gauß-Kernel glätten:
%Vor%Und die wir planen sie:
%Vor%
Jetzt haben wir auch den Geschwindigkeits- und Beschleunigungsmodul:
%Vor%
Und die Überschrift als Richtung der Geschwindigkeit:
%Vor%
Ich denke, das ist genug, um Sie zu beginnen. lassen Sie es mich wissen, wenn Sie Hilfe bei der Berechnung eines bestimmten Parameters benötigen.
HTH!
Bearbeiten
Nehmen wir als Beispiel an, Sie möchten die mittlere Geschwindigkeit berechnen, wenn die Hand nicht in Ruhe ist. Also wählen wir alle Punkte aus, deren Geschwindigkeit mehr als ein Cutoff ist, zum Beispiel 5, und berechnen den Mittelwert:
%Vor%Die Einheiten für diese Größenordnung hängen von Ihren Zeiteinheiten ab, aber ich sehe sie nirgends angegeben.
Bitte beachten Sie, dass die Abschaltgeschwindigkeit nicht "intuitiv" ist. Sie können einen geeigneten Wert suchen, indem Sie die mittlere Geschwindigkeit gegen die Cutoff-Geschwindigkeit aufzeichnen:
%Vor%
Sie sehen also, dass 5 ein geeigneter Wert ist.
Die Lösung könnte so einfach sein wie eine Zustandsmaschine, wobei jeder Zustand eine Richtung darstellt. Bewegungsfolgen werden durch Abfolgen von Richtungen dargestellt. Dieser Ansatz würde nur funktionieren, wenn sich die Ausrichtung des Sensors nicht in Bezug auf die Bewegungen ändert. Andernfalls benötigen Sie eine Methode, um die Bewegungen in die richtige Ausrichtung zu übersetzen, bevor Sie Reihenfolgen berechnen.
Auf der anderen Seite könntest du verschiedene KI-Techniken verwenden, obwohl genau das, was du verwenden würdest, über mich hinausgeht.
Um die Geschwindigkeit zwischen zwei beliebigen Koordinaten zu erhalten:
%Vor%Um die durchschnittliche Geschwindigkeit für die gesamte Bewegung zu erhalten, sagen Sie, dass Sie 100 Koordinaten mit Zeitstempel haben, verwenden Sie die obige Gleichung, um 99 Geschwindigkeitswerte zu berechnen. Dann summiere alle Geschwindigkeiten und dividiere durch die Anzahl der Geschwindigkeiten (99)
Um die Beschleunigung zu erhalten, ist die Position in drei Momenten oder die Geschwindigkeit in zwei Momenten erforderlich.
%Vor%Hinweis: Dies alles geht von Berechnungen pro Achse aus: Ich habe keine Erfahrung mit der zweiachsigen Teilchenbewegung.
Das wird Ihnen viel leichter fallen, wenn Sie zuerst Ihre Positionsmessungen in Geschwindigkeitsmessungen umwandeln.
Erster Schritt: Entfernen Sie das Rauschen. Wie Sie bereits sagten, ist jeder Aufnahme eine Stille von 20 Sekunden vorangestellt. Suchen Sie daher nach 20-Sekunden-Intervallen, in denen sich die Position nicht ändert. Dann nehmen Sie die Messung direkt nach.
Zweiter Schritt: Berechnen Sie die Geschwindigkeiten mit: (x2 - x1) / (t2 - t1); die Steigung Formel. Das Intervall sollte dem Intervall der Aufzeichnungen entsprechen.
Berechnungen:
Richtungsänderung:
Eine Richtungsänderung tritt auf, wenn die Beschleunigung Null ist. Verwenden Sie numerische Integration, um diese Zeiten zu finden. Integriere von 0 bis zu einem Zeitpunkt, an dem das Ergebnis der Integration Null ist. Nimm diese Zeit auf. Dann integrieren Sie von der vorherigen Zeit, bis Sie wieder Null erhalten. Wiederholen Sie dies, bis Sie das Ende der Daten erreicht haben.
Anfängliche Beschleunigungen:
Diese werden wieder unter Verwendung der Steigungsformel gefunden, wobei v
für x
ersetzt wird.
Durchschnittsgeschwindigkeit:
Die Durchschnittsgeschwindigkeitsformel ist die Steigungsformel. x1 und t1 sollten dem ersten Messwert entsprechen, und x2 und t2 sollten dem endgültigen Messwert entsprechen.
Tags und Links language-agnostic c# coordinates categorization motion