2008-10-13 10 views
19

Mein Ziel ist es, einfache Gesten von Beschleunigungsmessern auf einem Sonnenfleck erkennen zu erkennen. Eine Geste könnte so einfach sein wie das Drehen des Geräts oder das Bewegen des Geräts in verschiedenen Bewegungen. Das Gerät hat derzeit nur Beschleunigungssensoren, aber wir überlegen, Gyroskope hinzuzufügen, wenn es einfacher/genauer wäre.Wie Gestenerkennung mit Beschleunigungsmesser

Hat jemand Empfehlungen, wie man das macht? Alle verfügbaren Bibliotheken in Java? Beispielprojekte, die Sie empfehlen, schaue ich mir an? Papiere, die Sie empfehlen?

Der Sun Spot ist eine Java-Plattform, mit der Sie schnelle Prototypen von Systemen erstellen können. Es wird mit Java programmiert und kann Befehle an eine Basisstation zurücksenden, die an einen Computer angeschlossen ist. Wenn ich erklären muss, wie die Hardware funktioniert, hinterlasse einen Kommentar.

Antwort

21

Die Beschleunigungssensoren registrieren eine konstante Beschleunigung aufgrund der Schwerkraft sowie jede Beschleunigung, der das Gerät vom Benutzer ausgesetzt ist, plus Lärm.

Sie müssen Tiefpassfilter die Proben, um so viel irrelevante Geräusche wie möglich loszuwerden. Das Schlimmste des Geräusches ist im Allgemeinen eine höhere Frequenz als jede mögliche vom Menschen verursachte Beschleunigung.

Wenn das Gerät nicht vom Benutzer beschleunigt wird, ist die einzige Kraft aufgrund der Schwerkraft, und daher können Sie deduce its attitude im Raum. Wenn die Gesamtbeschleunigung stark von 1 g abweicht, muss dies darauf zurückzuführen sein, dass der Benutzer das Gerät beschleunigt. Durch Subtrahieren der letzten bekannten Schätzung der Schwerkraft können Sie grob abschätzen, in welche Richtung und um wieviel der Benutzer das Gerät beschleunigt, und so Daten erhalten, die Sie mit einer Liste bekannter Gesten vergleichen können.

Mit einem einzigen dreiachsigen Beschleunigungsmesser können Sie die aktuelle Neigung und den aktuellen Wert sowie die Beschleunigung des Geräts in einer geraden Linie erkennen. Die Integration von Beschleunigung minus Schwerkraft gibt Ihnen eine Schätzung der aktuellen Geschwindigkeit, aber die Schätzung wird aufgrund von Rauschen schnell von der Realität abweichen. Sie müssen Annahmen über das Verhalten des Benutzers vor/zwischen/während Gesten treffen und sie durch Ihre Benutzeroberfläche führen, um Punkte bereitzustellen, an denen das Gerät nicht beschleunigt wird, und Sie können Ihre Schätzungen zurücksetzen und die Richtung der Schwerkraft zuverlässig abschätzen. Die erneute Integration in die Position findet wahrscheinlich keine brauchbaren Ergebnisse über einen nützlichen Zeitraum.

Wenn zwei Drei-Achsen-Beschleunigungsmesser in einem Abstand voneinander, oder ein und einige Gyros, können Sie auch eine Drehung der Vorrichtung detektieren (durch die Beschleunigungsvektoren zu vergleichen oder von den Kreiseln direkt); Wenn Sie den Drehimpuls über einige Sekunden integrieren, erhalten Sie eine Schätzung des aktuellen Gierwinkels relativ zu dem Zeitpunkt, als Sie mit der Integration begonnen haben, aber auch dies wird schnell aus dem Gleichgewicht geraten.

+0

Vielen Dank das war wirklich hilfreich. – smaclell

+0

Haben sie wirklich eine konstante Erdbeschleunigung? Ich meine logisch sie sollten, aber es scheint nur kontraintuitiv :-) –

+2

Ja, das tun sie. Stellen Sie sich diese als Massen auf Federn vor, wobei die "Beschleunigung" tatsächlich die Menge der Dehnung/Kompression ist; dann ist es ziemlich intuitiv. – moonshadow

1

zu Moonshadow Punkt Hinzufügen darüber, dass Ihre Basis für die Schwerkraft und Rotation zurückgesetzt ...

Es sei denn, das Gerät stabil Momente der Ruhe haben, ist zu erwarten (wo die einzige Kraft, die auf sie einwirkenden Schwerkraft ist) sein zurücksetzen Messbasis, entwickelt Ihr System schließlich ein Äquivalent von Schwindel.

+0

Wegen Sensordrift? oder einfach alte Werte abwürgen? – smaclell

+0

Grundsätzlich möchten Sie, dass das System die Sensordrift über Temperatur und Zeit ausgleicht. Aber das kann nicht passieren, wenn Sie keine ruhige Zeit haben. – Toybuilder

5

Was noch nicht erwähnt wurde, ist die eigentliche Gestenerkennung. Das ist der schwierige Teil. Nachdem Sie Ihre Daten bereinigt haben (Tiefpass gefiltert, normalisiert usw.), haben Sie immer noch die meiste Arbeit zu erledigen.

Werfen Sie einen Blick auf versteckte Markov-Modelle. Dies scheint der beliebteste Ansatz zu sein, aber ihre Verwendung ist nicht trivial. Es gibt normalerweise einen Vorverarbeitungsschritt. Zuerst mache ich STFT und gruppiere den resultierenden Vektor in ein Wörterbuch, füge das dann in ein HMM ein. Werfen Sie einen Blick auf jahmm in Google Code für eine Java-Bibliothek.

+5

Danke für einen Stich. Das Projekt war für die Schule und ging ziemlich gut. Für die tatsächliche Gestenerkennung verwendeten wir eine Variante des $ 1 Recognizer, die sich nicht um die Rotation kümmerte und eine zusätzliche Dimension hatte. Es ist eine vorlagenbasierte Methode, die überhaupt kein echtes Training der Daten durchführt. Um es zu vereinfachen, haben wir keine Segmentierung von Gesten durchgeführt und stattdessen einen "Schalter" verwendet, um anzuzeigen, wann eine Geste gestartet/gestoppt wurde. Unsere Methode hatte eine sehr gute Genauigkeit/Leistung gegeben etwa 5 Vorlagen pro Geste hatte über 90% Genauigkeit in dem Bereich mit einer Sub-Millisekunde Rechenzeit. – smaclell

+0

@smacell klingt es wirklich interessant. Haben Sie den Code geöffnet? Kennen Sie irgendwelche Ressourcen darüber, wie Sie den 1 $ -Recognizer auf 3-Achsen-Beschleunigungssensoren anwenden? – Fgblanch

+0

Da es für ein Schulprojekt war, haben wir die Quelle nicht geöffnet. Als wir daran arbeiteten, standen uns keine guten Ressourcen zur Verfügung. Unsere Änderungen sind in meinem Kommentar oben beschrieben, aber wenn Sie Probleme haben, kann ich Ihnen eine Nachricht senden. – smaclell

7

Da niemand vorhandene Bibliotheken erwähnt zu haben scheint, wie OP angefordert, geht hier:

http://www.wiigee.org/

Gedacht für den Einsatz mit der Wiimote, wiigee ist eine Open-Source-Java-basierte Implementierung für den Mustervergleich basierend auf Beschleunigungsmesserablesungen. Erreicht wird dies unter Verwendung von Hidden Markov Models [1].

Es wurde offenbar mit großer Wirkung von einem Unternehmen, Thorn Technologies, verwendet und sie haben ihre Erfahrungen hier erwähnt: http://www.thorntech.com/2013/07/mobile-device-3d-accelerometer-based-gesture-recognition/

Alternativ Sie FastDTW (https://code.google.com/p/fastdtw/) in Erwägung ziehen könnte. Es ist weniger genau als normal, aber auch rechenintensiver, was bei Embedded-Systemen oder mobilen Geräten eine große Rolle spielt.

[1] https://en.wikipedia.org/wiki/Hidden_Markov_model
[2] https://en.wikipedia.org/wiki/Dynamic_time_warping

EDIT: Die OP wird in einen der Kommentare erwähnt, dass er sein Projekt mit 90% Genauigkeit im Bereich abgeschlossen ist, und eine Sub-Millisekunden-Rechenzeit unter Verwendung einer Variante von $1 Recognizer. Er erwähnt auch, dass Rotation kein Kriterium in seinem Projekt sei.