Implementacja sterowania za pomocą gestów: projekt referencyjny z użyciem optycznego czujnika odległości
Jest wiele zalet używania sterowania za pomocą gestów w miejsce pojemnościowych interfejsów dotykowych czy tradycyjnych rozwiązań, takich jak przyciski i pokrętła. Po pierwsze, oparte na podczerwieni interfejsy wykorzystujące gesty sprawdzają się, gdy operator nosi rękawice, a panele dotykowe nie działają w takich warunkach. Poza tym obie techniki czujnikowe działają w dwóch wymiarach, ale sterowanie gestami dodaje trzeci wymiar – użytkownicy mogą wydawać polecenia zbliżając i oddalając rękę od detektora.
W zastosowaniach, w których istnieje ryzyko naruszenia wymogów bezpieczeństwa, np. gdy użytkownik musi znaleźć odpowiednie pokrętło czy nacisnąć przycisk, sterowanie gestami pozwala kontrolować urządzenie w szerokim polu, gdzie zgrubne gesty mogą zastąpić precyzyjne ruchy, dając prosty i intuicyjny interfejs.
Pojawia się jednak pytanie o to, jak implementować sterowanie za pomocą gestów? Niniejszy tekst omawia projekt referencyjny, opracowany przez firmę Vishay, który może stanowić wzór dla realizacji szerokiej gamy systemów tego typu.
Rys. 1. System sterowania gestami firmy Vishay składa się z dwóch diod podczerwonych LED i pojedynczego czujnika odległości
Podstawą płytki Gesture Control Sensor Board firmy Vishay jest czujnik natężenia oświetlenia i odległości VCNL4020. Oprócz niego, po obu stronach czujnika zostały zamontowane dwie diody podczerwone Vishay VSMF2890RGX01, jak pokazano na rysunku 2. Diody zamontowano po przeciwnej stronie płytki, niż czujnik, aby zminimalizować przesłuchy. Wysoka intensywność promieniowania, wynosząca 80 mW/sr przy prądzie 200 mA pozwala na detekcję gestów dłoni w odległości do 25 cm od płytki.
Rys. 2. Zdjęcie i rzut płytki Gesture Control Sensor Board, przedstawiające czujnik odległości i diody LED zamontowane po obu jego stronach
Zasada działania
Wykrywanie gestów realizowane jest poprzez porównanie sygnałów IR pochodzących z obu diod. Wyemitowane światło odbija się od obiektu, np. dłoni, a następnie jest detekowane przez czujnik VCNL4020. Aby rozróżnić sygnały z obu diod, są one multipleksowane.
Sygnał określający odległość jest następnie odczytywany pomiędzy kolejnymi impulsami przez interfejs I2C. Gdy dłoń znajduje się blisko płytki i znajduje się bezpośrednio nad nią, odbija więcej światła. Jeśli wykonywany jest ruch dłonią nad płytką, sygnał związany ze światłem odbitym pochodzącym z jednej z diod wzrośnie wcześniej, niż sygnał związany z drugą diodą.
Różnica czasu między wzrostami poziomu sygnałów jest analizowana, aby określić czy zostało wykonane przesunięcie dłoni i w którym kierunku.
Wykrywanie gestu obejmuje dwa zasadnicze procesy:
– akwizycję i obróbkę surowych danych do analizy,
– interpretację danych za pomocą algorytmu detekcji.
W przypadku wykrycia gestu, w programie wyzwalane jest stosowne wydarzenie.
Akwizycja danych
Dane używane do wykrywania gestów są zbierane w osobnych strumieniach dla obu diod. Jako, że diody są multipleksowane i tylko jedna z nich świeci w danym momencie, pomiary mają charakter skokowy. Jeden cykl pomiarowy obejmuje zestaw danych z obu kanałów.
Rys. 3. Dwie diody przełączane niemal równocześnie
Pomiary są wykonywane w krótkich odstępach, tak że czas trwania całego cyklu pomiarowego jest dużo dłuższy, niż odstęp między pojedynczymi pomiarami każdej z diod, co pokazano na rysunku 3. Dzięki temu system może porównać sygnały niemalże w czasie rzeczywistym.
Jeśli wielkości skoków między kolejnymi pomiarami są błędne, np. gdy czujnik pracuje w środowisku mocno zaszumionym, możliwe jest wykonanie kilku pomiarów dla każdej z diod w jednym cyklu i uśrednienie ich. Ogranicza to szybkość działania systemu, ale skutkuje czystszymi sygnałami. W demonstracyjnym oprogramowaniu, dostarczanym z płytką istnieje możliwość realizacji pomiaru tego typu i ustawienia wartości zmiennej odpowiadającej za czas uśredniania.
Aby móc przeanalizować i porównać strumienie danych odpowiadające obu diodom, dane z każdego ze strumieni są dzielone na ramki obejmujące n pomiarów. Każda ramka zawiera najświeższe n wyników, a w kolejnych cyklach pomiarowych analizowana próbka jest przesuwana o jedną ramkę do przodu. Algorytm rozpoznający gesty analizuje kolejne ramki i – jeśli w którejś z nich wykryje gest – ignoruje kolejnych kilka ramek, aby nie detekować tego samego gestu wielokrotnie.
Poza tym, dzięki ignorowaniu kilku ramek po prawidłowej detekcji, redukowana jest liczba fałszywych wykryć związanych z ruchami dłoni w polu działania czujnika, które nie były gestami sterującymi. Także tę opcję można konfigurować w oprogramowaniu demonstracyjnym.
Każda ramka jest analizowana pod kątem dwóch parametrów: odchylenia standardowego sygnału i opóźnienia między sygnałami z obu diod. Porównując te wartości ze zdefiniowanymi przez użytkownika progami, algorytm może rozpoznać pojawienie się gestu i zidentyfikować go.
Odchylenie standardowe jest miarą rozproszenia danych w obrębie ramki. Jest ono wyliczane z następującego wzoru:
gdzie oznacza średnią z bieżącej ramki, a n to liczba analizowanych próbek.
Niskie odchylenie standardowe wskazuje, że w sygnale nie ma zmian, co oznacza albo, że w polu działania czujnika nie ma dłoni, albo że dłoń jest, ale się nie porusza. Wysokie odchylenie wskazuje na znaczną zmianę sygnału, oznaczającą przesunięcie dłoni nad czujnikiem, albo w kierunku czujnika.
Algorytm detekcji analizuje ramkę pod kątem innych parametrów tylko, jeśli odchylenie standardowe przekracza zadany próg.
Jeśli między sygnałami z dwóch diod występuje znaczne opóźnienie, oznacza to wykonanie gestu przesuwania dłoni nad czujnikiem. W algorytmie detekcji zaimplementowanym w oprogramowaniu demonstracyjnym, opóźnienie to jest określane na podstawie korelacji wzajemnej (krzyżowej) między sygnałami.
Określanie korelacji wzajemnej polega na nałożeniu jednego z sygnałów na drugi i obliczeniu procentowego nakładania się ich całek. Do obliczania opóźnienia wykorzystuje się punkt występowania maksimum korelacji wzajemnej.
Progi dopuszczalnego opóźnienia i odchylenia standardowego można konfigurować w programie demonstracyjnym, co pozwala projektantom testować je i kalibrować pod kątem konkretnego zastosowania.
Ustalanie progów
Odchylenie standardowe jest miarą rozproszenia danych w każdej z ramek. Ruch ręki nad płytką zwiększa odchylenie sygnałów z obu diod. Algorytm detekcji zbada opóźnienie między sygnałami tylko, jeśli odchylenie standardowe przekracza zadany próg. Próg ten powinien być ustalony powyżej poziomu szumów obserwowanego w sygnale. Im dalej od czujnika wykonywany jest gest, tym mniejsza jest zmiana w odchyleniu standardowym, gdyż detekowane jest mniej zliczeń.
Zakres detekcji rośnie wraz ze zmniejszaniem progu odchylenia standardowego, gdyż mniejsze zmiany w sygnale powodują jego przekroczenie.
Próg dopuszczalnego opóźnienia między sygnałami określa natomiast minimalne opóźnienie, przy wykryciu którego algorytm uruchomi zdarzenie związane z analizą gestów, który określa czy opóźnienie było ujemne i mamy do czynienia z przesunięciem dłoni w lewo, czy dodatnie i dłoń została przesunięta w prawo, jak zostało to przedstawione na rysunku 4. Możliwe do wykrycia opóźnienie zależy od częstotliwości pomiarów. Przy niższej częstotliwości, odpowiadającej większym opóźnieniom, rozdzielczość czasowa pomiarów spada i próg należy obniżyć.
Należy wziąć tu pod uwagę także szerokość obiektu, którym wykonywany jest gest. Cieńsze obiekty skutkują detekcją większego opóźnienia, a obiekty szersze – opóźnienia niższego.
Rys. 4. Prawidłowo wykryte gesty przesunięcia dłoni w lewo i w prawo przedstawione w programie demonstracyjnym Vishay
Sprawdzony wzór realizacji sterowania gestami
Opisana implementacja jest czuła oraz skuteczna i stanowi podstawę do projektowania niezawodnych systemów sterowania gestami, wykorzystujących komponenty firmy Vishay, dostępne za pośrednictwem firmy Future Electronics.
Płytka Vishay Gesture Sensor Board jest dodatkiem do zestawu VCNL4000 Demo Kit, dostępnego za pośrednictwem Future Electronics na stronie my-boardclub.com.