BUDOWA PROGRAMU STERUJĄCEGO SYSTEMEM ZROBOTYZOWANYM =================================================== Program sterujący urządzeniami wchodzącymi w skład systemu zrobotyzowanego jest programem w języku ARLANG, wykorzystującym specjalistyczne procedury biblioteczne, odpowiedzialnych za realizację określonych czynności elementarnych (wywołania tych procedur nazywać się będzie w niniejszej dokumentacji podstawowymi instrukcjami programu sterującego). Program ten jest zapisywany w pliku tekstowym o standardowym rozszerzeniu .PRG Uwaga! W dalszym ciągu niniejszej instrukcji w stosunku do urządzeń wchodzących w skład gniazda zrobotyzowanego będzie się używać sformułowania "robot" (chociaż mogą to być również urządzenia dużo prostsze, nie będące sensu stricte robotami). Prawidłowe funkcjonowanie programu wymaga umieszczenia na jego początku dyrektywy: #INCLUDE (.TMP) gdzie jest nazwą pliku tekstowego, w którym jest zapisany program. Przykładowo, jeśli plik ten ma nazwę TEST.PRG, to wspomniana dyrektywa powinna mieć postać: #INCLUDE (TEST.TMP) PODSTAWOWE INSTRUKCJE PROGRAMU STERUJĄCEGO: ------------------------------------------- ACTION (, [, ]) Instrukcja ta powoduje realizację przez określonego robota instrukcji zdefiniowanej w opisie tegoż urządzenia (a konkretnie: w odpowiednim pliku *.ROB, w procedurze, której nazwa jest drugim parametrem instrukcji ACTION). Instrukcja ACTION powoduje wywołanie tej procedury (zazwyczaj zawierającej pętlę z szeregiem wywołań procedury MOVE dla poszczególnych członów manipulatora). Jeśli wywoływana procedura ma parametry, to wartości tych parametrów podaje się, oddzielając je od siebie przecinkami. DLA ZAAWANSOWANYCH: Istnieje też możliwość określenia procedury przerwania (bezparametrowej procedury zdefiniowanej w pliku programu sterującego), która będzie automatycznie wywoływana w każdym przejściu pętli REPEAT ... UNTIL DONE Główne zastosowanie przerwania polega na opcjonalnym wywoływaniu w nim instrukcji BREAK, która powoduje zakończenie realizacji pętli REPEAT ... UNTIL DONE Przykład: ACTION (MANIPULATOR,GOTO,200,180,45) ATTACH TO ( [:] [, [, [,, , odpowiednio od płaszczyzn YZ, XZ i XY układu współrzędnych członu czynnego. Jeżeli nie jest podany, to automatycznie przyjmuje on wartość , zaś jeśli nie jest podany, to automatycznie przyjmuje on wartość . Za pomocą instrukcji ATTACH TO można przyłączać obiekty nie tylko do robotów, ale także dowolnych innych obiektów np. do wymiennego chwytaka, przyłączonego uprzednio do robota (w takim przypadku zamiast nazwy robota podaje się jako parametr instrukcji ATTACH TO nazwę obiektu, do którego następuje dołączenie). Przykład: ATTACH TO (MANIPULATOR:GRIPPER,20,20,20) ATTACH ORIGIN TO ( [:] [, [, [, , [:]) Przyłączenie obiektu (może nim być także robot) do robota o podanej nazwie, a konkretnie do jego tzw. członu czynnego (jest to człon o nazwie podanej jako drugi parametr instrukcji). Jeśli nazwa członu aktywnego nie zostanie podana, to przyłączenie następuje automatycznie do członu określonego w opisie geometrii robota jako GRIPPER. Za pomocą instrukcji CONNECT można przyłączać obiekty nie tylko do robotów, ale także do dowolnych innych obiektów (w takim przypadku zamiast nazwy robota podaje się jako parametr instrukcji CONNECT nazwę obiektu, do którego ma nastąpić przyłączenie). Przykład: CONNECT (CART:PLATFORM, WORKPIECE) CONNECT ORIGIN ( , [:]) Realizacja tej samej czynności, co w przypadku instrukcji CONNECT, jednak dodatkowo obiekt dołączany jest przemieszczony w ten sposób, żeby jego układ współrzędnych pokrył się z układem współrzędnych członu czynnego robota. Przykład: CONNECT ORIGIN (CART:PLATFORM, WORKPIECE) NEW CONNECTION() Funkcja zwracająca wartość 1, gdy w wyniku ostatnio wywołanej instrukcji ATTACH TO, ATTACH ORIGIN TO, CONNECT lub CONNECT ORIGIN nastapiło dołączenie jakiegoś obiektu (dołączenie zakończyło się sukcesem). W przewciwnym razie funkcja ta zwraca wartość 0. DETACH FROM ( [:]) Odłączenie WSZYSTKICH obiektów, które były dołączone do członu czynnego robota za pomocą użytych wcześniej procedur CONNECT lub ATTACHTO. Jeśli nazwa członu czynnego nie jest podana, to automatycznie zakłada się, że chodzi o człon określony wcześniej jako GRIPPER. Przykład: DETACH FROM (MANIPULATOR) DISCONNECT () Odłączenie obiektu o podanej nazwie od robota (lub innego obiektu), do którego był on wcześniej przyłączony Przykład: DISCONNECT (WORKPIECE) SPEED (wartość prędkości) Ustawienie prędkości przemieszczeń robota (standardowa wartość wynosi 10 jednostek) Przykład: SPEED (15) Oprócz procedury SPEED istnieje też tak samo się nazywająca funkcja SPEED(), zwracająca aktualna wartość prędkości przemieszczeń robota. INSTRUKCJE SŁUŻĄCE DO AUTOMATYCZNEGO USTAWIANIA PARAMETRÓW OBSERWACJI PRZESTRZENI ROBOCZEJ ------------------------------------------------------------------------------------------ ZOOM (wielkość obrazu [,liczba stopklatek]) Procedura ta powoduje ustawienie powiększenia obrazu przestrzeni roboczej. Wielkość obrazu określana jest w milimetrach (im mniejsza jest jej wartość, tym wieksze powiększenie). Standardowa wartość wynosi 1500. Opcjonalnie podawana liczba stopklatek jest to liczba faz wizualizacji powiększania (zalecana 10 do 20). Jeśli liczba stopklatek nie jest podana, to system automatycznie przyjmuje wartość 1 (powiększony obraz pojawia się od razu, bez faz przejściowych) Przykład: ZOOM (2500, 10) HIDE ( [: ]) Ustawienie niewidoczności obiektu (robota, jego członu albo innego obiektu). Jeśli robot jest niewidoczny, to wszystkie jego człony też będą niewidoczne Przykład: HIDE (WORKPIECE) HIDE CONNECTED ( [: ]) Ustawienie niewidoczności wszystkich obiektów (także robotów), które są dołączone do podanego obiektu Przykład: HIDE CONNECTED (CART: PLATFORM) SHOW ( [: ]) Odwołanie niewidoczności obiektu (robota, jego członu albo innego obiektu). UWAGA! Jeśli robot został ustawiony jako niewidoczny za pomocą instrukcji HIDE, to pomimo ustawienia widoczności poszczególnych członów za pomocą instrukcji SHOW, człony te nadal będą niewidoczne. Przykład: SHOW (WORKPIECE) SHOW CONNECTED ( [: ]) Odwołanie niewidoczności wszystkich obiektów (także robotów), które są dołączone do podanego obiektu Przykład: SHOW CONNECTED (CART: PLATFORM) VIEW ( x [,y [,z [a, [,b [,c ]]]]]) Ustawienie widoku na przestrzeń roboczą określonego przez współrzędne liniowe x,y,z (w układzie współrzędnych projektu) oraz katy a,b,c które podaje się w radianach (albo w stopniach, jeśli po wartości liczbowej wpisze się symbol °, który można otrzymać za pomocą kombinacji klawiszy ALT + 248). Instrukcję tę należy rozumieć jako ustawienie układu współrzędnych obserwatora w stosunku do układu współrzędnych projektu, przy czym zakłada się, że obserwator patrzy "z góry" tj. z kierunku dodatniej półosi Z układu obserwatora. Zerowe wartości x,y,z,a,b,c oznaczają pokrywanie się układu współrzędnych obserwatora z układem współrzędnych projektu. Parametry x,y,z opisują translację układu współrzędnych obserwatora w stosunku do układu współrzędnych projektu, zaś kąty a,b,c są to kąty Eulera odpowiadające obrotom układu współrzędnych obserwatora odpowiednio wokół osi X,Y,Z Przykład: VIEW (500,400,0,90°,0,0) ATTACH VIEW ( [:] [,] Przesunięcie początku układu współrzędnych obserwatora do początku układu współrzędnych obiektu o podanej nazwie oraz związanie go z tym obiektem (aż do odwołania za pomocą instrukcji DETACH VIEW, VIEW lub kolejnej instrukcji ATTACH VIEW). Od tego momentu obserwator będzie się przemieszczać wraz z obiektem. Liczba stopklatek to liczba faz wizualizacji przesuwania układu współrzędnych (zalecana 10 do 20). Jeśli liczba stopklatek nie jest podana, to system automatycznie przyjmuje wartość 1 (początek układu obserwatora jest umieszczany w położeniu docelowym od razu, bez faz przejściowych) Przykład: ATTACH VIEW (MANIPULATOR:GRIPPER, 10) DETACH VIEW Rozłączenie utworzonego za pomocą procedury ATTACHVIEW powiązania pomiędzy obiektem i obserwatorem. Przykład: DETACH VIEW MOVE VIEW (dx [,dy [,dz [,]]) Przesunięcie układu współrzędnych obserwatora wzdłuż osi X, Y, Z odpowiednio o wartości dx, dy, dz. Liczba stopklatek to liczba faz wizualizacji przesuwania układu (zalecana 10 do 20). Jeśli liczba stopklatek nie jest podana, to system automatycznie przyjmuje wartość 1 (początek układu obserwatora jest umieszczany w położeniu docelowym od razu, bez faz przejściowych) Przykład: MOVE VIEW (100,0,90,10) ROTATE VIEW (, [,]) Obrót układu współrzędnych obserwatora wokół podanej osi (X, Y albo Z) o kąt podany w radianach (lub w stopniach, jeśli po wartości liczbowej wpisze się symbol °, który można otrzymać za pomocą kombinacji klawiszy ALT + 248). Liczba stopklatek to liczba faz wizualizacji obracania układu obserwatora (zalecana 10 do 20). Jeśli liczba stopklatek nie jest podana, to system automatycznie przyjmuje wartość 1 (początek układu obserwatora jest umieszczany w położeniu docelowym od razu, bez faz przejściowych) Przykład: ROTATE VIEW (X, 90°) SHOW MAIN INSTRUCTIONS Wywołanie tej instrukcji powoduje, że podczas symulacji programu sterującego wyświetlana będzie tylko treść instrukcji bezpośrednio związanych z realizacją czynności przez roboty (czyli instrukcji, do których następują odwołania za pomocą instrukcji ACTION). Nie będzie natomiast wyświetlana np. treść instrukcji dotyczących ustawiania parametrów dotyczących obserwacji przestrzeni roboczej SHOW ALL INSTRUCTIONS Wywołanie tej instrukcji powoduje, że podczas symulacji programu sterującego wyświetlana będzie treść wszystkich instrukcji Uwaga dla zaawansowanych: Jeśli powyższe instrukcje (oprócz instrukcji ACTION) wywoływane są w opisie własnych instrukcji użytkownika, to można w nich nazwę robota zastąpić przez parametr *ACTIVE. Wówczas dana instrucja będzie się odnosić do aktywnego robota tj. tego, który jest określony w instrukcji ACTION. INSTRUKCJE SŁUŻĄCE DO KOMUNIKACJI GŁOSOWEJ ------------------------------------------ SPEAKER (numer,komunikat) Wygłoszenie komunikatu podanego jako drugi parametr instrucji SPEAKER, przy czym polskie głoski można uzyskać stawiając znak ^ po danej literze, zaś odstępy (spacje) należy zastąpić znakami podkreślenia _ Parametr "numer" oznacza numer głośnika: głośnik nr 1 jest przeznaczony dla języka polskiego, natomiast głośnik nr 2 wygłasza komunikaty w języku angielskim. W przypadku języka polskiego (głośnik nr 1), jeśli ciąg znaków (cyfr) ma być odczytany jako liczba, to należy go poprzedzić znakiem # np.: SPEAKER (1 , 5_razy_5_wynos^i_#25) W treści komunikatu mogą też występować fragmenty "parametryczne": zamiast konkretnego tekstu można wstawić w nawiasach prostokątnych [ ] dowolne wyrażenie arytmetyczne, którego wynik będzie wygłoszony np.: X:=5; SPEAKER (1 , [X]_razy_[X]_wynos^i_[X*X]) VOICE (numer) Ustawienie numeru głosu dla procedury SPEAKER (funkcjonuje tylko dla języka angielskiego. VOLUME (wartość) Ustawienie głośności dla procedury SPEAKER (funkcjonuje tylko dla języka angielskiego). Glośność można ustawić w skali od 1 do 100. SPEECH RATE (wartość) Ustawienie prędkości mowy dla procedury SPEAKER (funkcjonuje tylko dla języka angielskiego). Prędkość można ustawić w granicach od -10 (spowolnienie) do +10 (przyspieszenie). Standardowa prędkość odpowiada wartości 0. MICROPHONE Rejestracja i analiza treści wypowiedzi (komendy) wypowiedzianej przez użytkownika do mikrofonu. Rezultat tej analizy jest dostępny za pośrednictwem funkcji COMMAND() oraz SVALUE(). ACTIVATE (nazwa) Instrukcja ta może być wywoływana do 20 razy i powoduje dodanie komendy o podanej nazwie do listy komend "aktywnych" (które będą uwzględniane w ramach analizy realizowanej przez instrukcję MICROPHONE). Nazwa komendy może być zapisana zarówno małymi jak dużymi literami. Brak jakiegokolwiek wywołania instrukcji ACTIVATE powoduje, że uwzględniane będą wszystkie komendy z podanego zestawu komend. Wywołana aktywacja komend obowiązuje dla najbliższego wywołania instrukcji MICROPHONE. COMMAND (nazwa) Jest to funkcja zwracająca wartość 1 jeśli nazwa podana jako jej parametr jest taka sama jak nazwa komendy wypowiedzianej przy wywołaniu instrukcji MICROPHONE. W przypadku braku tej zgodności funkcja zwraca wartość 0. Sposób przypisywania nazw komendom w języku naturalnym jest opisany w osobnej dokumentacji. Przykład: IF COMMAND (OPEN GRIPPER) = 1 ACTION (MANIPULATOR, OPEN) ENDIF SVALUE (numer) Funkcja zwracająca wartość parametru (Semantic VALUE) o określonym numerze, opisującego komendę w języku naturalnym, wypowiedzianą przy wywołaniu instrukcji MICROPHONE. Przypisywanie parametrów do komend jest opisane w osobnej dokumentacji. PRZYKŁADY PROGRAMÓW W JĘZYKU ARLANG SŁUŻĄCYCH DO STEROWANIA ROBOTEM MOBILNYM ---------------------------------------------------------------------------- Przykład 1 Program realizujący przenoszenie przedmiotu znajdującego się na stole --------------------------------------------------------------------- #include(robot.tmp) procedure TakePart parameters nr AttachView(manipulator:gripper,10) zoom(500,10) Action(manipulator,Goto,0,180,0) Action(manipulator,Goto,310,180,0) Action(manipulator,Goto,310,130,0) Action(manipulator,Close) Action(manipulator,Goto,310,180,0) xp:=(nr-1)*40 Action(manipulator,Goto,xp,180,0) Action(manipulator,Goto,xp,50,0) Action(manipulator,Open) Action(manipulator,Goto,xp,90,0) zoom(1500,10) AttachView(cart:tcp,10) endproc procedure PutPart parameters nr xp:=(nr-1)*40 AttachView(manipulator:gripper,10) zoom(500,10) Action(manipulator,Goto,xp,90,0) Action(manipulator,Goto,xp,50,0) Action(manipulator,Close) Action(manipulator,Goto,xp,180,0) Action(manipulator,Goto,310,180,0) Action(manipulator,Goto,310,130,0) Action(manipulator,Open) Action(manipulator,Goto,310,180,0) Action(manipulator,Goto,0,180,0) Action(manipulator,Goto,0,90,0) zoom(1500,10) AttachView(cart:tcp,10) endproc program Action(cart,Back,105) call TakePart(1) Action(cart,Back,90) call TakePart(2) call PutPart(1) Action(cart,Back,45) call PutPart(2) Action(cart,Forwards,90) DetachView Action(cart,Forwards,150) Przykład 2 Program służący do głosowego sterowania robotem mobilnym -------------------------------------------------------- #include(robot.tmp) procedure TakePart Action(manipulator,Goto,340,180,0) Action(manipulator,Goto,340,130,0) Action(manipulator,Close) Action(manipulator,Goto,340,180,0) endproc procedure PutPart Action(manipulator,Goto,340,130,0) Action(manipulator,Open) Action(manipulator,Goto,340,180,0) endproc program y_green:=30 y_blue:=-30 y_cart:=150 speaker(1,Wybierz symulację_ciągłą) Action(manipulator,Goto,0,180,0) zoom(1000,10) repeat speaker(1,Czekam_na_polecenie) microphone if command(przeniesienie) if svalue(1)>0 dy:=y_green-y_cart y_goal:=y_cart+dy+svalue(2) if y_goal<70 .&. y_goal>y_blue+20 ok:=1 else ok:=0 endif else dy:=y_blue-y_cart y_goal:=y_cart+dy+svalue(2) if y_goal>-70 .&. y_goal0 y_green:=y_cart else y_blue:=y_cart endif else speaker(1,Pozycja_poza_zakresem) endif endif until command(zakonczenie) speaker(1,Do_widzenia) zoom(1500,10) Action(manipulator,Goto,0,180,0) Action(manipulator,Goto,0,90,) Action(cart,Forwards,150-y_cart) Opis quasi-naturalnego języka komend głosowych dla przykładu 2 -------------------------------------------------------------- $language: Polish #com zakonczenie zakończ program proszę zakończyć program #com przeniesienie *przenies *kolorowy *przedmiot ?o *liczba milimetrów do *kierunek: p2; p4*p7 #def przenies przenieś przesuń posuń przemieść proszę *przeniesc #def przeniesc przenieść przesunąć posunąć przemieścić #def kolorowy niebieski :-1 zielony :1 #def przedmiot przedmiot wałek #def liczba dziesięć :10 dwadzieścia :20 trzydzieści :30 czterdzieści :40 #def kierunek przodu :1 tyłu :-1