Wirtualna proteza dłoni - raport końcowy. Wizualizacja danych
Transkrypt
Wirtualna proteza dłoni - raport końcowy. Wizualizacja danych
Wirtualna proteza dłoni - raport końcowy. Wizualizacja danych sensorycznych, ARES00101, semestr letni 2009/2010. Michał Wcisło 11 czerwca 2010 1 Spis treści 1 Wprowadzenie 3 2 Wykorzystane narzędzia 3 3 Struktura przegubowa 4 4 Implementacja programowa 4.1 Struktura klasowa . . . . . . . . . . . . . 4.2 Klasy ruchu . . . . . . . . . . . . . . . . . 4.3 System komend . . . . . . . . . . . . . . . 4.4 Aktualnie zaimplementowane mechanizmy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 6 7 5 Uwagi do projektu 7 6 Podsumowanie 8 2 1 Wprowadzenie Celem projektu było stworzenie wirtualnego modelu protezy dłoni, który mógłby posłużyć do wizualizacji pracy sterownika zbierającego dane z czujników umieszczonych na ciele człowieka i podejmującego decyzje o ruchach chwytnomanipulacyjnych. Powstały model byłby bardzo wygodnym narzędziem do testowania sterowników, a także elementów sensorycznych wykorzystanych do budowy robotów biomedycznych będących protezami dłoni. 2 Wykorzystane narzędzia Do stworzenia animacji zostały wykorzystane programy Blender [3] oraz Ogre3D [2]. Elementy składowe wirtualnej dłoni w formie siatek obiektów zostały zbudowane w programie Blender. Aplikacja ta pozwala na edycją punktu ciężkości obiektów, co umożliwia kontrolowanie obrotów tworzonych elementów. Środowisko omawianego narzędzia wyposażone jest w szereg eksporterów umożliwiających konwersje do innych formatów, między innymi obiektów siatek Ogre3D (.mesh). Wtyczką odpowiedzialną za eksport danych jest OGREMeshesExporter. Skonsolidowany model protezy został umieszczony w środowisku silnika graficznego Ogre3D rysunek 1. Scena została zbudowana jako rozszerzenie przykładów zamieszczonych w kursie na portalu pl.wikibooks.org [1]. Ogre3D pozwala na hierarchiczne budowanie sceny, co wraz z możliwością wykorzystania parametryzacji RPY (Roll-Pitch-Yaw) pozwoliło na stworzenie obiektu o charakterze manipulatora. Rysunek 1: Model wirtualnej protezy umieszczony na scenie w środowisku Ogre3D Oba narzędzia są bardzo popularne i cieszą się dużym wsparciem ze strony społeczności grafiki 3D. Łatwy dostęp do informacji, kursów i ewentualnych rozwiązań problemów były powodem wyboru tych aplikacji. Co więcej, oba narzędzia są darmowe (Blender - licencja GNU GPL, Ogre3D - licencja MIT) ale z powodzeniem dorównują aplikacjom komercyjnym i często wykorzystywane są przez profesjonalistów. 3 Kod programu powstawał w zintegrowanym środowisku programistycznym Code::Blocks. Zostało ono wybrane z uwagi na duże możliwości i stosunkową łatwość integracji z silnikiem Ogre3D. Bardzo wartościowy przewodnik po integracji obu narzędzi można znaleźć na witrynie Wydziału Matematyki i Informatyki Uniwersytetu Mikołaja Kopernika w Toruniu1 , autorką tego tekstu jest Patrycja Suchomska. W rozwiązywaniu problemów przy instalacji niezwykle pomocne okazało się oficjalne forum silnika Ogre2 , na którym można także szukać informacji o interakcji środowiska silnika graficznego z Blenderem. 3 Struktura przegubowa Graficzna reprezentacja struktury przegubowej została zaprezentowana na rysunku 2. Model jest pewnym uproszczeniem rzeczywistych możliwości dłoni, gdyż nie uwzględnia ruchów palców w płaszczyźnie dłoni. Jest to spowodowane trudnością implementacji związaną z problemem kolizji palców. Należy także wspomnieć o sztywności części dłoniowej ręki, która w rzeczywistości podlega wygięciom. Początkowo końcowe dwa przeguby każdego z palców zostały sprzężone, co miało uprościć model, ostatecznie zrezygnowano z tego pomysłu z uwagi na łatwość modelowania wszystkich ruchów. W wirtualnym modelu protezy występują pewne przekłamania z uwagi na fakt, że część ruchów ręki jest wspomagana lub w całości wykonywana przez mięśnie dłoni, które z założenia mają zostać zastąpione protezą. Dotyczy to głównie kciuka, którego jedynie ruchy odwodzące są realizowane przez mięśnie przedramienia. Brak implementacji tych ruchów byłby dużym uszczerbkiem na funkcjonalności całej protezy, dlatego zostały one uwzględnione. W modelu dodano dwa przeguby q0 i q7. Pierwszy z nich umożliwił obracanie całego modelu. Drugi został dodany w celu zwiększenia realizmu animacji. 4 Implementacja programowa 4.1 Struktura klasowa Diagram klas został zamieszczony na rysunku 3. Scena budowana jest przy pomocy standardowych funkcji createCamera(), createViewports() i createScene(). Główna część aplikacji została umieszczona w klasie MenadzerRuchu. Funkcja frameStarted odpowiedzialna jest za animację i odbiera rozkazy zmiany położenia przegubów. Ruchy wykonywane są ze stałą, globalnie ustaloną prędkością na zasadzie osiągania kolejnych konfiguracji przegubów. W celu zamodelowania ruchów protezy powstały klasy Obrot,RuchZlozony i KlasaRuchu. Klasy te nie są bezpośrednio spokrewnione, ale łączą je silne zależności. Obrot reprezentuje ruch pojedynczego przegubu, RuchZlozony jest grupą obiektów Obrot, natomiast KlasaRuchu jest grupą obiektów RuchZlozony. Taka budowa struktury 1 www-users.mat.umk.pl/ papi/tut.pdf 2 http://www.ogre3d.org/forums/ 4 Rysunek 2: Struktura manipulatora odpowiadającego stworzonemu modelowi protezy (z zakresem wybranych przegubów) klasowej pozwala wykonywać skomplikowane ruchy wielu przegubów, a także pozwala modelować ruchy złożone z kilku kolejnych sekwencji. 4.2 Klasy ruchu Zapis ruchów przechowywany jest w plikach tekstowych zawierających listę nastaw przegubów w kolejnych sekwencjach ruchu. Nazwy plików zawierających klasy ruchu mają postać ’klasax.txt’, gdzie x jest numerem klasy. Nastawy podawane są w stopniach, w celu zachowania konwencji struktury komend, omawianej w dalszej części dokumentu, zakres kątów został znormalizowany, tak by najmniejsza wartość kąta była reprezentowana przez 0. Pozwoliło to na zawarcie zakresów w przedziale 0-255. Przyjęcie takiej konwencji umożliwia łatwe programowanie nowych ruchów, a także pozwala w intuicyjny sposób tworzyć proste sekwencje jak i bardziej złożone ruchy. Ruchem pomiędzy wyznaczonymi sekwencjami zajmuje się obiekt klasy MenadzerRuchu ograniczając wkład użytkownika do podania jedynie oczekiwanych nastaw protezy. Pierwsze 30 klas ruchów zostało zarezerwowanych dla pojedynczych przegubów. Ponieważ na tym etapie wirtualna proteza posiada 20 przegubów pozostałe 10 pozostawiono w celu umożliwienia rozbudowy aplikacji. Klasa zerowa wykorzystywana jest do definicji stanu początkowego dla wszystkich ruchów i może być swobodnie modyfikowana na ogólnych zasadach. 5 Rysunek 3: Diagram klas modelujący strukturę aplikacji 4.3 System komend Ponieważ z założenia proteza ma być sterowana z zewnątrz konieczne było stworzenie systemu komend pozwalającego na zadawanie położeń spoza aplikacji. Ustalono system komend opierający się o dwie liczby jedno-bajtowe bez znaku. Schemat blokowy struktury docelowej aplikacji przedstawiono na rysunku 4. Do komunikacji użyto potoków FIFO pozwalających na wymianę danych pomiędzy procesami wizualizacji protezy a modułem zapewniającym komunikację z mikrokontrolerem (przy wywołaniu należy użyć opcji -i potok wejściowy -o potok wyjściowy). Aplikacja może działać w trybie pojedynczego potoku wejściowego, pozwalając na testowanie aplikacji i stworzonych klas ruchu(opcja -i potok wejściowy). Przepływ danych jest jednostronny, zgodny ze wskazaniami na schemacie. Zakres pierwszego bajtu komendy został podzielony w celu zapewnienia komunikacji pomiędzy elementami docelowej struktury, tak że poprzez maskowanie początkowych 3 bitów pierwszego bajtu komendy poszczególne elementy mogą sprawdzać czy dana komenda jest do nich skierowana. Stąd pierwszy bajt komendy traktowany jest jako adres. Element wizualizacji posiada zakres 0-159, przy czym liczby 0-127 są zarezerwowane na klasy przegubów, a więc konkretne ruchy, a pozostałe kombinacje pozwalają na przekazywanie danych konfiguracyjnych. Podobnie przestrzeń adresowa 160-191 została przyporządkowana warstwie komunikacji po stronie komputera, 192-223 warstwie komunikacji po stronie mikrokontrolera i 224-255 sterownikowi protezy. Ten bardzo prymitywny protokół komunikacji pozwala na przekazywanie danych pomiędzy elementami struktury umożliwiając jednocześnie wykonywanie 98 klas ruchów użytkownika i 30 ruchów pojedynczymi przegubami. Zaimplementowana przestrzeń dla danych konfiguracyjnych może zostać wy- 6 Rysunek 4: Schemat blokowy przedstawiający docelową strukturę aplikacji korzystana do lepszej symulacji protezy, poprzez np. przekazywaniu danych o stanie protezy, czy ustawieniach transmisji. Dla celów testowych stworzono proste programy po stronie komputera i mikrokontrolera w celu zasymulowania docelowej struktury. Komunikacja realizowana jest z wykorzystaniem standardu USB. Przykład wymiany danych konfiguracyjnych został zaimplementowany jako prosty test łączności. Aplikacja protezy rozsyła komendy na pierwszy adres z zakresu poszczególnych elementów w drugim bajcie przekazując własny adres (128). Poszczególne elementy struktury przestawiają bajty komendy i ponownie ją wysyłają, co prowadzi do przesłania danych do aplikacji wirtualnej protezy, która sprawdza czy wszystkie elementy są osiągalne. W celu umożliwienia zadawania pozycji protezy z terminala, został stworzony prosty program zapisujący dwubajtowe dane w formie ’x x’ (gdzie x∈[0,255]) do potoku (Zapis.c). Jego wywołanie z opcją ’-o potok wyjściowy’ tworzy potok FIFO i przesyła do niego wprowadzone dane. Następnie należy wywołać aplikację protezy z tą samą nazwą potoku w parametrze ’-i’, co pozwoli na zadawanie położeń z programu ’Zapis’. 4.4 Aktualnie zaimplementowane mechanizmy Aby uniknąć nieporozumień lub niepożądanego działania aplikacji należy przedstawić zaimplementowane na tym etapie mechanizmy i komendy. Przy uruchomieniu potokowania wejściowego i wyjściowego automatycznie przeprowadzany jest omawiany wcześniej test osiągalności, jeżeli wszystkie elementy nie odpowiedzą test będzie ponawiany i nie będzie możliwości przesyłania komend do momentu otrzymania komend zwrotnych. Jeśli chodzi o zaimplementowane komendy, pierwszy bajt równy 0 pozwala na uśpienie aplikacji na podaną w drugim bajcie liczbę sekund. Natomiast komenda o adresie 129 pozwala na zmianę szybkości protezy na wartość podaną w drugim bajcie. Wartość początkowa prędkości jest równa 20. 5 Uwagi do projektu Stworzona wizualizacja protezy dłoni działa poprawnie, ale istnieje grupa obszarów aplikacji, które można ulepszyć. Przede wszystkim w celu uzyskania peł7 nej funkcjonalności wizualizacji protezy dłoni warto byłoby dodać do głównej aplikacji elementy interfejsu graficznego użytkownika pozwalającego na symulacje pewnych scenariuszy lub sytuacji w celu dogłębnego testowania sterownika. Stworzony interfejs mógłby także posłużyć do zbierania danych z sensorów (EMG,MMG) na zasadzie powtarzania ruchów wirtualnej protezy i kojarzenia ich z konkretnymi sekwencjami, co pozwoliłoby na wydajne tworzenie bazy ruchów koniecznej do implementacji sterownika protezy. Kolejnym elementem pozwalającym na rozwój projektu jest implementacja ruchów palców w płaszczyźnie prostopadłej do obecnego obszaru roboczego. Z uwagi na problem kolizji palców na tym etapie został on pominięty. Do zapewnienia całkowitego realizmu protezy konieczne jest także zapewnienie dynamiki ruchów, w obecnej wersji aplikacji ruchy wykonywane są ze stałą globalnie ustaloną prędkością. 6 Podsumowanie Sprawozdanie to miało na celu przedstawienie wyników prac nad projektem wirtualnej protezy dłoni. Stworzenie tej aplikacji pozwoliło na prześledzenie kompletnej ścieżki tworzenia aplikacji graficznej w przestrzeni 3D od etapu modelowania poszczególnych elementów, poprzez umieszczanie ich na scenie, animowanie i wreszcie wdrażanie zaplanowanej funkcjonalności. Aplikacja posiada pewne obszary wymagające udoskonaleń, co pozwala na dalszy rozwój projektu. Literatura [1] ... http://pl.wikibooks.org/wiki/OGRE. pl.wikibooks.org, 2010. [2] Gregory Junker. Pro Ogre3D Programming. Apress, 2006. [3] Jarosław Kolmaga Kamil Kuklo. Blender. Kompedium. Helion, 2007. 8