2008-10-13 13 views
19

Moim celem jest rozpoznanie prostych gestów z akcelerometrów zamontowanych na plamce słonecznej. Gest może być tak prosty, jak obracanie urządzenia lub poruszanie urządzeniem w kilku różnych ruchach. Urządzenie ma obecnie tylko przyspieszeniomierze, ale rozważamy dodanie żyroskopów, jeśli byłoby to łatwiejsze/dokładniejsze.Jak wykonać rozpoznawanie gestów za pomocą akcelerometrów

Czy ktoś ma zalecenia, jak to zrobić? Wszelkie dostępne biblioteki w Javie? Przykładowe projekty, które polecasz, sprawdzam? Dokumenty, które polecasz?

Spot słoneczny to platforma Java, która pomaga tworzyć szybkie prototypy systemów. Jest programowany przy użyciu Javy i może przekazywać polecenia z powrotem do stacji bazowej podłączonej do komputera. Jeśli muszę wyjaśnić, jak działa sprzęt, zostaw komentarz.

Odpowiedz

21

Akcelerometry będą rejestrować stałe przyspieszenie z powodu siły grawitacji, a także każde przyspieszenie, na które urządzenie jest narażone przez użytkownika, plus szum.

Będziesz musiał filtrować dolnoprzepustowo próbki, aby pozbyć się jak największego nieistotnego hałasu. Najgorszy z szumów będzie generalnie wyższy niż jakiekolwiek przyspieszenie wywołane przez człowieka.

Zdaj sobie sprawę z tego, że gdy urządzenie nie jest przyspieszane przez użytkownika, jedyną siłą jest grawitacja, a zatem możesz w przestrzeni przebyć deduce its attitude. Co więcej, gdy całkowite przyspieszenie zmienia się znacznie od 1g, musi to być spowodowane przyspieszaniem przez użytkownika urządzenia; przez odjęcie ostatniego znanego szacunku grawitacji można z grubsza oszacować, w którym kierunku i przez ile użytkownik przyspiesza urządzenie, a więc uzyskać dane, które można zacząć dopasowywać do listy znanych gestów.

Dzięki pojedynczemu przyspieszeniomierzowi trójosiowemu można wykryć bieżące pochylenie i przechylenie, a także przyspieszenie urządzenia w linii prostej. Zintegrowanie przyspieszenia minus grawitacja da ci oszacowanie aktualnej prędkości, ale oszacowanie szybko odejdzie od rzeczywistości z powodu hałasu; będziesz musiał przyjąć założenia dotyczące zachowania użytkownika przed/pomiędzy/podczas gestów i poprowadzić ich przez interfejs użytkownika, aby zapewnić punkty, w których urządzenie nie jest przyspieszane, i możesz zresetować swoje oszacowania i wiarygodnie oszacować kierunek grawitacji. Ponowna integracja w celu odnalezienia pozycji prawdopodobnie nie zapewni uzytecznych wyników przez jakikolwiek przydatny okres czasu.

Jeśli masz dwa przyspieszeniomierze trójosiowe w pewnej odległości od siebie lub jeden i kilka żyroskopów, możesz również wykryć obrót urządzenia (poprzez porównanie wektorów przyspieszenia lub bezpośrednio z żyroskopem); całkowanie momentu pędu w ciągu kilku sekund da ci oszacowanie aktualnego odchylenia w stosunku do tego, kiedy zaczniesz integrować, ale znowu to będzie dryfować naprawdę szybko.

+0

Dzięki temu było to bardzo pomocne. – smaclell

+0

Czy rzeczywiście rejestrują one stałe przyspieszenie spowodowane grawitacją? Mam na myśli logicznie, że powinni, ale wydaje się to po prostu sprzeczne z intuicją :-) –

+2

Tak, robią. Pomyśl o nich jak o masach na sprężynach, przy czym "przyspieszenie" jest zgłaszane w rzeczywistości w zakresie rozciągania/ściskania; to jest dość intuicyjne. – moonshadow

1

Dodawanie do punktu Moonshadow za o konieczności zresetowania bazową dla grawitacji i rotacji ...

ile nie oczekuje się, że urządzenie ma posiadać stałe chwile odpoczynku (gdzie jedyną siłą działającą na nim jest grawitacja), aby przywrócić jej pomiar bazowy, twój system rozwinie się w końcu w równowagę zawrotów głowy.

+0

Z powodu dryfu czujnika? lub po prostu wstrzymać stare wartości? – smaclell

+0

Zasadniczo chcesz, aby system wyłączył dryft czujnika w zależności od temperatury i czasu. Ale to wykończenie nie może się zdarzyć, jeśli nie masz spokojnego czasu. – Toybuilder

5

To, co nie zostało jeszcze wspomniane, to faktyczne rozpoznawanie gestów. To jest trudna część. Po wyczyszczeniu danych (dolnoprzepustowy filtrowany, znormalizowany itp.) Nadal masz do wykonania większość pracy.

Zobacz modele ukrytych modeli Markova. To wydaje się być najbardziej popularnym podejściem, ale ich używanie nie jest trywialne. Zazwyczaj jest to etap wstępnego przetwarzania. Najpierw wykonujemy STFT i grupujemy uzyskany wektor do słownika, a następnie wprowadzamy go do HMM. Zobacz jahmm w kodzie google dla biblioteki java.

+5

Dziękuję za wzięcie noża. Projekt był dla szkoły i szedł całkiem nieźle. Do faktycznego rozpoznawania gestów używaliśmy wariantu 1 USD Recognizer, który nie dbał o rotację i miał dodatkowy wymiar. Jest to metoda oparta na szablonach, która w rzeczywistości nie przeprowadza żadnego prawdziwego szkolenia z danych. Aby to uprościć, nie wykonaliśmy żadnej segmentacji gestów i zamiast tego używaliśmy "przełącznika", aby wskazać, kiedy gest się zaczął/zatrzymał. Nasza metoda miała bardzo dobrą dokładność/wydajność, biorąc pod uwagę, że około 5 szablonów na gesty miało ponad 90% dokładność w terenie z czasem obliczeń wynoszącym milisekundy. – smaclell

+0

@smaclell brzmi naprawdę interesująco. Czy otworzyłeś kod źródłowy? Czy znasz jakieś zasoby dotyczące zastosowania apletu 1 $ do przyspieszeniomierzy 3-osiowych? – Fgblanch

+0

Ponieważ był to projekt szkolny, nie otworzyliśmy źródła. Kiedy nad nim pracowaliśmy, nie było dostępnych dobrych zasobów. Nasze zmiany zostały opisane w powyższym komentarzu, ale jeśli masz problemy, mogę wysłać Ci wiadomość. – smaclell

7

Ponieważ nikt nie wspomnieli istniejących bibliotek, zgodnie z wnioskiem PO, tu idzie:

http://www.wiigee.org/

przeznaczona do użytku z Wiimote, wiigee oparta jest implementacja open-source Java dla pasujące do wzorca na podstawie odczytów z akcelerometru. Osiąga to za pomocą modeli ukrytych Markowa [1].

Został on podobno z dobrym skutkiem stosowane przez spółkę, Thorn Technologies, a oni wymienić swoje doświadczenia tutaj: http://www.thorntech.com/2013/07/mobile-device-3d-accelerometer-based-gesture-recognition/

Alternatywnie można rozważyć FastDTW (https://code.google.com/p/fastdtw/). Jest mniej dokładny niż zwykły DTW [2], ale także jest mniej kosztowny pod względem obliczeniowym, co ma duże znaczenie, jeśli chodzi o systemy wbudowane lub urządzenia mobilne.

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

EDIT: OP wspomniał w jednym z komentarzy, że ukończył swój projekt, z dokładnością% 90 w polu i sub-milisekundy obliczeniowej czasie , przy użyciu wariantu $1 Recognizer. Wspomina również, że rotacja nie była kryterium w jego projekcie.

Powiązane problemy