• No results found

2. Praktická část

2.5 Rehabilitační aplikace

Jako demonstraci použitelnosti senzitivních robotů v oblasti rehabilitace jsem vytvořil aplikaci, která má dva předdefinované cviky a zároveň umožňuje terapeutickému pracovníkovi zadat vlastní dráhu pro třetí cvik.

Aplikace je navržena tak, aby obsluha robota mohla lehce zvolit, případně nadefinovat, a parametrizovat jednotlivé cviky. Prvně robot najede do startovní polohy a následně je obsluha pomocí ovládacího panelu vyzvána k výběru cviku, který umožňuje volby:

„loket“, „rameno“, „vlastní cvik“.

2.5.1 Předdefinované cviky

Při zvolení možnosti „loket“ nebo „rameno“ je pak obsluha provedena sérií dotazů, pomocí kterých se parametrizuje pohyb. Zprvu, než započne vlastní parametrizace, je obsluha upozorněna na možnost zvolení rychlosti vykonávaného cviku pomocí uživatelských tlačítek. Následuje dotaz: „vážnost zranění?“ Tato otázka je doprovázena třemi volbami: „lehké“, „střední“ a „těžké“. Každá možnost nastaví jinou tuhost a tlumení (stiffness and damping) virtuálního modelu s tlumičem (viz2.1). Tyto hodnoty se nikde v rehabilitační literatuře neuvádí, proto jsem je volil experimentálně.

Dále každá ze zvolných možností vytvoří jinou kolizní podmínku (viz2.1.2). Podle volby obsluhy se definuje maximální síla pro přerušení pohybu. Pro cvik na loket je definována kolizní síla pouze ve směru vykonávání cviku (v mé aplikaci pro směr Y). Při výkonu druhého cviku na rameno je definována kolizní síla jako magnituda silového vektoru.

Volbou „těžké“ zranění je síla nastavena na 20 N a volbou „lehké“ zranění pak na 40 N, tyto hodnoty jsem opět volil experimentálně. V praxi by to mohlo fungovat následovně:

pacient z důvodu bolesti není schopen daný cvik dokončit a tak se začne více bránit, přičemž tuto sílu robot zaznamená a zastaví pohyb. Pacient se po dobu celého cviku drží madla upevněného na efektoru (Obr. 18), robot jede do konečné pozice a je připraven přerušit pohyb při dosažení kolizních podmínek. Pokud tedy pacient není schopen z důvodu mobility kloubů či zkrácení svalů cvik dokončit, tak začne vyvíjet větší sílu proti pohybu a robot zastaví pohyb, rozsvítí se led pásek, pro indikaci nedosažení cílové polohy, a vrací se zpět do startovní pozice. Takto se cvik opakuje v závislosti na zvoleném počtu opakování.

Obr. 18 - Rehabilitační madlo

Konec cvičení provází otázka na ovládacím panelu: „opakovat?“, tento dotaz nabízí dvě možnosti: „ano“, „ne“. Po zvolení možnosti „ano“ proběhne stejný dotazovací proces jako na počátku. Může se tedy cvičení napasovat na nového pacienta nebo upravit parametry pohybu pro pacienta, který právě docvičil.

2.5.2 Definice vlastního cviku

Při volbě „vlastní cvik“ je obsluha vyzvána dialogem: „pro start stiskněte zelené tlačítko a následně začněte definovat dráhu pohybu. Pro ukončení zadávání cviku opět stiskněte zelené tlačítko.“ Obsluha potvrdí zobrazený dialog pomocí „ok“, stiskne zelené uživatelské tlačítko, které je umístěné na efektoru robota a následně při sepnutém tlačítku pro ruční vedení zadává dráhu cviku přesně dle potřeb pacienta. Pokud obsluha robotem nepohybuje, neboli pokud následující zapisovaný bod je stejný jako předchozí, tak se dráha nezaznamenává.

Robot má vytvořený virtuální pracovní prostor, ve kterém by měl být cvik definován.

Pokud obsluha při definici trajektorie vyjede z toho definovaného prostoru, tak se rozsvítí led pásek, který obsluze říká, že by se měla vrátit zpět do pracovního prostoru, ale daná

pracovní prostor se body blízko singularit nezapisují a obsluha by měla definovat dráhu trochu jinou cestou.

Toto omezení definice dráhy je vcelku nepříjemné, ale výhodu nám je potom následné provádění cviku lineárním pohybem s možností řízení rychlosti, tuhosti a tlumení v jednotlivých směrech X, Y a Z koncového bodu efektoru. Dalším řešením pro odstranění dosáhnutí singularit je provádění cviku pomocí PTP pohybu. Při tomto použití by nebylo nutné definovat pracovní prostor ani okolí singularit, protože robot by body neprojížděl pomocí definované dráhy, ale pomocí definovaných bodů a tak by se singularitám vyhnul. Avšak to nese sebou tu nevýhodu, že lze řídit výše zmíněné parametry pouze v klubech a nelze regulovat parametry koncového bodu nástroje. Tím pádem se vzdáme parametrizace pohybu efektoru, tudíž i parametrizace pohybu pacientovy končetiny.

Ukončení definice dráhy proběhne opětovným stiskem zeleného tlačítka. Před zahájením cviku je, stejně jako u předdefinovaných cviků, obsluha dotázána na vážnost zranění s volbami: „lehké“, „střední“ nebo „vážné“ a počet opakování. Při tomto cviku se nenastaví žádné kolizní podmínky, protože se předpokládá, že cvik je definován na míru pacienta s ohledem na jeho rozsah pohybu.

2.5.3 Program

Hlavní část programu je tvořena příkazem switch, kde se na základě první volby obsluhy vybírá cvik k provedení. První a druhá volba nabízí předefinovaný cvik, tomu odpovídá case0 a case1. Následuje parametrizace pohybu, kdy pomocí uživatelských tlačítek se nastaví rychlost, která je programově omezena na minimální a maximální hodnoty 50 a 200 mm/s. Poté je volána metoda pro nastavení tuhosti, tlumení pohybu a kolizních podmínek. V této metodě proběhne dialog s uživatelem, kdy uživatel zvolí závažnost zranění a na základě jeho výběru se v příkazu switch nastaví tuhost a tlumení v jednotlivých směrech X, Y a Z. Metoda pak vrací pole int se čtyřmi prvky. První tři jsou zmíněné tuhosti a tlumení v jednotlivých směrech X, Y a Z. Ve čtvrtém prvku je uložena hodnota maximální síly v newtonech, která přeruší pohyb. Pomocí vráceného pole parametrizuji třídu CartesianImpedanceControlMode.

Pro vytvoření kolizních podmínek je volána metoda, která vrací typ ForceCondition a předávám ji čtvrtý prvek zmíněného pole. Pro každý cvik je nutné mít vlastní metodu, protože například pro loket definuju mezní sílu v ose Y a pro cvik na rameno zase ve všech směrech. Tímto je vlastně připravena půda pro další cviky, protože pokud je potřeba založit nový cvik, tak je pouze zavolána metoda pro vytvoření kolizních podmínek v požadovaném směru X, Y, Z nebo ve všech směrech.

V posledním dialogu zvolí obsluha počet opakování, který slouží jako parametr pro for cyklus, ve kterém je příkaz pro konání lineárního pohybu s nastaveným módem (tuhost, tlumení) a nastavenou podmínkou pro přerušení pohybu. Pokud je pohyb přerušen, tak se do IMotionContaineru uloží podmínka, která toto přerušení vyvolala a začne se vykonávat sekvence příkazů pro dané přerušení. Rozsvítí se modrý led pásek, robot jede do startovní polohy pro daný cvik a vykonává cvik od začátku.

Třetí volba nabízí definování vlastního cviku, čemuž odpovídá case2. Ten je dále strukturován podobně jako stavový automat, při stisku zeleného tlačítka přičítám do proměnné int jedničku a tak se dál posunuji do dalšího stavu. V prvním stavu pouze čekám na sepnutí stav = 0. V druhém stavu (stav =1) se zaktivuje vlákno, které běží paralelně s hlavním programem. Toto vlákno se budí každých 500 ms a požaduje aktuální kartézské souřadnice.

Aktuální získané souřadnice jsou porovnávány s předchozím zapsaným bodem. Pokud

robota. V metodě spuštěného vlákna se porovnává aktuální poloha os s okolím singularity. To znamená, že pokud máme například singularitu A4 = ± 90° a A6 = 0°, tak metoda kontroluje okolí těchto úhlů, tedy pokud u osy A4 naměří úhel mezi ± 80°

a ± 100° a zároveň u osy A6 ± 10°, tak je tento bod vyhodnocen jako okolí singularity, upozorní se obsluha a bod se nezapisuje. Takovýmto způsobem se zkontrolují všechny čtyři možné singularity. Pokud se bod nenachází v okolí singularity, tak se v poslední řadě porovnává, zda se daný bod nachází v pracovním prostoru. Pracovní prostor je definován mezními hodnotami ve směrech X, Y a Z. Pokud aktuální souřadnice robota jsou mimo pracovní prostor, tak se vizuálně upozorní obsluha, ale bod se i přesto zapíše.

Takto jsou zapisovány jednotlivé body do pole bodů, dokud nepřejde program do dalšího stavu (stav =3).

Ve stavu tři probíhá již zmíněný dialog s obsluhou: nastavení rychlosti, volání metody parametrizace a volba počtu opakování. Obdobně jako u předdefinovaných cviků se lineární pohyb provádí ve for cyklu s tím rozdílem, že pohyb je volán pomocí příkazu moveAsync. Použitím tohoto příkazu se z jednotlivých lineárních pohybů vytvoří komplexní pohyb, který lineárně projíždí volané body pomocí aproximované dráhy.

Related documents