Politechnika Wrocławska Wydział Elektroniki Wizualizacja Danych Sensorycznych - Projekt Wizualizacja danych z Rękawiczki Sensorycznej Gidel Dorota Wądrzyk Katarzyna 23 czerwca 2017
Spis treści 1 Cel projektu 2 2 Założenia projektowe 2 2.1 Diagram Gantta............................................. 2 3 Opis funkcjonalności 2 4 Numeracja czujników w aplikacji i na rękawiczce 3 5 Interfejs użytkownika 3 6 Przykładowe eksperymenty 6 7 Diagram klas 7 7.1 Ogólny diagram klas........................................... 7 7.2 Ogólny diagram klas zakładek...................................... 7 7.3 Ogólny diagram klas zakładek TabCzujnikiNacisku i TabCzujnikiZgiecia.............. 8 8 Diagram czynności sterowania przepływem danych 8 9 Podsumowanie i wnioski 8 1
1 Cel projektu Celem projektu jest wizualizacja danych pobieranych z Rękawiczki Sensorycznej, na której umieszczone są dwa typy czujników: nacisku oraz zgięcia. 2 Założenia projektowe Protokół transmisji danych z mikrokontrolera do komputera Model ręki z czujnikami w 2D/3D Wykresy odczytanych wartości z czujników Grupowanie danych w zakładakach 2.1 Diagram Gantta 3 Opis funkcjonalności Rysunek 1: Diagram Gantta z zaznaczonymi kamieniami milowymi Główna funkcjonalność aplikacji. Zaiplementowano: Obsługa w wątku odbioru (przez QTcpSocket) danych wysyłanych do programu: Stworzono wątek do odbioru danych z drugego programu serwera wysyłającego dane z częstotliwością 1kHz. Wątek odbiera dane z taką właśnie częstotliwością, jednakże z powodu nie potrzebnej tak dużej wartości informacji, tylko co 10 wiadomość przesyła dalej, zapisując ją do kolejki, którą potem zajmie się wątek główny. Kolejka chroniona jest mutexem. Wątek odbioru jeśli nie jest w danym momencie połączony z serwerem cały czas próbuje się połączyć mając dane ustalane w ustawieniach. Domyślnie jest to - nazwa hosta: localhost i port 2666. Funkcję interpretującą otrzymany ciąg znaków na dane z czujników: Ciąg znaków otrzymywany przez aplikacje rozpoczyna się od X, po którym następują wartości odczytów z czujnków przedstawione w postaci czterech znaków (wartość zapisana hexadecymalnie), czujników jest 23. Następnie znajduje się 16 bitowa suma kontrolna (4 znaki) i znaki nowej lini oraz powrotu karetki. Interesujące nas znaki interpretowane są na wartości napięcia. Obliczane jest to mając na uwadze że maksymalne napięcie wynosi 3.3 V a rozdzielczość zapisanych danych to 12 bitów. Okno główne aplikacji oraz trzy zakładki które zawierają w sobie informacje z klejno, czujników nacisku, zgięcia oraz biosygnałów. 2
Zaimplementowane jest okno ustawień, w którym użytkownik może zmienić zakres wykresu, nazwa/ip serwera i port serwera. Rysowanie wykresów rezystancji od czasu danych czujników: Utworzono klasę Wykres oraz zawierające ją klasy zestawu wykresów umieszczonych w zakładce pierwszej (Czujniki Nacisku), drugiej (Czujniki Zgięcia) oraz trzeciej (Biosygnały). Na osi czasu przedstawiany jest czas od uruchomienia programu. Wykres nie zatrzymuje się nawet jeśli nie ma nowych danych. Możliwe jest zatrzymanie i wznowienie przyciskiem START/STOP prezentowania na wykresach nowych danych w trakcie odbierania. Dodatkowo w ustawieniach aktywna jest opcja wyboru zakresu czasowego prezentowanych na wykresach danych, domyślnie jest to 30 sekund. Rysowanie wykresów realizowane jest przy pomocy biblioteki QCustomPlot. Widget dłoni w 2d, prezentujący zmiany odczytów z czujników przez kolory. Zielony oznacza brak lub słaby nacisk a czerwony bardzo silny. Ręka w 3D, zmieniająca pozycje palców w zależności od otrzymywanych wartości. Możliwość wyboru jednego ważnego wykresu, który jest przedstawiany nad wszystkimi wykresami w danej zakładce. 4 Numeracja czujników w aplikacji i na rękawiczce 5 Interfejs użytkownika Rysunek 2: Numeracja czujników Aplikacja automatycznie próbuje się połączyć z portem 2666 na localhostcie. Jeżeli użytkownik chce skorzystać z innego portu lub nazwy/ip serwera może wprowadzić zmiany w ustawieniach. Dostęp do ustwień jest z górnego paska po lewej stronie. Isnieje dodatkowo możliwość zmiany zakresu czasu prezentowanego na wykesach. Domyślnie wartość ta wynosi 30 s. Okno ustawień przedstawiono na rysunku 3. 3
Rysunek 3: Okno ustawień W trakcie odbierania danych istnieje możliwość zatrzymania wykresów i wizualizacji dłoni w danym momencie poprzez przyciśnięcie przycisku Stop. Rysunek 4 przedstawia pierwszą zakładkę aplikacji wizualizującej dane - czujniki nacisku. Po lewej stronie umieszczone są wykresy. Pierwszy największy wykres, można zmieniać przyciskając odpowiednio wykres który chcemy najbardziej śledzić. Wybrany wykres zaznaczony jest przez kolorową obwódkę. Po prawej stronie znajduje się widget zawierający ręke 2D prezentującą przez kolory odczytywane w danym momencie wartości napięcia. Na dole po lewej znajduje się widget reprezentujący czujniki nacisku, w kolejności takiej jak palce ręki na rysunku. Rysunek 4: Zakładka 1 Rysunek 5 przedstawia drugą zakładkę aplikacji wizualizującej dane - czujniki zgięcia. Po lewej stronie tak samo jak poprzednio znajdują się wykresy odczytywanego napięcia. Po prawej stronie znajduje się widget zawierający ręke 3D której palce zginają się odpowiednio do otrzymywanych wartości z czujników. Dodatkowo dodano kolorowe tarcze w miejscach czujników. Jednakże gdy ręka jest zgięta czujniki mogą być zasonięte. 4
Rysunek 5: Zakładka 2 Rysunek 6 przedstawia trzecią zakładkę prezentującą odczyty EMG biosygnałów z elektrod w formie wykresów. Rysunek 6: Zakładka 3 Aplikacja odbiera pomyślnie dane z programu do akwizycji oraz wizualizuje zinterpretowane pomiary na wykresach i modelach dłoni. 5
6 Przykładowe eksperymenty By przetestować aplikację pocątkowo używano programu napisanego C który jak serwer wysyłał randomowe ciągi znaków o długości oczekiwanej przez program. Efekty zaprezentowane zostały na rysunkach 4, 5) i 6. W dalszym etapie udało się przeprowadzić testy z prawdziwym sprzętem i uzyskać oczekiwane efekty. Na zdjęciu 7 zaprezentowano próbe przyciśniecia czujnika 8, jest to czujnik nacisku. Na ekranie laptopa 8 czujnik zaczerwienił się. Rysunek 7: Test - czujnik nacisku Na zdjęciu 8 przedstawiono test czujników zgięcia. Zgięto czunjnik 14, jest to palec wskazujący. W aplikacji palec ten również się zgiął. Rysunek 8: Test - czujnik zgięcia 6
7 Diagram klas 7.1 Ogólny diagram klas Obrazek 9 pokazuje ogólnie klasy powiązane z oknem głównym. 7.2 Ogólny diagram klas zakładek Rysunek 9: Ogólny diagram klas Na obrazku 10 zaprezentowano ogólny diagram klas zakładek zawierających wykresy i prezentacje odpowiednio z czujników nacisku oraz zgięcia. Rysunek 10: Diagram klas prezentujący warianty wyświetlania daych 7
7.3 Ogólny diagram klas zakładek TabCzujnikiNacisku i TabCzujnikiZgiecia Rysunek 11: Diagram klas prezentujący głowne elementy zakładek TabCzujnikiNacisku i TabCzujnikiZgiecia 8 Diagram czynności sterowania przepływem danych Rysunek 12 prezentuje diagram czynności wątku odczytującego dane z socketu. Ze względu na to że częstotliwość wsyłanych danych wynosi 1kHz, a opisywany program wizualizujący nie potrzebuje takiej ilości informacji, tylko co piąta wiadomość jest przekazywana dalej. Wątek odczytujący dane i wątek graficzny z oknem współdzielą kolejkę zawierającą przekazane ale nie przetworzone jeszcze przez wątek graficzny wiadomości. Zmienna globalna której wartość zmienia się w zależności od kliknięcia przyciksów STOP/START (przedstawionych na rysunkach 4 i 5) informuje o tym, czy wątek powinien kontynuować swoją pracę związaną z pobieraniem danych. 9 Podsumowanie i wnioski Aplikacja spełnia początkowo założenia. W początkowych planach nie było jednak zakładki z biosygnałami, jednakże wymagania projektu powiązanego tego wymagały, stworzono więc dodatkową zakładkę z wykresami. Zrezygnowano z zakładki ze wszystkimi czujnikami na rzecz dodanych małych widgetów reprezentujących czujniki z innej zakładki. Wizualizacja odczytów z czujników nacisku jak i zgięcia przebiega zgodnie z rzeczywistością i bardzo małym opóźnieniem. 8
Rysunek 12: Diagram czynności wątku sterującego przepływem danych 9