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

Podobne dokumenty