Wizualizacja ruchu palców dłoni człowieka
Transkrypt
Wizualizacja ruchu palców dłoni człowieka
Wizualizacja ruchu palców dłoni człowieka Natalia Nowak 140376 Jakub Gruszka 140324 Szymon Osłoński 140382 Prowadzący: dr inż. Bogdan Kreczmer Wizualizacja danych sensorycznych - projekt 1 Cel projektu. Celem projektu było stworzenie wizualizacji do istniejącej rękawicy sensorycznej. 2 Koncepcja systemu pomiarowego 2.1 Idea pomiaru postury i ruchów palców dłoni Zasadniczym problemem w badaniach nad sterowaniem bioprotezą dłoni jest określenie relacji pomiędzy ruchem palców dłoni a sygnałami EMG wytwarzanymi przez uaktywniane mięśnie. Taką relację można wyznaczyć rejestrując synchronicznie sygnały EMG i ruchy palców. Znając tą relację dla zdrowej ręki, można następnie sterować ruchem protezy poprzez rozpoznawanie sygnałów EMG pochodzących z zachowanych mięśni protezowanej kończyny. Trudność zaprojektowania układu mierzącego ruch ręki ludzkiej wynika z dużej liczby stopni swobody i dużej ruchliwości. Również nie można mówić o stałych zakresach ruchu poszczególnych członów jakimi są kości ręki. Można z powodzeniem przyjąć założenie, że każdy ruch jest inny. Charakteryzuje go odrębny stan napięcia mięśni, nie tylko tych biorących bezpośredni udział w ruchu, ale również mięśni sąsiednich, ich zmęczenie, właściwości mechaniczne i czynniki motoryczne, nie wspominając nawet o odkształceniach układu kostnego. Opracowanie, układu mającego w sposób ciągły mierzyć ułożenia poszczególnych członów wchodzących w strukturę dłoni jest zadaniem trudnym. Przedstawiony system mierzący ruch palców dłoni nosi nazwę rękawicy sensorycznej. Rękawica sensoryczna mierzy posturę dłoni wyrażoną wektorem położeń kątowych poszczególnych stawów dłoni. 2.2 Stosowane sensory Istotnymi czynnikami mającymi wpływ na pracę rękawicy sensorycznej są: • sposób działania sensorów i ich własności pomiarowe (dokładność pomiaru ale również rodzaj pierwotnie mierzonej wielkości i sposób jej przekształcenia na wartość kątową); • sposób umieszczenia sensorów na ’rękawicy’ i sposób przeniesienia ruchu stawu na sensor; 1 • konstrukcja ’szkieletu’ rękawicy i jego ewentualny wpływ na ograniczenia ruchów dłoni; • wpływ ’szkieletu’, rodzaju i sposobu mocowania sensorów na dokładność pomiaru i zakres mierzonych wartości. W opisywanym systemie pomiaru ruchu dłoni, jako sensory pomiarowe zastosowano akcelerometry mikromaszynowe. Sensory takie mają małe wymiary oraz charakter sensorów ’wewnętrznych’. Reagują na przyspieszenie translacyjne oraz na odchylenie od kierunku pola grawitacyjnego (inklinometry). W obydwu przypadkach nie wymagają układów pośredniczących w przeniesieniu ruchu stawu na sensor. Ruch każdego palca będzie mierzony za pomocą dwóch zestawów akcelerometrów. 2.3 Ograniczenia pomiarów ruchów dłoni Ze względu na sposób działania akcelerometrów (pomiar przyspieszenia ziemskiego w osi ortogonalnej do wektora grawitacji) przeprowadzono analizę ograniczeń pomiaru ruchów dłoni oraz zakresu mierzalnych kątów. Przyjęto, że w czasie badania pacjent utrzymuje przedramię w pozycji równoległej do powierzchni ziemi. Rysunki(1:6) przedstawiają założone ograniczenia związane z zaproponowanym rozwiązaniem oraz możliwe do zmierzenia ruchy i posturę dłoni. Opisy wyjaśniają analizowane ruchy. Rysunek 1: Zginanie i prostowanie nadgarstka Rysunek 2: Zginanie i prostowanie palców wskazującego, środkowego i serdecznego: staw: bliższy, środkowy, dalszy 3 Opis projektu Aplikacja została napisana dla systemu Linux z wykorzystaniem biblioteki Qt3. Wizualizacja ręki zosała zaprojektowana w oparciu o OpenGL. Dokumentacja do programu została stworzona za pomocą programu Doxygen. 2 Rysunek 3: Zginanie i prostowanie kciuka: staw: bliższy, dalszy Rysunek 4: Rotacja nadgarstka 3.1 Obsługa OpenGL Jednym z głównych elementów napisanej aplikacji jest wizualizacja danych z rękawiczki. Opiera się ona na prostym modelu dłoni zaimplementowanym przy pomocy biblioteki OpenGL i glut. Dłoń składa się z paliczku zbudowanych z cylindrów, stawów w postaci kul oraz samej części dłoni złożonej z 2 trójkątów. wszystkie stawy można zginać. Długość palców także można zdefiniować. Kąty w stawach zdefiniowane są w zmiennych postaci XYrot, gdzie X to nazwa pala, a Y numer kolejnego stawu licząc od dloni do końca palca. Zastosowane nazwy palców: • T - kciuk (thumb); • I - wskazujący (index); • M - środkowy (middle); • R - serdeczny (ring); • S - maly (small). Do tego dochodzą dwie zmienne o nazwie R1Hand i R2Hand odpowiadające za skręt całej dłoni. Struktura jednego palca została zaimplementowana następująco: glPushMatrix(); glTranslatef(0, 0, -10); glRotatef(I1Rot, -1.0f, 0.0f, 0.0f); gluSphere(obj, JointRad, faces, faces); glTranslatef(0.0f, 0.0f, -lI1); gluCylinder(obj, BoneRad, BoneRad, lI1, 10, 10); gluSphere(obj, JointRad, faces, faces); glRotatef(I2Rot, -1.0f, 0.0f, 0.0f); 3 Rysunek 5: Rotacja nadgarstka Rysunek 6: Brak możliwości pomiaru odwodzenia i przywodzenia dłoni oraz brak możliwości pomiaru odwodzenia i przywodzenia palców (ruchy niewidoczne dla akcelerometru) glTranslatef(0.0f, 0.0f, -lI2); gluCylinder(obj, BoneRad, BoneRad, lI2, 10, 10); glRotatef(I3Rot, -1.0f, 0.0f, 0.0f); gluSphere(obj, JointRad, faces, faces); glTranslatef(0.0f, 0.0f, -lI3); gluCylinder(obj, BoneRad, BoneRad, lI3, 10, 10); glPopMatrix(); glPushMatrix pozwala zapisać na stosie aktualną macierz przekształceń. Jest to bardzo ważne ponieważ po dojściu z przekształceniami na koniec palca nie ma potrzeby wracania ponownie element po elemencie a możliwe jest zdjęcie tej macierzy ze stosu i szybki powrót do miejsca początkowego. glTranslatef przesuwa początek lokalnego układu współrzędnych we wskazane miejsce. Teraz jesteśmy w miejscu pierwszego przegubu. Należy więc go zamodelować poprzez gluSphere i poprzez glRotatef zrealizować zgięcie w stawie. Gdy już obróciliśmy układ współrzędnych o kąt w stawie możemy stworzyć paliczek, w tym modelu reprezentowany poprzez cylinder (gluCylinder). Postępujemy tak aż zamodelujemy wszystkie składowe palca, następnie usuwając glPopMatrix powracamy do miejsca początkowego. W taki sposób zamodelowano wszystkie 5 palców. Struktura grzbietu dłoni: glPushMatrix(); glRotatef(90, 1.0, 0, 0); glColor3f(0.2,0.2,0.8); glBegin(GL TRIANGLES); glVertex3f(-1-JointRad, -10.0, 0); glVertex3f(60+JointRad, -10.0, 0); glVertex3f(-1-JointRad, 120, 0); 4 glVertex3f(60+JointRad, 120.0, 0); glVertex3f(60+JointRad, -10.0, 0); glVertex3f(-1-JointRad, 120, 0); glEnd(); glPopMatrix(); Ponownie na stos zapisywana jest aktualna macierz przekształceń. Następnie obracamy układ współrzędnych tak, aby grzbiet znajdował sie w płaszczyźnie xy. glColor3f pozwala wybrać kolor rysowanego elementu. glBegin(GL TRIANGLES) włącza tryb rysowania trójkątów. Sa one generowane po podaniu 3 wierzchołków (funkcja glVertex3f). glEnd kończy rysowanie trójkątów, a glPopMatrix cofa nas do punktu początkowego. 3.2 Port szeregowy RS 232 Dane przesyłane są z mikroprocesora za pomocą portu szeregowego (UART). Sygnał ten jest zamieniany tak, by można było go odebrać przez port USB komputera. Służy do tego przetwornik UART na USB o nazwie FT232R. Sterowniki do tego urządzenia są wkompilowane w jądro systemu Linux (od wersji 2.6.9). Specyfikacja transmisji: 1. prędkość transmisji : 57600 kbps 2. kontrola parzystości: brak 3. bit stopu: 1 4. sygnały DTR i RTS: brak obsługi (bity wyzerowane) 5. znak końca ramki danych: 0x0D Za pomocą struct termios konfigurowane jest połączenie w programie tak, aby spełniał on wszystkie wymagania dotyczące specyfikacji transmisji. Dodatkowo transmisja została ustawiona jako nieblokująca. Podczas odczytu danych opróżniany jest bufor połączenia, zapewnia to brak opóźnienia w odrysowywaniu ręki. Metoda odczytywania danych i rysowania ręki jest wykonywana cyklicznie co 200 ms. 3.3 Obsługa Qt Aplikacja stworzona za pomocą biblioteki Qt została przedstawiona na rysunku (7) Na początku tworzony jest obiekt klasy GLWindow, ustawiana jest jego geometria oraz tworzone są suwaki, które odpowiadają za obroty wizualizacji ręki wokół osi X, Y oraz Z. Następnie tworzone są dwa przyciski, które odpowiadają kolejno za połączenie i zerwanie połączenia z rękawiczką. Nazwę pliku, z którego będziemy pobierać dane, podajemy w linii edycyjnej tworzonej jako obiekt klasy QLineEdit. Obiekt klasy QCheckBox ’Edytuj’ zabezpiecza przed przypadkową zmianą nazwy pliku. Powiązania poszczególnych składowych programu są realizowane za pomocą połączenia poszczególnych sygnałów i slotów. 5 Rysunek 7: Wygląd aplikacji 4 Wnioski Na podstawie badań możemy stwierdzić, że biblioteka OpenGL nadaje się do wizualizacji położenia ręki w czasie rzeczywistym. Duży problem stanowiła specyfikacja połączenia szeregowego, z ośmiu danych przesyłanych z rękawiczki udało się zidentyfikować tylko siedem sygnałów. Dzięki wbudowanym klasom biblioteki Qt można w łatwy sposób stworzyć interfejs do komunikacji z użytkownikiem. 6