ZASADY OPISU URZĄDZEŃ ===================== Opis urządzenia (manipulatora) musi być zawarty w pliku o nazwie z rozszerzeniem .ROB Zawiera on następujące elementy: - Opis geometrii członów manipulatora w procedurze GEOMETRY - Opis kinematyki w procedurze KINEMATICS - Definicje instrukcji sterujących dla manipulatora Opis geometrii członów: ----------------------- Procedura GEOMETRY zawiera opis CSG poszczególnych członów urządzenia (robota). Opis każdego członu (za wyjątkiem pierwszego, który automatycznie przyjmuje nazwę BASE) zaczyna się od instrukcji OBJECT: OBJECT ( [:GRIPPER] ) np.: OBJECT (PLATFORM) OBJECT (HAND: GRIPPER) Nazwa członu nie może być dłuższa niż 80 znaków. Jeśli człon jest określony jako GRIPPER, to do niego automatycznie dołączane są obiekty w wyniku realizacji instrukcji CONNECT (wykorzystywanej w opisie ogólnym systemu zrobotyzowanego w pliku *.LST), a także w wyniku realizacji stosowanych w programie sterującym robotem procedur CONNECT, CONNECT ORIGIN, ATTACH TO oraz ATTACH ORIGIN TO (jeśli w procedurach tych nie jest podana wprost nazwa członu). Bezpośrednio po instrukcji OBJECT musi się znaleźć opis geometrii danego członu w postaci ciągu wywołań procedur realizujących dodawanie i odejmowanie brył prostych metodą CSG np: OBJECT (PLATFORM) tz (50) +CUBOID (100,100,40) Lokalny układ współrzędnych, w którym się opisuje bryłę danego członu robota, jest tożsamy z układem współrzędnych tego członu użytym do określenia parametrów Denavita- -Hartenberga (w procedurze KINEMATICS - patrz dalej). Opis geometryczny zawarty PRZED pierwszym wystąpieniem instrukcji OBJECT odnosi się do członu BASE. Opis kinematyki manipulatora: ----------------------------- Procedura KINEMATICS zawiera opis powiązań pomiędzy członami robota (opis par kinematycznych) oraz opis położenia względnego tych członów. Powiązanie członu z członem bezpośrednio go poprzedzającym w łańcuchu kinematycznym opisywane jest za pomocą instrukcji NEXT JOINT, mającej postać: NEXT JOINT () lub NEXT JOINT ( ,[,t_start]) lub NEXT JOINT (,[,,[,]]) Jeśli człon odniesienia nie jest podany, to automatycznie przyjmuje się, że chodzi o BASE. Jako parametry procedury NEXT JOINT występować mogą tylko te nazwy członów, które były użyte w procedurze GEOMETRY. Mogą one być zapisywane zarówno małymi jak i dużymi literami. Po instrukcji NEXT JOINT następuje zapis parametrów Denavita-Hartenberga opisujących położenie układu współrzednych członu dołączanego w stosunku do układu współrzędnych członu odniesienia: DH NOTATION (a, alfa, d, theta) przy czym parametry tej procedury są właśnie parametrami Denavita-Hartenberga: a - długość członu odniesienia (w jednostkach długości) alfa - kąt skręcenia członu odniesienia w radianach (lub w stopniach, jeśli po wartości liczbowej poda się symbol °, który można uzyskać za pomocą kombinacji klawiszy ALT + 248) d - odsunięcie członu dołączanego (w jednostkach długości) theta - kąt konfiguracji członu dołączanego w radianach (lub w stopniach, jeśli po wartości liczbowej poda się symbol °, który można uzyskać za pomocą kombinacji klawiszy ALT + 248) Wartości parametrów procedury DH NOTATION mogą być wyrażeniami arytmetycznymi. Jeśli dołączany człon ma być ruchomy względem członu odniesienia, to odpowiednim parametrem procedury (odpowiadającym zmiennej konfiguracyjnej) musi być nie konkretna wartość, lecz specjalna funkcja t(). Ograniczenia przemieszczania opisywanego członu mogą być określone poprzez podanie minimalnej i maksymalnej wartości parametru konfiguracyjnego (parametry t_1 i t_2 instrukcji NEXT JOINT). Parametr t_start oznacza startową (początkową) wartość parametru konfiguracyjnego Denavita- -Hartenberga (tzn. odpowiadającą startowemu położeniu członu robota). Jeśli parametr t_start nie jest podany, to jest on automatycznie przyjmowany jako równy wartości t_1, jeśli zaś t_1 nie jest podane, to t_start przyjmuje automatycznie wartość 0. Jeśli procedura DH NOTATION zostanie pominięta, oznacza to pokrywanie się układów współrzędnych członu dołączanego i członu odniesienia (i - oczywoście - brak możliwości ich wzajemnego przemieszczania się). Zamiast zapisu parametrów Denavita-Hartenberga (albo dodatkowo do niego) można też zapisać ciąg transformacji (translacji i rotacji), określających przejście układu współrzędnych członu odniesienia do położenia układu współrzędnych członu dołączanego: TX (l) - translacja wzdłuż osi X o wartość l (w jednostkach długości) TY (l) - translacja wzdłuż osi Y o wartość l (w jednostkach długości) TZ (l) - translacja wzdłuż osi Z o wartość l (w jednostkach długości) RX (a) - rotacja wokół osi X o wartość a w radianach (lub w stopniach, jeśli po wartości liczbowej poda się symbol °, który można uzyskać za pomocą kombinacji klawiszy ALT + 248) RY (a) - rotacja wokół osi Y o wartość a w radianach (lub w stopniach, jeśli po wartości liczbowej poda się symbol °, który można uzyskać za pomocą kombinacji klawiszy ALT + 248) RZ (a) - rotacja wokół osi Z o wartość a w radianach (lub w stopniach, jeśli po wartości liczbowej poda się symbol °, który można uzyskać za pomocą kombinacji klawiszy ALT + 248) Przykład opisu powiązania członu ARM2 z poprzedzającym go w łańcuchu kinematycznym członem ARM1 za pomocą przegubu obrotowego o zakresie kątów obrotu od -150° do 150°: next joint(arm2,arm1,-150°,150°,0) dh notation( 50,90°,0,t() ) Przykład prostego opisu geometrii i kinematyki pewnego manipulatora: -------------------------------------------------------------------- $********************* procedure geometry +cuboid(60,60,340) $ Opis członu BASE object(arm_z) $ Człon ARM_Z nie ma zdefiniwanej geometrii object(arm_x) $ Opis członu ARM_X tz(-620) +cuboid(40,40,640) object(hand) $ Opis członu HAND tz(-70) +cylinder(20,40) object(jaw1) $ Opis szczęki JAW1 ty(-10) +cuboid(20,40,5) object(jaw2) $ Opis szczęki JAW2 ty(10) +cuboid(20,40,5) endproc $********************* procedure kinematics next joint(arm_z,base,100,320,180) dh notation(0,0,t(),90°) $ Przegub translacyjny - ruch pionowy next joint(arm_x,arm_z,50,590,170) dh notation(50,90°,t(),0) $ Przegub translacyjny - ruch poziomy next joint(hand,arm_x) dh notation(0,90°,90,t()) $ Przegub obrotowy next joint(jaw1,hand,12.5) dh notation(0,90°,t(),0) $ Liniowy ruch szczęki 1 next joint(jaw2,hand,12.5) dh notation(0,-90°,t(),0) $ Liniowy ruch szczęki 2 endproc $********************* Definicje instrukcji sterujących: --------------------------------- Instrukcje sterujące definiuje się za pomocą procedur opisujących sposób realizacji podstawowych czynności możliwych do wykonania przez modelowany manipulator (np. ruch członów manipulatora do zadanych współrzędnych konfiguracyjnych, ruch efektora do punktu o zadanych współrzędnych, otwarcie i zamknięcie chwytaka, parkowanie robota itp). Procedury te mogą mieć dowolną (unikalną dla danego manipulatora) nazwę. Nazwa ta powinna wyraźnie się kojarzyć z realizowaną czynnością, gdyż będzie później wykorzystywana w ramach instrukcji ACTION w programach sterujących modelowanym gniazdem zrobotyzowanym (patrz opis struktury programów sterujących). Jądrem każdej procedury opisującej podstawową czynność realizowaną przez manipulator jest pętla REPEAT ... UNTIL, zawierająca szereg wywołań procedury MOVE: REPEAT MOVE( , ) MOVE( , ) ... MOVE( , ) UNTIL DONE () Każdy człon manipulatora biorący udział w realizacji danej czynności musi być uwzględniony w osobnej instrukcji MOVE. Nazwy członów mogą być zapisane zarówno małymi jak i dużymi literami. Przyrosty zmiennych konfiguracyjnych poszczególnych członów podaje się w funkcji czasu znormalizowanego do zakresu [0,1]. Bieżąca wartość tego czasu jest zwracana przez funkcję L(). W momencie rozpoczęcia czynności funkcja ta zwraca więc wartość 0, zaś w momencie zakończenia czynności - wartość 1. Podawany w instrukcji MOVE przyrost wartości zmiennej konfiguracyjnej danego członu jest rozumiany jako różnica pomiędzy bieżącą wartością tej zmiennej,odpowiadającą bieżącej wartości funkcji L(), a wartością początkową, czyli odpowiadającą wartości funkcji L() równej zeru. W wyrażeniach arytmetycznych określających przyrost wartości zmiennej konfiguracyjnej danego członu manipulatora, można się odwoływać do początkowych wartości zmiennych konfiguracyjnych dowolnych członów tego robota. Te wartości początkowe są zwracane przez funkcję: TSTART () Innymi słowy, funkcja TSTART zwraca dla członu o podanej nazwie wartość jej zmiennej konfiguracyjnej odpowiadającą wartości funkcji L() równej zeru. Można się też odwoływać do aktualnej wartości prędkości efektora manipulatora, zwracanej przez funkcję: SPEED() Szacowane przemieszczenie liniowe w ruchu robota, będące parametrem funkcji DONE, wpływa na liczbę "stop-klatek", za pomocą których będzie przedstawiona graficzna symulacja danej czynności. Na liczbę "stop-klatek" ma też wpływ wspomniana wyżej prędkość robota, którą można ustawiać w dowolnym momencie za pomocą instrukcji: SPEED () Domyślny stopień prędkości wynosi 10. Przykładowa procedura opisująca czynność podstawową realizowaną przez manipulator: ---------------------------------------------------------------------------------- Poniższa procedura realizuje ruch opisanego powyżej manipulatora, w wyniku którego jego poszczególne człony (ARM_Z, ARM_X i HAND) zostaną doprowadzone do położenia określonego przez zmienne konfiguracyjne będące parametrami tej procedury (z, x, theta). Procedura DISTANCE (o treści nie przedstawionej tutaj) służy do obliczenia długości przemieszczenia (będącego parametrem procedury DONE) na podstawie docelowych przyrostów wartości zmiennych konfiguracyjnych członów ARM_Z i ARM_X. $********************* procedure move joints $ Procedura realizująca ruch manipulatora parameters z,x,theta $ Parametry instrukcji pozycjonowania (docelowe $ wartości zmiennych konfiguracyjnych) dz:=z-tstart(arm_z) $ Obliczenie docelowego przyrostu parametru $ konfiguracyjnego członu ARM_Z dx:=x-tstart(arm_x) $ Obliczenie docelowego przyrostu parametru $ konfiguracyjnego członu ARM_X call oblicz droge (dx,dz) $ Oszaxowanie przemieszczenia liniowego dist repeat move(arm_z,L()*dz) $ Określenie przyrostu wartości zmiennej $ konfiguracyjnej członu ARM_Z w funkcji $ znormalizowanego czasu L() move(arm_x,L()*dx) $ Określenie przyrostu wartości zmiennej $ konfiguracyjnej członu ARM_X w funkcji $ znormalizowanego czasu L() move(hand,L()*(theta-tstart(hand))) $ Określenie przyrostu wartości zmiennej $ konfiguracyjnej członu HAND w funkcji $ znormalizowanego czasu L() until done(dist) endproc $********************* Uwaga1: Z zapisu powyższej procedury wynika, że założono liniową zależność przyrostu wartości poszczególnych zmiennych konfiguracyjnych od czasu L(). Oznacza to, że prędkość, z jaką się przemieszczają poszczególne człony, jest stała. W takim razie na początku i na końcu tego ruchu następują bardzo gwałtowne przyspieszenia (teoretycznie o wartości nieskończonej). Nie jest to zgodne z zasadami planowania trajektorii członów manipulatora w przestrzeni konfiguracyjnej. Dlatego powyższą procedurę należałoby zmienić tak, aby zapewnić płynną zmianę prędkości poszczególnych członów podczas realizacji opisywanego ruchu (modyfikacja ta nie będzie jednak opisana w niniejszej instrukcji). Przykładowe wywołanie instrukcji MOVE JOINTS w programie sterującym gniazdem zrobotyzowanym, przy założeniu, że podczas ładowania modelu manipulatora została mu przypisana nazwa "ROBOCIK": ACTION (ROBOCIK, MOVE JOINTS, 200, 300, 45°) Realizacja odwrotnego zadania kinematyki: ----------------------------------------- Odwrotne zadanie kinematyki trzeba rozwiązać w przypadku definiowania instrukcji pozycjonowania, których parametrami są współrzędne kartezjańskie efektora manipulatora. Procedura opisująca realizację takiej instrukcji ma taką samą postać, jak to opisano powyżej, czyli musi zawierać pętlę: REPEAT MOVE( , ) MOVE( , ) ... MOVE( , ) UNTIL DONE () jednak przed tą pętlą muszą być zrealizowane obliczenia wartości docelowych zmiennych konfiguracyjnych poszczególnych członów manipulatora na podstawie zadanych współrzędnych kartezjańskich (będących parametrami procedury).