Języki Programowania Robotów Prof. dr hab. inż. Mariusz Giergiel KRiDM AGH
Wprowadzenie Złożoność zagadnień współpracy użytkownika z robotem wzrasta, gdyż wymagania stawiane stawiane manipulatorom, robotom i innym Urządzeniom programowalnym w zastosowaniach przemysłowych są coraz wyższe. Powoduje to, że sposób interakcji użytkownika z robotem staje się bardzo ważnym zagadnieniem. W rzeczywistości wiele zadań projektowych i wykorzystania robotów przemysłowych skupia się właśnie na tym zagadnieniu. Roboty różnią się istotnie tym od środków tzw. sztywnej automatyzacji tym, że są elastyczne. To znaczy programowalne. Nie tylko sam sposób poruszania jest programowalny, lecz przez wykorzystanie czujników oraz komunikacji z innymi środkami automatyzacji mogą dostosować się do zmian w miarę wykonywania realizowanego zadania.
Przy rozpatrywaniu zagadnień programowania robotów należy pamiętać o tym, że jest ono zwykle tylko z elementów zautomatyzowanego procesu. Lokalny zestaw wyposażenia, w skład którego mogą wchodzić jeden lub większa liczba manipulatorów, układy przenośnikowe, podajniki i uchwyty, określa się terminem gniazdo produkcyjne. Na wyższym poziomie organizacji gniazda produkcyjne mogą być połączone w sieci produkcyjne, a centralny komputer sterujący może kierować całym procesem produkcyjnym. Zatem programowanie manipulatorów jest często rozpatrywane jako część szerokiego zagadnienia programowania zespołu różnorodnych maszyn połączonych w zautomatyzowane gniazdo produkcyjne.
Trzy poziomy programowania robota. Istnieje wiele postaci sprzęgów opracowanych dla celów programowani robotów. Zanim mikrokomputery gwałtownie rozpowszechniły się w przemyśle sterowniki robotów były podobne do prostych sterowników sekwencyjnych wykorzystywanych do sterowania urządzeń zautomatyzowanych. Współczesne metody sterowania opierają się na programowaniu komputerowym. Wyróżniamy: 1) nauczanie przez pokazywanie 2) języki bezpośredniego programowania robotów, 3) języki programowania na poziomie zadania.
1) Nauczanie przez pokazywanie Początkowo wszystkie produkowane roboty były programowane za pomocą metody którą nazywamy nauczaniem przez pokazywanie. Metoda ta polega na przemieszczaniu robota do pożądanego punktu docelowego i zapisywaniu jego pozycji w pamięci programatora. W fazie nauczania robota użytkownik może ręcznie prowadzić robota lub sterować nim za pomocą ręcznego programatora. Programator ręczny jest przenośnym pulpitem z klawiszami, które umożliwiają sterowanie każdym połączeniem ruchowym manipulatora lub każdym stopniem swobody w układzie kartezjańskim. Niektóre z takich sterowników pozwalają na sprawdzenie warunków i wybór opcji działania, co umożliwia zapis prostych programów logicznych. Niektóre współcześnie programatory ręczne są wyposażone w ręczne alfanumeryczne wyświetlacze i w swej złożoności są zbliżone do terminali komputerowych..
2) Języki bezpośredniego programowania robotów. Wraz z pojawieniem się niedrogich komputerów o dużej mocy obliczeniowej pojawiła się tendencja programowania robotów w językach programowania komputera. Zazwyczaj języki komputerowego programowania robotów wykazują specjalne cechy, wynikające ze specyfiki programowania manipulatorów i dla tego są nazywane językami programowania robotów. Większość systemów wyposażonych w język programowania robota jest także wyposażona w interfejs w rodzaju ręcznego programatora klawiszowego.
Języki bezpośredniego programowania robotów. - wyspecjalizowane języki manipulacyjne - biblioteka podprogramów robota dla istniejącego języka komputerowego - biblioteka podprogramów robota dla nowego języka ogólnego przeznaczenia.
Wyspecjalizowane języki manipulacyjne. Takie języki programowania robotów zostały opracowane na podstawie całkiem nowego języka przeznaczonego do zastosowania w specyficznych dla robotów zastosowaniach i nie zawsze może on być traktowany jako ogólny język programowania przykładem jest język VAL, opracowany do sterowania robotów przemysłowych Unimation Inc. Język VAL został rozwinięty jako specjalizowany język sterowania manipulatora, natomiast jest nieefektywny jako ogólny język komputerowy. Na przykład nie operuje liczbami zmiennoprzecinkowymi, lub typu łańcuch znaków a podprogramów nie można wykorzystać do przesyłania argumentów. Dopiero najnowsza wersja VAL2 wykazuje cechy ogólnego języka wysokiego poziomu. Innym przykładem wyspecjalizowanego języka manipulatorów jest język AML opracowany na Uniwersytecie Stanford.
Biblioteka podprogramów robota dla istniejącego języka komputerowego. Języki programowania robotów rozwinięto na podstawie popularnych języków komputerowych (np. PASCAL) przez dołączenie specyficznych podprogramów robotowych. Użytkownik pisze zatem w Pascalu korzystając z częstych przywołań pakietów podprogramów wcześniej określonych dla specyficznych potrzeb sterowania robotów. Jako przykład można podać AR-BASIC i Robot BASIC. Oba są zasadniczo bibliotekami podprogramów dla realizacji standardowego BASIC-a. Język JARS, rozwinięty przez Laboratorium Silników Odrzutowych NASA, jest przykładem takiego języka programowania robotów opartego na Pascalu.
Biblioteka podprogramów robota dla istniejącego języka komputerowego. Takie języki programowania robotów zostały opracowane dzięki stworzeniu nowego języka ogólnego przeznaczenia jako bazy programowej, a następnie dołączeniu biblioteki wstępnie określonych specyficznych podprogramów sterowania robotów. Przykładem takiego języka programowania robotów jest język AML, opracowany przez koncern IBM. Język programowania robotów KAREL opracowany przez GMF Robotics zalicza się również do tej kategorii, chociaż jest on podobny do języka Pascal.
3) Języki programowania na poziomie zadania Trzeci poziom metodologii programowania robotów obejmuje języki programowania na poziomie zadania. Zalicza się tutaj języki, które pozwalają użytkownikowi na wskazanie wprost pożądanych celów, zamiast wyszczególniania każdego działania robota. W takim systemie użytkownik ma możliwość włączenia instrukcji do programu opracowanego na znacznie wyższym poziomie niż języki bezpośredniego programowania robota. System programowania robota na poziomie zadania powinien mieć zdolność automatycznego czy może raczej autonomicznego wykonania wielu planowanych zadań. Na przykład w instrukcji chwycić przedmiot system powinien zaplanować trajektorię manipulatora, zapewniającą uniknięcie kolizji z otoczeniem, automatyczny wybór dobrego usytuowaniu chwytu na przedmiocie i uchwycenie go.
Języki bezpośredniego programowania a języki programowania na poziomie zadnia. Granica między tymi językami nie jest całkiem wyraźna. Wprawdzie dokonano znaczących postępów w dziedzinie języków programowania bezpośredniego robotów, które ułatwiają programowanie, lecz te osiągnięcia nie mogą być uznane za składniki systemu programowania na poziomie zadania. Systemy programowania manipulatorów na poziomie zadania dotąd nie istnieją, lecz są przedmiotem ciągłych badań.
Wymagania stawiane językowi programowania robota: 1) modelowanie otoczenia, 2) specyfikacja ruchu, 3) struktura programu, 4) warunki programowe, 5) uwzględnienie czujników.
1) Modelowanie otoczenia: Ponieważ programy manipulacyjne z definicji dotyczą ruchu obiektów w przestrzeni trójwymiarowej, każdy język programowania robota musi być wyposażony w środki do opisania takich działań. Wspólnym elementem wszystkich języków programowania robota jest istnienie wyspecjalizowanych typów geometrycznych. Na przykład wprowadzone są typy, służące do przedstawienia zbiorów współrzędnych wewnętrznych, jak również pozycji, orientacji układów kartezjańskich. Istnieją również predefiniowane operatory, które mogą operować tymi typami. Układy standardowe mogłyby służyć jako możliwy model otoczenia: wszystkie ruchy są opisane jako ruchy układu narzędzia względem układu stanowiska, a układy celów są zbudowane z dowolnych wyrażeń obejmujących typy geometryczne.
Gdy dane jest środowisko programowe robota, które tworzą typy geometryczne, to robot, inne maszyny, części i uchwyty mogą być modelowane przez określenie zmiennych związanych z każdym obiektem. W wielu językach programowania robota definiowanie zmiennych, różnych typów geometrycznych oraz odwołanie się do nich w programie tworzy bazę modelu otoczenia. Zauważmy, że fizyczne kształty obiektów nie są częścią takiego modelu; również nie są nimi powierzchnie, objętości, masy lub inne właściwości. Sposób modelowania obiektów w otoczeniu robota jest jedną z podstawowy decyzji podejmowanych przy projektowaniu systemu programowania robota. Większość współczesnych systemów działa według schematu opisanego powyżej. Pewne systemy modelowania otoczenia pozwalają na zapis powiązania między nazwanymi obiektami. Oznacza to, że system może być powiadomiony o powiązaniu dwóch lub większej liczby nazwanych obiektów.
Jeśli jeden obiekt jest bezpośrednio przemieszczony za pomocą odpowiedniej instrukcji programu, to również wszystkie obiekty z nim związane będą przemieszczane. Idealny system modelowania otoczenia powinien zawierać więcej informacji o obiektach, z którymi manipulator ma do czynienia, jak również o samym manipulatorze. Dla przykładu rozważając przykład systemu, w którym obiekty są opisane w postaci modeli typu CAD, przedstawiających przestrzenny kształt obiektu przez podanie definicji ich krawędzi, powierzchni czy objętości. Dysponowanie danymi w takiej postaci pozwala na realizację programowania na poziomie zadania. cech systemu
2) Specyfikacja ruchu Podstawową funkcją języka programowania robota jest umożliwienie opisu pożądanych ruchów robota. Poprzez instrukcje ruchu zawarte w w języku programowania użytkownik może wykorzystać możliwość planowania opisu toru. Instrukcje ruchu pozwalają użytkownikowi zadawać punkty bezpośrednie i punkty docelowy oraz wykorzystać ruch interpolowany we współrzędnych konfiguracyjnych lub ruch prostoliniowy w układzie współrzędnych kartezjańskich. Dodatkowo użytkownik może kontrolować prędkość lub czas trwania ruchu.
Aby zilustrować sposób składania podstawowych form ruchu rozpatrzymy Następującą sekwencję ruchów manipulatora: - Przemieścić do pozycji cel1 - Przemieścić do linii prostej w pozycji cel2 - Przemieścić bez zatrzymania przez punkt pośredni 1 i zakończyć ruch w pozycji cel3 Przyjmując wszystkie te punkty toru jako Opisane programowy, ten fragment programu Można zapisać w następujący sposób : w języku VAL: move goal1 move goal2 move via1 move goal3
W języku AML ( garm znaczy tutaj manipulator): move garm to goal1 move garm to goal2 linearly; move garm to goall3 via via1; W języku Intelledex Robot-BASIC: 10 move goal1 20 move straight goal2 30 cpon 40 move via1 50 move goal3 60 cpoff Większość języków ma podobną składnię dla prostych instrukcji ruchu.
Różnice w podstawowych instrukcjach ruchu dla różnych języków programowania stają się bardzie widoczne, gdy rozważymy następujące cechy: 1) Zdolności do wykonywania operacji matematycznych na typach strukturalnych takich jak układy, wektory i macierze obrotu. 2) Zdolności do wykonywania całości geometrycznych w różnych dogodnych reprezentacjach - z możliwością przekształcenia między prezentacjami. 3) Zdolność do nakładania ograniczeń na czas trwania lub prędkość poszczególnych ruchów. W niektórych systemach można zadawać wprost pożądany czas trwania ruchu lub pożądane maksymalne prędkości w połączeniach ruchowych. 4) Zdolność do zadawania celów w różnych układach odniesienia, uwzględniając układy zdefiniowane przez użytkownika i układy będące w ruchu (np. na przenośniku).
3) Struktura programu Podobnie jak konwencjonalnych językach programowania komputerów, system programowania robota pozwala użytkowi na wybór programu. Znaczy to, że takie działania jak sprawdzanie wartości, rozgałęzienie pętli, przywołania podprogramów, a nawet przerwania, na ogół występują w językach programowania robotów. W programowaniu automatycznych gniazd produkcyjnych, bardziej niż w wielu innych zastosowaniach komputerów, ważne jest równoczesne wykonywanie działań. Przede wszystkim bardzo często dwa lub więcej robotów pracuje jednocześnie w jednym gnieździe produkcyjnym, aby skrócić czas cyklu trwania procesu. Inną często spotykaną potrzebą jest potrzeba monitorowania różnych procesów za pomocą pewnego rodzaju czujnika.w takim przypadku system musi być zdolny do reakcji.
4) Warunki programowe Podobnie jak w przypadku wszystkich Ogólnych języków, dobrze zorganizowane warunki programowania pomagają zwiększyć wydajność programisty. Programowanie manipulatora jest z reguły trudnym procesem interakcyjnym, opartym na metodzie prób i błędów. Jeśli użytkownik będzie zmuszony do ciągłego powtarzania cyklu kompilowania programów, to jego wydajność będzie mała. Dlatego większość współczesnych języków programowania robotów ma możliwości wykonywania pojedynczych instrukcji podczas opracowywania programu i poprawiania błędów. Niezbędne są również takie elementy warunków programowania jest edytor tekstu, debugery i systemy zapisu plików.
5) Uwzględnienie czujników Ważnym elementem programowania robota jest informacja pochodząca z czujników. System powinien mieć zdolność do sprawdzania odczytu czujników dotyku i siły oraz wykorzystywania tej informacji. Bardzo użyteczna jest też zdolność do śledzenia odczytu czujników w tle. Połączenie z układem wizyjnym pozwala temu systemowi wysłać do manipulatora współrzędne obiektu będącego przedmiotem zainteresowania. Na przykład w naszym wzorcowym zastosowaniu system wizyjny lokalizuje na taśmie przenośnika i wysyła do sterownika manipulatora informację o jego pozycji i orientacji względem kamery. Pewne czujniki mogą być częścią pozostałego wyposażenia gniazda produkcyjnego. Na przykład pewne sterowniki robotów mogą wykorzystywać sygnały wyjściowe z czujników.
Specyficzne problemy związane z językami programowania robota. 1) Wewnętrzny model otoczenia w odniesieniu do zewnętrznej rzeczywistości 2) Zagadnienia czułości programu 3) Wykrywanie błędów
1) Wewnętrzny model otoczenia w odniesieniu do zewnętrznej rzeczywistości Główną cechą systemu programowania robota jest model otoczenia, zawarty w komputerze sterującym. Nawet gdy model ten jest całkiem prosty, to wystarczająco trudne jest zapewnienie jego zgodności z fizyczną rzeczywistością. Sprzeczność między modelem wewnętrznym i zewnętrzną rzeczywistością pojawiają się w przypadku słabego lub nieudanego chwytu obiektu, kolizji oraz wielu bardziej subtelnych problemów. Zgodność między modelem wewnętrznym i zewnętrznym otoczeniem musi być zapewniona dla początkowego stanu programu i musi być utrzymana w czasie jego realizacji. Podczas programowania wstępnego lub wykrywania błędów od użytkownika zależy zapewnienie aby stan przedstawiony w programie odpowiadał stanowi fizycznemu gniazda produkcyjnego.
2) Zagadnienie czułości programu Standardowym podejściem przy pisaniu dużego programu komputerowego jest programowanie hierarchiczne. Polega ono na opracowania fragmentów programu na niskim poziomie, a następnie utworzeniu z nich większych całości kompletnego programu. Zasadniczym wymogiem przy posługiwaniu się tą metodą jest to, aby małe części były względnie niewrażliwe na instrukcje języka które je poprzedzają i aby ich działanie nie było ograniczone żadnymi założeniami. W programie manipulatora często to nie wystarcza. Programy sterujące manipulatorem mogą być bardzo czułe na warunki początkowe, np. na początkową pozycję manipulatora. W realizacji trajektorii ruchu pozycja początkowa będzie wpływać na trajektorię, jaka będzie realizowana w danym ruchu. Początkowa prędkość manipulatora może również wpływać na prędkość ruchu.
3) Wykrywanie błędów Inną konsekwencją pracy w świecie rzeczywistym jest różnica między prawdziwym a spodziewanym położeniem obiektów manipulowanych. Część oprogramowania manipulatorów podejmuje próby uwzględnienia tego faktu i przeprowadzenia operacji montażowych tak dokładnie jak to jest możliwe. Lecz nawet wtedy błędy są prawdopodobne. Stąd ważnym aspektem programowania manipulatora jest uniknięcie tych błędów. Prawie każda instrukcja ruchu w programie może nie zostać wykonana prawidłowo z różnych powodów. Najczęstsze przyczyny to przesuwające się lub wypadające z chwytaka przedmioty, obiekty nie znajdujące się tam, gdzie powinny się znaleźć, zaklinowanie elementu podczas wkładania do otworu, niemożliwość zrealizowania otworu.
Język programowania robotów V/V+ Jednym z przykładów współczesnych języków programowania robotów jest język V/V+. Język V/V+ jest to komputerowy system programowania Zaprojektowany specjalnie dla robotów przemysłowych firmy Adept Technology, systemów wizyjnych i systemów sterowania ruchem. System komputerowy zapewnia możliwość łatwego definiowania zadania, które ma wykonać system automatyzacji, od momentu, w którym zadania są w pełni zdefiniowane przez aplikacje. Jest on między innymi stosowany dla robota Adpet One wykorzystywanego w Katedrze Robotyki i Dynamiki Maszyn Akademii Górniczo Hutniczej, w Krakowie. W odróżnieniu od prezentowanego na zdjęciu robota humanoida robot Adept One jest to nowoczesny robot przemysłowy typu SCARA z napędem elektrycznym.
Struktura programu Program to zbiór poleceń, które system V/V+ wykonuje podczas dokonywania obliczeń, aktywacji sygnałów zewnętrznych czy przemieszczania robota. Liczba programów zapamiętanych przez system jest ograniczona tylko ilością pamięci tego systemu. "Nieaktywne" programy mogą być przechowywane na dyskietkach lub dyskach Winchester. Odwoływać się do programu można poprzez podanie jego nazwy (nie więcej niż 15 znaków). Podobnie jak w przypadku nazw zmiennych nazwy programów muszą zaczynać się od litery i mogą stanowić ciąg znaków alfanumerycznych, spacji, podkreśleń i liczb. Nazwy można zapisywać małymi lub wielkimi literami - system odczyta je jako małe litery.
Wygląd programu Linie programowe: każda linia lub krok programu jest interpretowana w systemie V/V+ jako instrukcja. Wygląd kroku jest następujący: numer_kroku etykieta_kroku instrukcja; komentarz numer kroku (step number) - nadawany automatycznie, numery są aktualizowane (kroki są przenumerowywane) jeżeli nastąpi wykasowanie lub dodanie któregoś z kroków etykieta (step label) - ponieważ numery są zmieniane wraz z modyfikacją programu, by odwołać się do konkretnego kroku używa się etykiet - numerów od 0 do 65535 instrukcja - dodatek do tej dokumentacji zawiera wszystkie instrukcje rozpoznawane przez system V/V+, inne instrukcje mogą być używane jeśli system ma zainstalowane opcjonalne funkcje np. ADEPT Vision komentarz - jego początek jest wskazany przez znak ";"
Instrukcje programu Instrukcje mogą być dołączone do jednego programu kontrolnego, aby administrować wykonywaniem jednego lub równocześnie wielu programów. Każda z instrukcji jest równoznaczna z odpowiednimi komendami monitorującymi. Sterowanie (kontrola) programu Instrukcje sterowania wpływają na kolejność, w której wykonywane są instrukcje programowe. I tak, mogą one być używane do kontroli logicznym przepływem wewnątrz programów. Oprócz tych instrukcji,istnieją takie, które mogą być używane dla większej kontroli sekwencji wykonywania instrukcji.
Struktura kontroli Występuje różnorodność kolejności instrukcji, które mogą być użyte do organizacji logicznych sekcji programów oraz do kontroli kolejności, w jakiej są wykonywane. Te "struktury" programowe zapewniają środki na załączanie skomplikowanych logicznych zależności w wydajny i łatwy sposób. Struktury konstrukcji różnią się od wszystkich innych instrukcji V/V+ tym, że wszystkie konstrukcje składają się z więcej, niż z jednej linii programowej. I tak, programista musi uważać, aby zawrzeć wszystkie składniki użytych struktur konstrukcji. Część struktur może być czasami zmuszona do tego, aby działała tak samo, jak inna struktura (na przykład, struktury WHILE i DO są identyczne). W takich przypadkach do programisty należy wybór bardziej wygodnej struktury. Jednak powinno się uważać na to, aby upewnić się, ze nie ma subtelnych różnic pomiędzy różnymi wyborami, które mogą zaważyć na tym, jak one się zachowają w konkretnych sytuacjach.
Instrukcje przyporządkowania Instrukcje te są używane do określania, że zmienne programowe mają ograniczone znaczenie do programu zawierającego instrukcje Przykład AUTO - Określa zmienne, które będą dynamicznie alokowane na stosie zadań programowych LOCAL - Określa zmienne, które będą statycznie alokowane w pamięci systemowej Instrukcje zapewniają środki dla aplikacji do ustawiania wartości zmiennych programowych i parametrów systemu, do ustawienia stany przełączników kontroli systemu, oraz do ustawiania timera systemowego.
Wejście i wyjście Instrukcje te używane są do przeprowadzania różnych operacji wejścia lub wyjścia. Instrukcje te są całkiem zróżnicowane zależnie od liczby typów wejść i wyjść, oraz instrukcji które mogą być wykonane. Na przykład, program może się komunikować z użytkownikiem poprzez terminal systemowy oraz pilota. Program może czytać i zapisywać pliki na dysku. Także zewnętrzne urządzenia mogą być dostępne za pomocą linii wejścia i wyjścia. Graficzny interfejs kontroli System V+ wspomaga obsługę monitorów o wysokiej rozdzielczości przez urządzenie wyjścia. Instrukcje te mogą być używane do tworzenia i administracji oknami graficznymi, do wysyłania informacji do okien, oraz do odbierania wejścia od użytkownika systemu.
Sygnały zewnętrzne Program może używać linii wejścia i wyjścia do wyczuwania i kontroli urządzeń zewnętrznych. Instrukcje pozwalają programowi na ustawianie i odczytywanie stanu linii sygnałów binarnych. Kontrola urządzeń peryferyjnych Ponieważ aplikacje używają tych samych urządzeń peryferyjnych (na przykład pilot), instrukcje te są pomocne przy zapewnieniu wyłącznego użytku takiego urządzenia przez program.
Funkcje programowe Jakie zawiera język V/V++: Matematyczne Te funkcje są używane w wyrażeniach matematycznych. Kontrola robota Te funkcje o zmiennych rzeczywistych używane są do otrzymywania informacji o stanie robota. Pozycja robota Te funkcje mogą być użyte do otrzymania informacji o położeniu robota. Wartość stała Funkcje te w tej sekcji zwracają tę samą stałą wartość kiedykolwiek są one użyte Wejście i wyjście Te funkcje są używane do wprowadzania danych z binarnych portów wejścia i wyjścia, oraz do odbierania danych znakowych. Manipulacja Łańcuchem Te funkcje zapewniają wartości numeryczne łańcuchów
Śledzenie przenośnika Funkcje te zapewniają informację o śledzeniu przenośnika. Różne Funkcje te mogą być użyte w celu uzyskania różnych informacji dla użytku aplikacji. Funkcje pozycjonowania Poniższe instrukcje zwracają wartość pozycji, transformację lub punkt precyzji. Transformacja Funkcje pozycjonowania zwracają wartość transformacji, reprezentującą pozycję i orientację. Punkt precyzji Funkcje te mogą być użyte do komponowania punktu precyzji z wyrażeń, które określają pozycję stawów robota. Funkcje łańcuchowe Poniższe funkcje zwracają wartość łańcuchową.
Dziękuję za uwagę Dziękuję za uwagę Prof. dr hab. inż. Mariusz Giergiel KRiDM AGH