Wstęp
W dzisiejszych czasach jesteśmy wszyscy świadkami dążenia ludzkości do automatyzowania procesów produkcyjnych. Duża część produktów sprzedawanych na świecie nie jest bezpośrednim wytworem rąk ludzkich. Są one wytwarzane przez różnego rodzaju maszyny takie jak obrabiarki numeryczne oraz różnego rodzaju roboty. Część z nich wykonuje prace, które są szkodliwe dla ludzi, część takie których ludzie nie są w stanie wykonać.
Odrębną klasą robotów są roboty mobilne, mogą być one wykorzystywane do celów transportowych, bądź jeżeli robot jest specjalnie skonstruowany to może służyć np.: jako urządzenie sprzątające podłogi pomieszczeń, bądź jako kelner w barze szybkiej obsługi. Należy powiedzieć, że wielu ludzi upatruje tutaj zagrożenia dla rynku pracy.
Zaprezentowano tutaj problemy i ich rozwiązania, które powstały podczas pisania programu sterującego robotem mobilnym. Zamieszczono tutaj także informacje niezbędne do przeniesienia czytelnika w świat komend sterujących robotem i jego systemu operacyjnego.
Pracę rozpoczęto w miejscu, w którym jedynymi elementami dostępnymi były gotowy robot mobilny wraz z instrukcją, oraz komputer klasy IBM-PC. W tym momencie należało sprecyzować co będzie ostatecznym efektem pracy. Zdecydowano się na napisanie programu sterującego robotem w taki sposób, by znacznie uprościć jego kontrolę. Żądane cechy programu to:
umożliwienie ręcznego sterowania robotem, za pomocą prostych rozkazów;
umożliwienie układania sekwencji ruchów robota;
odczytywanie sonarów i prezentacja graficzna danych z nich uzyskanych;
zabezpieczenie robota przed możliwością zderzenia się z przeszkodą (podczas realizacji programu);
możliwość zapisywania uzyskanych pomiarów w postaci plików do późniejszego wykorzystania;
możliwość zapisywania do pliku ułożonych sekwencji ruchów robota.
Praca ta została ułożona w taki sposób, aby zapoznać czytelnika z budową robota (rozdział 2.1.), zestawem komend sterujących jego ruchem (rozdział 2.3.) oraz jego systemem sonarów (rozdział 2.4.). Dodatkowo została opisana specyfika systemu Albatros i wynikająca z tej specyfiki koncepcja sterowania robotem (rozdział 2.2.). Potem opisana jest specyfika tworzenia programów pod Windows (rozdział 3.1.). Wewnętrzna struktura napisanego programu, sposób jego podziału na moduły (rozdział 3.3.1.) oraz opis działania wszystkich funkcji programu (rozdziały 3.3.1., 3.3.2., 3.3.3., 3.3.4., 3.3.5, 3.3.6.). Następnie umieszczony jest opis użytkowania gotowego programu (rozdział 3.4.), przedstawione są ważniejsze okienka dialogowe, ich właściwości i sposoby wykorzystania. W przed ostatniej części zawarto przykładowe efekty pracy programu (rozdział 3.5.). W ostatniej zaś części umieszczone jest podsumowanie całości pracy (rozdział 4.).
Opis robota mobilnego
Ogólna charakterystyka
Robot jest urządzeniem, które jest produkowane przez francuską firmę
ROBOSOFT SA specjalizującą się w konstrukcjach robotów mobilnych. W związku z tym należy zaznaczyć, że robot jest konstrukcją zamkniętą, a niektóre opcje rozszerzeń jego możliwości są dostępne jedynie poprzez zakup dodatkowych pakietów oprogramowania, bądź też w postaci urządzeń elektronicznych.
System sterujący robota jest wykonany w oparciu o procesor Motorola 68020 pracujący z zegarem 16 MHz. Został wyposażony w 4 szesnastobitowe liczniki współdziałające z optycznymi enkoderami służącymi do kontroli pozycji. Ponadto system robota jest wyposażony w 4 dwunastobitowe przetworniki AC oraz po 8 wejść i wyjść cyfrowych. Robot został dodatkowo doposażony w system sonarów zbudowany w oparciu o procesor Motorola 68000 i wyposażony w 8 sonarów. Należy wspomnieć, że ilość sonarów może zostać zmieniona. Integralnym elementem elektronicznej części robota jest jego system operacyjny. Przez producenta nazwany został on ALBATROS i występuje tutaj w wersji 6.0. System ten, jak zapewnia producent, został stworzony specjalnie do zastosowań w urządzeniach kontrolujących wiele osi. Ponadto jest to system modularny, zapewniający łatwość rozbudowy, tak by można było dołączać obsługę nowych elementów systemu, przykładowo ramienia o sześciu stopniach swobody. Należy jednak zaznaczyć, że taka możliwość w aktualnej sytuacji jest nieosiągalna, ponieważ aby dołączać dodatkowe polecenia systemu operacyjnego robota, należy posiadać odpowiednie oprogramowanie, które można zakupić w firmie ROBOSOFT SA.
Komunikacja z systemem operacyjnym robota odbywa się za pomocą interfejsu RS232. Komendy wysyłane do robota są w formie tekstowej i w takiej samej formie są odbieranie odpowiedzi. Przypomina to mniej więcej „rozmowę” z systemem operacyjnym MS-DOS tyle, że poprzez terminal.
Rys. 1. Wygląd zewnętrzny robota.
Koncepcja sterowania
Jak zaznaczono w poprzednim rozdziale, robot jest wyposażony w system operacyjny ALBATROS. System ten jest jądrem wiążącym wszystkie elementy systemu sterowania robota, to tu jest dokonywana interpretacja wszelkich komend dostarczonych do robota i to stąd wysyłane są polecenia do urządzeń składających się na jego całość.
Na każdy system operacyjny, z punktu widzenia użytkownika, składają się komendy, to ich bogactwo i elastyczność decyduje o jego przydatności do danego zastosowania. ALBATROS został napisany specjalnie do współpracy z urządzeniami wyposażonymi w wiele osi ruchu. Jego komendy są więc przystosowane do współpracy z robotem, dodatkowo należy podkreślić, że jest to system wielozadaniowy. Można powiedzieć, że decyzja firmy ROBOSOFT SA dotycząca umieszczenia tego systemu jako jądra systemu sterowania robota była dobra.
Z punktu widzenia osoby piszącej program sterujący, najbardziej interesująca jest ta część systemu operacyjnego, która współpracuje z użytkownikiem. W tym systemie odbywa się to za pomocą komend tekstowych przesyłanych przez łącze RS232. Sama transmisja odbywa się następująco: użytkownik przesyła do robota daną komendę systemu operacyjnego, system ją interpretuje, podejmuje odpowiednie działania i jeśli przez autora systemu została przewidziana odpowiedź to ją odsyła. Odpowiedzią, w wypadku gdy jest ona zwracana, może być tekst określający rodzaj błędu lub też dane żądane przez użytkownika, np. wynik działania procesu odometrii. Ostatnim krokiem pojedynczej wymiany danych, jest przesłanie przez system operacyjny do użytkownika tekstu zachęty.
Analizując zestaw komend robota określono najczęstsze zachowania się systemu i na tej podstawie wyciągnięto następujące wnioski:
System na właściwie sformułowane komendy, wysłane we właściwym czasie, nie odpowiada inaczej niż znakiem zachęty.
Na komendy źle sformułowane, bądź z jakichś innych powodów niemożliwe do zrealizowania, system wysyła tekst precyzujący typ błędu.
Nie jest wysyłana do użytkownika informacja zwrotna o stanie wykonywania danej komendy. Poprawna komenda zostaje przyjęta, potwierdzane jest to znakiem zachęty, ale jej realizacja odbywa się w tle, a system jest przygotowany na przyjęcie kolejnego zlecenia. Przykładem tu mogą być komendy dotyczące wykonywania przez robota ruchu.
Wielozadaniowość systemu robota jest narzędziem pozwalającym na wydanie polecenia ruchu i w czasie jego wykonywania odczytywanie pomiarów z sonarów lub też danych o pozycji robota z procesu odometrii. Wielozadaniowość ma też wadę: każdy proces uruchomiony w systemie robota powinien mieć dostęp do interfejsu, powoduje to, że po wydaniu polecenia i ewentualnej odpowiedzi, powinien on natychmiast zwolnić ten zasób systemu. Prostymi słowy nie dowiemy się czy ruch robota się skończył, jeśli o to nie zapytamy.
Te cechy systemu zaważyły na metodzie budowy i przesyłania do robota układanych przez użytkownika zestawów sekwencji ruchów. Przyjęto zasadę, że dane przygotowywane do przesłania do robota są w postaci gotowych instrukcji systemu ALBATROS lub prostych pseudo poleceń. Pociąga to za sobą brak możliwości modyfikacji trajektorii ruchu robota podczas realizacji programu. Jedynym dostępnym, w aktualnej wersji programu, pseudo poleceniem, jest żądanie wykonania ruchu po klotoidzie (kontrolowanej). Innymi słowy oznacza to, że została udostępniona możliwość umieszczania w programie polecenia wyliczającego parametry klotoidy i na ich podstawie wykonującego odpowiedni zestaw ruchów.
Sama koncepcja wykonywania przez robota gotowych sekwencji ruchów jest następująca. Tworzymy za pomocą narzędzi zawartych w programie plik tekstowy, w którym w każdej linijce jest umieszczona komenda służąca do umieszczenia jednego ruchu w kolejce ruchów do wykonania. Długość kolejki w robocie wynosi dziesięć (patrz komenda MOTV AD, rozdział 2.3.2.2). Ilość linii skryptu jest z punktu widzenia użytkownika nielimitowana, w rzeczywistości narzędzia programu służące do tworzenia skryptów ograniczają ich długość do trzydziestu dwóch tysięcy siedemset sześćdziesięciu siedmiu linii. Ograniczenie to nie dotyczy procedur wysyłających skrypt do robota.
Tak przygotowany zestaw danych wejściowych program przesyła się do robota. Dokonuje tego funkcja UruchomSkrypt(). Szczegółowy opis jej działania znajduje się w rozdziale 3.3.6., tutaj zaś tylko przybliżono jej koncepcję. Podczas uruchamiania tej funkcji program przekazuje do niej informację o pliku zawierającym dane do przesłania do robota, oraz flagę określającą sposób zachowania procedury wysyłającej. Flaga ta może przybierać dwa stany, jeden określa czy komendy mają być przesyłane do robota, drugi czy należy zatrzymać awaryjnie ruch robota. Samo przesłanie realizowane jest następująco: procedura uruchamia proces MOTV systemu robota, następnie odczytuje linię tekstu skryptu i przesyła ją do robota, odczytuje odpowiedź, potem uruchamia funkcję odczytującą dane z sonarów. Pamiętamy, że te dwie funkcje w środowisku ALBATROS mogą wykonywać się równolegle. W kolejnym kroku funkcja analizuje odpowiedź przesłaną podczas wysyłania ruchu, jeżeli proces ten przebiegł bezbłędnie, to etap przesłania i pomiaru sonarami wykonywany jest ponownie z kolejną linią skryptu. Jeśli robot zgłosił błąd, związany z przepełnieniem kolejki ruchów oczekujących na wykonanie, to następuje próba ponownego przesłania polecenia do robota, która trwa tak długo, aż się powiedzie. Cały ten cykl trwa aż do wyczerpania poleceń zawartych w skrypcie, lub do momentu, gdy opisywana powyżej flaga sterująca zmieni stan na zatrzymujący robota. W pierwszym wypadku wykonywane jest, po zakończeniu ruchu przez robota, wyłączenie procesu MOTV. W drugim przypadku, następuje przesłanie do robota komendy MOTV KI. Powoduje ona zatrzymanie robota, po czym następuje wyłączenie procesu MOTV.
Flaga swój stan może zmienić w dwu przypadkach:
Po dokonaniu pomiarów sonarami, odległość od jednego z nich jest mniejsza niż zadana przez użytkownika.
Użytkownik, żąda zatrzymania realizacji skryptu (przycisk dostępny w okienku Uruchamianie skryptów).
Należy tutaj powiedzieć, że wybrany sposób nie jest jedynym. Można sterować przepływem informacji pomiędzy robotem, a programem nie interpretując komunikatów błędów, a żądając przesłania statusów. Sposób ten jednak wymaga przesyłania dodatkowych komend w kanale łączności pomiędzy robotem, a komputerem. Możliwe jest także zaprojektowanie takiego algorytmu sterującego, aby na bieżąco układał trajektorię robota. Program wtedy musiał by się składać z dodatkowych pseudo poleceń nie interpretowalnych bezpośrednio przez system ALBATROS. Mogły by się wtedy pojawić polecenia wykonywania ruchu robota w zadanej odległości od przeszkody, wykorzystywały by one dane z sonarów i po ich interpretacji generowały by zestaw elementarnych ruchów robota.
Język robota
Język robota jest zbiorem kilku poleceń wbudowanych w system operacyjny dostarczony przez producenta. Polecenia te to: SERV, POS, MOVE, MOTN, MOTV, MOTP, ODOM, ODOS, ODOF, READ, RNOD. Ogólnie rzecz biorąc system operacyjny robota jest wyposażony w dużo bogatszy zestaw instrukcji, które przykładowo umożliwiają odczytywanie wejść i wyjść cyfrowych, udostępniają operacje związane z zapamiętywaniem danych w pamięci robota, czy też obsługę nietypowych urządzeń dołączonych do systemu. Jednakże te polecenia pracują na względnie niskim poziomie i nie zapewniają minimum komfortu w korzystaniu z robota. Wymagają znajomości sprzętowej jego modułów. Opisano tu jedynie instrukcje pozwalające sterować w miarę „łatwo” ruchem i sonarami robota.
Instrukcje warstwy niższej
Zaliczono do tej grupy 3 instrukcje, są to: SERV, POS, MOVE. Znalazły się tutaj gdyż sterują robotem bez uwzględnienia zewnętrznego układu współrzędnych, a jedynie wartości enkoderów. Czyli prościej mówiąc nie znamy pozycji, ale wiemy ile razy obróci się prawe i lewe koło robota, bądź z jaką prędkością.
Instrukcja SERV
Instrukcja ta jest wykorzystywana aby zainicjować nisko poziomową pętlę kontroli ruchu robota. Może ona przyjąć postać:
SERV ON [T=<typ pętli>]
[D=<urządzenie>]
[N=<zestaw parametrów>]
[P=<okres próbkowania>]
[F=<pętle kontroli>]
SERV OF [D=<device>]
Parametry
ON tworzy zadanie pętli kontroli jednego z urządzeń
OF usuwanie zadania pętli kontroli jednego z urządzeń
[T=] typ pętli
OP otwarta pętla pozycji
OV otwarta pętla prędkości
BP zamknięta pętla pozycji
BV zamknięta pętla prędkości
[D=] numer urządzenia (od 1 do F), w zapisie heksadecymalnym
[N=] liczba określająca który z predefiniowanych zestawów parametrów pętli kontroli ma zostać wykorzystany. Liczba z zakresu 11 do FF w zapisie heksadecymalnym.
[P=] okres próbkowania pętli kontroli, w cyklach podstawowych zegara czasu rzeczywistego.
[F=] definiuje stałą zależność pomiędzy ilością cykli niskopoziomowej pętli kontroli i modułu generacji trajektorii
Wartości domyślne
T=BP zamknięta pętla kontroli pozycji
D=1 urządzenie nr 1.
N=11 pierwszy zestaw parametrów
P=1 pętla kontroli wykonuje się w każdym cyklu zegara czasu rzeczywistego
F=4 cztery cykle pętli kontroli na jeden punkt trajektorii
Przykład
Włącz zamkniętą pętlę kontroli pozycji dla urządzenia 2, na jeden cykl pętli kontroli ma przypadać jeden punkt trajektorii.
Albatros>serv on t=bp d=2 f=1
Wyłącz pętlę kontrolną urządzenia nr 1:
Albatros>serv of
Kody błędów
ACAD wskaźnik na tablicę wartości czujników nie istnieje w bloku DDB (Device Definition Block)
AOUT nie został, w bloku DDB, określony wskaźnik do procedury wysyłającej obliczony rozkaz do kanału wyjściowego
CGEN nie można znaleźć, w bloku DDB, wskaźnika do struktury określającej uogólnione współrzędne. Ten błąd może być zgłoszony jedynie przez polecenie SERV ON T=BP.
CLRC nie ma określonej procedury do czyszczenia rejestrów położenia (w bloku DDB)
DEVI błąd w określeniu numeru urządzenia (D=...])
ERAS błąd pojawia się przy próbie odczytu danych z bloku DDB
FREQ błąd w częstotliwości względnej pomiędzy pętlą niskopoziomową, generacją trajektorii [F=...]
ILL= nie legalne znak „=”
LECC wskaźnik do procedur przetwarzających dane z czujników na kontrolowalne zmienne nie istnieje w bloku DDB
NBAM brak numeru urządzenia w bloku DDB
NDEV nie można znaleźć statusu urządzenia w bloku DDB, prawdopodobnie urządzenie nie zostało zdefiniowane
NOPA brak bloku danych dla odpowiedniego typu kontrolnej pętli w bloku DDB
NOST brak wskaźnika określającego położenie stosu modułu generacji trajektorii
NUM1, NUM2
błąd podczas próby pobrania parametrów pętli kontroli
NUMB błędny numer pętli ([N=...])
OBIN nie mogę odnaleźć wskaźnika do wyjścia logicznego w DDB. Prawdopodobnie uszkodzone dane w bloku DDB
OFF! żadna pętla nie została aktywowana, błąd podczas próby wykonania komendy SERV OF
ON! pętla kontrolna została już uruchomiona, błąd podczas próby wykonania komendy SERV ON
SEQ1 systemowa flaga nie jest włączona. Wykonaj inicjalizację sprzętową całego systemu i spróbuj jeszcze raz.
SEQ2 nie można zakończyć, ponieważ urządzenie nie wykonało jeszcze wcześniejszego ruchu.
SAMP błąd okresu próbkowania (P=[...])
SYNT błąd składni, pojawia się gdy przełączniki ON lub OF nie pojawią się przed znakiem CR
TYPE błędny typ pętli ([T=...]), generalnie spowodowane jest to przez brak definicji w bloku DDB
Instrukcja POS
Instrukcja służy do pobrania pozycji urządzenia. Funkcja ta wykorzystuje jego wewnętrzne czujniki, takie jak optyczne enkodery lub potencjometry, aby wyznaczyć pozycję w podanej przestrzeni.
Składnia
POS [D=<urządzenie>]
[S=<przestrzeń współrzędnych>]
[O=<bufor wyjściowy>]
Parametry
[D=] heksadecymalna liczba określająca numer urządzenia (1 do F)
[S=] określa przestrzeń dla której ma być estymowana pozycja urządzenia
S=S przestrzeń czujników
S=G przestrzeń uogólniona
S=C przestrzeń kartezjańska
Dopuszczalne parametry dla danego urządzenia są zależne od definicji w bloku DDB
[O=] liczba heksadecymalna określająca pozycję bufora na liczby 32-bitowe.
Wartości domniemane
D=1 urządzenie nr 1.
S=G współrzędne uogólnione.
Przykład
Podaj współrzędne urządzenia o numerze 3
Albatros>pos d=3
Kody błędów
ABUO nie ma zdefiniowanego bufora wyjściowego w bloku DDB
CART nie można znaleźć współrzędnych kartezjańskich w bloku DDB
DEVI nie można znaleźć urządzenia o podanym numerze
GENE nie można znaleźć współrzędnych uogólnionych w bloku DDB
ILL= niedopuszczalny znak „=”
NOID brak pola ID w bloku DDB
SENS adres czujników nie został odnaleziony w bloku DDB
SPAC błąd w określeniu przestrzeni współrzędnych
UPTR błędnie podany adres bufora wyjściowego
Instrukcja MOVE
Instrukcja sterująca ruchem dowolnego wielo-osiowego urządzenia
Składnia
MOVE par AC=<pozycja>[,...]
RC=<relatywna pozycja>[,...]
AR=<relatywna pozycja>[,...]
[D=<urządzenie>]
[P=<cykli zegara>]
[G=<pozycja w tabeli>]
Opis parametrów
par P ruch z kontrolą pozycji.
V ruch z kontrolą prędkości.
PA ruch z kontrolą pozycji jednostajnie przyspieszony.
PD ruch z kontrolą pozycji jednostajnie opóźniony.
Ten parametr musi odpowiadać parametrowi T podanemu przy poleceniu SERV ON wydanemu dla tego samego numeru urządzenia.
AC pozycja lub prędkość do uzyskania.
RC relatywna pozycja lub prędkość w stosunku do aktualnej.
AR relatywna pozycja. Komenda wykonuje to samo co RC, ale kasuje pozycję odczytywaną przez czujniki przed wykonaniem ruchu. Jest ona wykorzystywana np. z robotami mobilnymi gdy należy zmienić punkt odniesienia.
[D] numer urządzenia
[P] określa ilość cykli zegara w której należy zrealizować podaną komendę.
[G] określa pozycję w tabeli sterowań do wykonania. Gdy:
G=1 do F, jeden z 15 zdefiniowanych zestawów (jeśli istnieje) jest użyty
G>F, wtedy wartość G jest wskaźnikiem do tabeli sterowań umieszczonej w obszarze programu użytkownika.
Uwaga: Wszystkie wartości muszą być liczbami całkowitymi (16 bitów ze znakiem).
Wartości domniemane
par brak wartości domniemanej. Parametr jest konieczny.
AC, RC, AR brak wartości domniemanej. Ilość podanych liczb musi być taka sama jak ilość mechanicznych osi urządzenia.
D=1 urządzenie nr 1.
P=1 błędna wartość tego parametru może destabilizować system, szczególnie gdy czas podany na wykonanie ruchu jest zbyt krótki.
G poprzednia wartość. 1 jeśli pierwszy ruch po sprzętowej inicjalizacji.
Przykład
Przesuń urządzenie nr 2 do jego pozycji początkowej, wykorzystując 100 cykli niskopoziomowej pętli kontroli ruchu urządzenia:
Albatros>move p ac=0,0 d=2 p=100
Kody błędów
ADWA nie można zlokalizować obszaru roboczego w DDB
AR=X ruch typu AR jest nie dopuszczalny (tylko w systemach z kontrolą pozycji)
COM? zestaw komend nie został uruchomiony
COMM błąd podczas próby odczytania zestawu komend
DEVI błędny numer urządzenia
ERRC błąd w zestawie komend
GAGL nie ma górnej granicy przyspieszenia w bloku DDB
GAIN wystąpił błąd podczas próby konwersji numeru pobudzenia [G=...]
ILL= niedozwolony znak „=”
LIGL brak dolnego ograniczenia prędkości w bloku DDB
LIGU brak górnego ograniczenia prędkości w bloku DDB
NDEV nie można odnaleźć statusu urządzenia w bloku DDB. Błąd ten występuje najczęściej dla nie zdefiniowanego urządzenia.
NGAI podana tablica sterowań [G=...] nie istnieje w bloku DDB.
NOAS nie ma uruchomionej pętli sterowania. Należy uruchomić komendę SERV ON, przed dokonaniem próby poruszenia urządzeniem.
NOID nie można znaleźć pola identyfikacji w bloku DDB
NOPO nie została uruchomiona pętla kontroli pozycji. Należy wywołać komendę SERV OF, po czym komendę SERV ON T=BP.
NOVE nie została uruchomiona pętla kontroli prędkości. Należy wywołać komendę SERV OF, po czym komendę SERV ON T=BV.
SAMP błędnie podany okres próbkowania [S=...]
SEQ1 flaga systemu ALBATROS jest nie włączona. Zainicjuj sprzętowo cały system i spróbuj jeszcze raz.
SPGL nie ma zdefiniowanych górnych granic prędkości w bloku DDB
SYNT brak parametrów definiujących typ ruchu (P, V, PA, PD).
Instrukcje warstwy wyższej sterujące ruchem robota
Instrukcje te posługują się bardziej zaawansowanymi algorytmami kontroli ruchu robota. Dlatego też są łatwiejsze do wykorzystania. Dodatkowo instrukcja MOTN potrafi korzystać z systemu sonarów do wykrywania przeszkód (niestety do poprawnego działania tego udogodnienia robot musi być wyposażony w system sonarów w wersji drugiej, zaś dostępny robot jest wyposażony w wersję wcześniejszą).
Instrukcja MOTN
Instrukcja MOTN umożliwia inny sposób kierowania robotem niż instrukcja MOVE. Za jej pomocą łatwe staje się uzyskanie podstawowych ruchów robota, takich jak przesunięcia i obroty wokół centralnej osi (oś pomiędzy kołami robota), przez podanie jedynie odległości na jaką ma się przesunąć i prędkości. Dane do wykonania ruchu podaje się w metrach, bądź stopniach. Komenda MOTN dzieli każdy ruch na elementarne kroki, uważając na odpowiednie gradienty przyspieszenia bądź opóźnienia. Wszystkie elementarne kroki są wykonywane przez proces przebiegający w tle, dlatego też ruch może zostać przerwany w każdym momencie. Dodatkowo możliwa jest detekcja przeszkód, jeśli użytkownik tego sobie zażyczy. Detekcja jest realizowana przez sieć sonarów i jeżeli zostanie wykryta przeszkoda ruch robota jest automatycznie wstrzymywany.
Składnia:
MOTN ON|OF[F] [U=ON]
MOTN FO[RWARD]|BA[CKWARD] [D=<odległość>] [V=<prędkość>]
MOTN LE[FT]|RI[GHT] [A=<kąt>] [V=<prędkość>]
MOTN KI[LL]|WA[IT]
MOTN ST[ATUS] [O=<wyjście>]
Opis parametrów:
MOTN ON|OF[F] [U=ON]
ON
Aktywuje proces poruszania robotem
OFF
Dezaktywuje proces poruszania robotem
[U=ON]
Aktywuje proces wykrywania przeszkód. Proces ten ma automatycznie zatrzymać robota jeśli zaczyna przejeżdżać przez przeszkodę. Po jego uruchomieniu przestrzeń w kierunku ruchu robota jest nieustannie monitorowana i robot przerywa ruch, jeśli odległość do przeszkody staje się mniejsza niż odległość bezpieczna wynikła z prędkości robota. Dodatkowo, z powodów bezpieczeństwa, ruch jest przerywany jeśli najbliższa przeszkoda, w dowolnym kierunku, znajduje się bliżej niż stała odległość bezpieczeństwa (około 40 cm). Proces detekcji przeszkód spowoduje także, że ruch robota nie zostanie uruchomiony jeśli aktualna odległość od przeszkody jest mniejsza niż wymagana do ukończenia zadanego ruchu.
MOTN FO[RWARD]|BA[CKWARD] [D=<odległość>] [V=<prędkość>]
FO/BA
Ruch do przodu (FO) lub do tyłu (BA).
[D=]
Odległość w milimetrach, w zakresie od 0 do 231-1. Domniemana jest nieskończona odległość tzn. robot będzie się poruszał w wyznaczonym kierunku dopóki nie zostanie wysłana komenda MOTN KI, lub nie zostanie zatrzymany przez proces wykrywania przeszkód.
[V=]
Prędkość w mm/s, może być dowolna z zakresu od 25 do 800, jakkolwiek podczas procesu konwersji odległości na cykle ruchu, tylko wielokrotności 25 są wartościami znaczącymi, stąd podana wartość może być zaokrąglona. Domniemaną wartością jest 100 mm/s.
MOTN LE[FT]|RI[GHT] [A=<kąt>] {V=<prędkość>]
LE/RI
Obracaj w lewo (LE) lub w prawo (RI).
[A=]
Kątowa odległość w stopniach. Domniemana odległość jest odległością nieskończoną, czyli rotacja robota może zostać zatrzymana przez komendę MOTN KI lub przez proces wykrywania przeszkód.
MOTN KI[LL]|WA[IT]
KI
Przerwij (zakończ) aktualnie wykonywany ruch. Ruch nie kończy się natychmiastowo, istnieje faza zwalniania aby zabezpieczyć się przed nagłym zatrzymaniem urządzenia.
WA
Poczekaj na koniec aktualnie wykonywanego ruchu. Przełącznik ten został umieszczony, aby móc synchronizować poszczególne ruchy w programach aplikacyjnych. Jest on potrzebny gdyż polecenie MOTN nie układa kolejnych ruchów w kolejkę. Zastosowanie tego przełącznika spowoduje nie akceptowanie kolejnego ruchu dopóki aktualnie wykonywany się nie zakończy.
MOTN ST[ATUS] [O=<wyjście>]
ST
Podaj aktualny stan wykonywania ruchu. Odpowiedź robota jest postaci:
<status> <odległość>
gdzie <status> jest znacznikiem stanu ruchu, a <odległość> jest odległością przebytą od rozpoczęcia ruchu. Znacznik stanu ruchu może przybierać dwie wartości: 1 gdy odbywa się ruch i 0 gdy robot jest gotowy do przyjęcia następnego ruchu.
[O=]
Powoduje przeniesienie danych stanu ruchu do bufora wyjściowego. Dane o stanie ruchu będą zapamiętywane jako liczby typu long integer od podanego adresu w pamięci robota, warunek: adres musi być podany w postaci heksadecymalnej.
Przykłady
Polecenie wykonania ruchu o 5 metrów do przodu z prędkością 200 mm/s.
Robuter>motn fo d=5000 v=200
Polecenie wykonania obrotu o 180 stopni w prawo z prędkością 10 stopni/s (prędkość jest wartością domniemaną ).
Robuter>motn ri a=180
Kody błędów:
ANGL Kątowa odległość jest spoza dopuszczalnego zakresu.
DIST Odległość jest spoza zakresu.
PARM Błędny parametr.
VELY Prędkość jest z poza dopuszczalnego zakresu.
JSON Aktywny jest proces obsługi Joystick'a.
OBST Przeszkoda znajduje się na żądanym torze ruchu robota.
MOFF Proces wykonywania ruchu jest nie aktywny.
MOVE Robot się porusza - nie może przyjąć kolejnego ruchu.
SERV Pętla sterowania aktywna - nie można aktywować procesu wykonywania ruchu.
Instrukcja MOTV
Polecenie MOTV jest kolejnym sposobem sterowania robotem. Opiera się on o sterowanie za pomocą kontrolowania prędkości. Z tego też względu można poruszać robotem płynnie łącząc podstawowe ruchy, takie jak proste linie, okręgi czy proste rotacje. Dla każdego elementarnego ruchu mogą być odpowiednio zdefiniowane: liniowa i kątowa prędkość, a także liniowe i kątowe przyspieszenie. MOTV wykonuje kolejne ruchy płynnie zmieniając prędkości. Inne parametry takie jak: odległość, kąt lub czas wykonywania ruchu, pozwalają określić warunki końcowe każdego elementarnego ruchu. Polecenie MOTV może być także łatwo konsolidowane z zewnętrznymi czujnikami i Joystick-iem. Dodatkowo może wyznaczać parametry ruchu robota po klotoidzie.
Uwaga:
Nigdy nie używać poleceń SERV, MOVE i MOTN gdy proces MOTV jest włączony (ON).
Składnia:
Włączanie/Wyłączanie procesu
MOTV ON|OF
Dodawanie, uruchamianie ruchu
MOTV AD|LA [V=<liniowa prędkość>]|[V+]|[V-]
[W=<kątowa prędkość>]|[W+]|[W-]
[D=<odległość>]|[A=<kąt>]|[T=<czas>]|[IN]|[X=<odległość>]
[L=<liniowe przyspieszenie>]|[L+]
[K=<kątowe przyspieszenie>]|[K+]
Zmiana aktualnego ruchu
MOTV CH [V=<liniowa prędkość>]|[V+]|[V-]
[W=<kątowa prędkość>]|[W+]|[W-}
[L=<liniowe przyspieszenie>]|[L+]
[K=<kątowe przyspieszenie>]|[K+]
Uaktualnienie odległości od zewnętrznego czujnika
MOTV SX X=<odległość>
Przerywanie ruchu
MOTV KI [L=<liniowe przyspieszenie>]|[L+]
[K=<kątowe przyspieszenie>]|[K+]
Czyszczenie kolejki
MOTV RS
Kolejka ruchów
MOTV MS
Rozmiar kolejki
MOTV NS [O=<wyjście>]
Status
MOTV ST [O=<wyjście>]
Zwięzły status
MOTV SL [O=<wyjście>]
Pozycja ruchu
MOTV MP
Ograniczenie liniowej prędkości
MOTV VL J=<identyfikator>
[V=<liniowa prędkość>]
[L=<liniowe przyspieszenie>]|[L+]|[D=<odległość>]|[T=<czas>]
Ograniczenie kątowej prędkości
MOTV WL J=<identyfikator>
[W=<kątowa prędkość>]
[K=<kątowe przyspieszenie>]|[K+]|[A=<kąt>]|[T=<czas>]
Pobierz znacznik
MOTV GT N=<nazwa> [O=<wyjscie>]
Skasuj znacznik
MOTV DT J=<znacznik>
Clothoid
MOTV CL V=<liniowa prędkość>|V+
A=<kąt>
K=<kątowa prędkość>
[O=<wyjście>]
Tryb joystick-a
MOTV JK CH [V=<1_prędkość>][L=<1_przyspieszenie>][W=<a_prędkość>]
[K=<a_przyspieszenie>][J=<adres>][R=<promien>][C=<środek>]
Zmiana parametrów joystick-a
MOTV JK ON Uruchom poruszanie z wykorzystaniem joystick-a
MOTV JK OFF Zatrzymaj poruszanie z wykorzystaniem joystick-a
MOTV JK PP Drukuj parametry dla konwersji danych z joystick-a
MOTV OFF Zakończ podprogram wykonywania ruchu
MOTV ON [M.=<adress>] wystartuj podprogram wykonywania ruchu
Parametry:
Włączanie/Wyłączanie procesu
MOTV ON|OF
ON
Uruchamia podprogram wykonywania ruchu. Poza poleceniem MOTV CL, żadna inna komenda nie może być wykonana jeśli proces nie został uruchomiony.
[M=]
można podać adres (heksadecymalna postać) określający miejsce w pamięci gdzie mają zostać przepisywane aktualne parametry ruchu robota
(liczby long int):
(ad) czas; czas systemowy ostatniej modyfikacji
(ad+4) liniowa prędkość w mm/s
(ad+8) kątowa prędkość w mrad/s
OF
Zatrzymuje podprogram wykonywania ruchu. Ta komenda będzie odrzucana jeśli robot wciąż wykonuje ruch.
Dodawanie, uruchamianie ruchu
MOTV AD|LA [V=<liniowa prędkość>]|[V+]|[V-]
[W=<kątowa prędkość>]|[W+]|[W-]
[D=<odległość>]|[A=<kąt>]|[T=<czas>]|[IN]|[X=<odległość>]
[L=<liniowe przyspieszenie>]|[L+]
[K=<kątowe przyspieszenie>]|[K+]
AD
(add motion) Dodaj do kolejki ruchów kolejny elementarny ruch opisany przez parametry V,W... W kolejce może być do 10 ruchów, są one wykonywane po kolei. Zakończenie jednego ruchu powoduje rozpoczęcie wykonywania kolejnego. Ruchy do kolejki mogą być dodawane nawet wtedy gdy robot się porusza. Gdy tylko ruch się zakończy odpowiednia komenda jest usuwana z kolejki. Jeżeli parametry ruchu nie zostały podane, do kolejki dodawany jest domniemany ruch (torem ruchu jest linia prosta, naprzód, z prędkością 100 mm/s). Aby uruchomić wykonanie ruchów ustawionych w kolejce, należy wysłać do robota komendę MOTV LA.
LA
(launch motion) Wywołana bez parametrów uruchamia wszystkie ruchy zgromadzone w kolejce sekwencyjnie, w kolejności pojawiania się w niej. W innym wypadku, MOTV LA uruchamia natychmiast ruch zdefiniowany przez parametry V, W... podane w wywołaniu polecenia. Ruch ten nie jest umieszczany w kolejce. Jeżeli robot się porusza, to aktualnie wykonywany ruch jest przerywany i zastępowany nowym. Po zakończeniu tego nowego ruchu, wykonywane są pozostałe ruchy z kolejki, jednakże ruch przerwany przez polecenie MOTV LA (z parametrami) nie zostanie wznowiony.
[V=]
Liniowa prędkość robota, w mm/s. Jest ona z zakresu <-100.., -50, 0, 50, ..., 1000>. Jeśli podana prędkość jest większa od 0 to robot będzie poruszał się do przodu, jeśli zaś mniejsza to do tyłu. Wartość V+ oznacza prędkość V=1000 (maksymalna prędkość), zaś wartość V- prędkość V=-1000.
[W=]
Kątowa prędkość robota, w mrad/s (miliradianach/sekundę). Dozwolony zakres jest następujący <-1000, -100, 0, 100, ..., 1000>. W+ znaczy W=1000 i podobnie W- znaczy
W=-1000. Na rysunku (Rys. 2) przedstawiono kierunek przemieszczania robota w zależności od znaków V i W.
Przy stałej prędkości, promień koła którym podąża robot opisuje się formułą:
R=V/W
Gdzie: R jest w mm, V w mm/s, a W w mrad/s.
Uwaga: promień koła musi być większy bądź równy 0.4 m. W innym wypadku ruch nie zostanie zaakceptowany i zostanie zwrócony błąd RADI.
Rys. 2 Kierunek ruchu w zależności od znaków parametrów V i W.
[D=]
Odległość w mm. Parametr ten musi być zawarty w przedziale <0, 231-1>. Jeśli podana prędkość liniowa nie jest równa zeru, to długość drogi jest liczona dla punktu położonego na środku osi kół napędowych robota (punkt RC). Jeśli prędkość liniowa jest równa zeru to robot będzie wykonywał jedynie rotację wokół punktu RC, zaś wartość D=... będzie znaczyła drogę pokonywaną przez każde z kół. Kiedy D=.. jest podane nie można używać parametrów A=..., T=..., X=... i przełącznika IN.
[A=]
Kąt w stopniach. Wartość parametru musi być w zakresie <0, 231-1>. Ten parametr może być podawany tylko dla zwykłych rotacji (wokół RC). Kiedy wykorzystujemy przełącznik A=..., parametry D=..., T=..., X=... i IN nie mogą być użyte.
[IN]
Nieskończony ruch. Robot wykonuje podany ruch dopóki nie zostanie podany nowy za pomocą polecenia MOTV LA ..., lub zostanie zatrzymany przez polecenie MOTV KI. Gdy wykorzystujemy parametr IN, parametry D=..., A=..., X=... i T=... nie są dozwolone.
[X=]
Odległość w mm, dozwolony zakres <0, 231-1>. X znaczy to samo co D=..., i określa drogę do przebycia. Gdy używamy parametrów D=..., A=... i T=..., proces MOTV uaktualnia wewnętrzne zmienne. Kiedy wykorzystujemy parametr X=..., zewnętrzny czujnik (poprzez system operacyjny robota) musi uaktualniać osiągniętą przez robota pozycję podczas ruchu za pomocą komendy:
MOTV SX X = pokonany_dystans
Parametr X= może być więc wykorzystany do śledzenia ruchu robota wykonującego ruch po prostych za pomocą zewnętrznych czujników. Gdy wykorzystujemy parametr X=..., parametry D=..., A=..., T=... i IN nie są dozwolone.
[L=]
Liniowe przyspieszenie, w mm/s2. Wartości dopuszczalne leżą w zakresie <1, 900>. Liniowa prędkość robota dana jest wzorem:
V = L * t + V0
Gdzie: V jest aktualną prędkością, L jest liniowym przyspieszeniem i V0 początkową prędkością robota (prędkością w momencie wywoływania komendy). MOTV wyznacz znak L podczas ruchu. L+ znaczy L=900, a wartością domniemaną jest L=500.
[K=]
Kątowe przyspieszenie, w mrad/s2. Wartości dopuszczalne <1, 900>. Kątowa prędkość jest dana wzorem:
W = K * t + W0
Gdzie: W jest aktualną kątową prędkością, K jest kątowym przyspieszeniem i W0 początkową prędkością robota (w momencie wywoływania komendy). MOTV proces wyznacza znak K podczas ruchu. K+ znaczy K=900, a domniemaną kątową prędkością jest 500 mrad/s2.
Zmiana aktualnego ruchu
MOTV CH [V=<liniowa prędkość>]|[V+]|[V-]
[W=<kątowa prędkość>]|[W+]|[W-}
[L=<liniowe przyspieszenie>]|[L+]
[K=<kątowe przyspieszenie>]|[K+]
CH
(change motion) Ta funkcja pozwala zmodyfikować aktualny ruch, podczas gdy robot się porusza. Parametry które można zmienić to:
[V=] liniowa prędkość
[L=] liniowe przyspieszenie
[W=] kątowa prędkość
[K=] kątowe przyspieszenie
Opis tych parametrów jest dostępny podczas omawiania komendy MOTV AD|LA.
Uaktualnienie odległości od zewnętrznego czujnika
MOTV SX X=<odległość>
SX
Gdy wykorzystujemy parametr X rozkazu MOTV AD|LA, ta funkcja jest potrzebna aby uaktualniać odległość pokonaną przez robota, od rozpoczęcia ruchu.
Przerywanie ruchu
MOTV KI [L=<liniowe przyspieszenie>]|[L+]
[K=<kątowe przyspieszenie>]|[K+]
KI
(kill motion) MOTV KI pozwala przerwać aktualny ruch. Kiedy zostanie wykonywana robot automatycznie zaczyna fazę zwalniania aby zatrzymać robota łagodnie. Jeśli inne ruchy oczekują w kolejce na wykonanie to nie zostają one rozpoczęte. Aczkolwiek są one utrzymywane w kolejce i mogą być wystartowane przez komendę MOTV LA. Parametry L=... i K=... mogą być zastosowane aby zdefiniować liniowe i kątowe opóźnienia (patrz MOTV AD|LA aby zobaczyć ich opis).
Czyszczenie kolejki
MOTV RS
RS
(reset queue) MOTV RS wykorzystuje się aby opróżnić kolejkę oczekujących ruchów. Komenda ta nie zostanie przyjęta jeśli robot jest w ruchu.
Kolejka ruchów
MOTV MS
MS
Komenda ta wyświetla ruchy aktualnie dostępne w kolejce.
Rozmiar kolejki
MOTV NS [O=<wyjście>]
NS
Podaje ilość ruchów będących wciąż w kolejce (oczekujących na wykonanie).
[O=]
Zwraca ilość ruchów jako long integer i umieszcza ją pod wskazanym adresem (HEX) w pamięci robota.
Status
MOTV ST [O=<wyjście>]
ST
(status) Wyświetla status funkcji MOTV.
STATUS sekcja statusu mówi co aktualnie robi robot:
-READY robot oczekuje na nowe ruchy
-MOTION robot porusza się
M= podaje który ruch jest aktualnie wykonywany. Jeśli M.=0, robot oczekuje na nowe ruchy.
PHASE podaje fazę ruchu (przyspieszanie, opóźnianie, stała prędkość).
Dopuszczalne fazy to:
-STOP: robot się nie rusza
-START: robot zaczyna wykonywać ruch. W tej fazie robot nigdy nie pozostaje dłużej niż 10ms, w związku z tym komunikat ten rzadko będzie widoczny.
-ACCEL: robot jest w fazie przyspieszania, aby osiągnąć zadaną prędkość
-CONST: robot porusza się ze stałą prędkością
-CHANGE: robot przechodzi do wykonania następnego ruchu
-DECEL: robot jest w fazie hamowania
-END: robot wykonuje ostatni odcinek ruchu przed zatrzymaniem
-KILL: aktualny ruch został wstrzymany i robot wykonuje fazę hamowania. Jeśli występuje ta faza to nie ma fazy END
TOKEN podaje czy jest limitowana prędkość maksymalna (patrz MOTV VL). Jeśli identyfikator (token) jest :NONE to ruch nie ma limitowanych dodatkowo prędkości, w przeciwnym wypadku prędkość jest ograniczana i podana zostaje podana nazwa procesu ograniczającego prędkość.
Inne wyświetlane parametry to:
a= kąt o jaki robot się obrócił od rozpoczęcia aktualnego ruchu (w stopniach)
d= odległość pokonana od rozpoczęcia ruchu przez punkt RC (środek osi robota pomiędzy kołami napędowymi)
v= aktualna prędkość liniowa (mm/s)
w= aktualna kątowa prędkość (mrad/s)
l= aktualne liniowe przyspieszenie robota (mm/s2)
k= aktualne przyspieszenie kątowe robota (mrad/s2)
[O=]
jeśli zostanie podany (adres w formie heksadecymalnej), dane są zapisywane w pamięci robota zgodnie z podanym schematem (gdzie adres bazowy oznaczamy ad):
(ad) 0=READY
1=MOTION
(ad+4) zawarty tutaj jest numer kroku aktualnie wykonywanego
(ad+8) 0=START
1=STOP
2=ACCEL
3=CONST
4=CHANGE
5=DECEL
6=END
7=KILL
(ad+12) cztery litery (ASCII) identyfikator (TOKEN) procesu kontrolującego prędkość.
(ad+16) aktualna prędkość liniowa
(ad+20) aktualna prędkość kątowa
(ad+24) odległość w mm pokonana przez robota. W przypadku czystych rotacji, zawiera kąt w stopniach.
(ad+28) aktualne przyspieszenie liniowe, w mm/s2
(ad+32) aktualne przyspieszenie kątowe, w mm/s2
Zwięzły status
MOTV SL [O=<wyjście>]
SL
(compact status). Zwraca jedną linię statusu. Dane są w formie heksadecymalnej.
Bit 0: =0 nie ma ograniczeń prędkości
=1 prędkość jest ograniczona przez proces
Bit 1: =0 kątowa prędkość jest równa 0
=1 kątowa prędkość jest różna od 0
Bit 2: =0 liniowa prędkość jest równa 0
=1 liniowa prędkość jest różna od 0
Bit 5, 4, 3: wskazuje aktualny stan ruchu
000 START
001 STOP
010 ACCEL
011 CONST
100 CHANGE
101 DECEL
110 END
111 KILL
Bit 6: stan robota
=0 READY
=1 MOTION
Bity 31 do 37: zawiera odległość w mm pokonaną przez robota od rozpoczęcia wykonywania ostatniego ruchu. W wypadku czystej rotacji, zawiera kąt w stopniach.
[O=]
jeśli przełącznik został podany wraz z heksadecymalnym adresem to zwięzły status zostanie umieszczony w pamięci robota.
Pozycja ruchu
MOTV MP
MP
(motion position) MOTV MP zwraca dla ostatnich 10 kroków, następującą informację:
odległość pokonaną przez robota od rozpoczęcia ruchu (w mm). W wypadku zwykłej rotacji jest to odległość pokonywana przez każde z kół
estymowana pozycja X, na końcu ruchu (wewnętrzny układ wyznaczania pozycji)
estymowana pozycja Y, na końcu ruchu
estymowana orientacja θ robota na końcu ruchu
Obszar pamięci gdzie zapisywane są te wartości jest czyszczony za każdym razem gdy wykonywane jest polecenie MOTV LA (z parametrami lub bez), w wypadku gdy robot oczekuje na nowe ruchy (STATUS==READY).
Ograniczenie liniowej prędkości
MOTV VL J=<identyfikator>
[V=<liniowa prędkość>]
[L=<liniowe przyspieszenie>]|[L+]|[D=<odległość>]|[T=<czas>]
VL
(linear velocity limitation) MOTV VL pozwala programowi użytkownika na ograniczenie liniowej prędkości robota podczas ruchu. W takich przypadkach, proces MOTV stara się utrzymać podaną ścieżkę. Gdy to jest koło, parametr W (kątowa prędkość) jest wewnętrznie poprawiany, według wzoru:
ograniczone_W = nieograniczone_W * ograniczone_V / nieograniczone_V
Parametr W jest jedynym który może byś zmieniany automatycznie.
MOT VL zapisuje do wewnętrznej tablicy maksymalną liniową prędkość (V=...) wyznaczoną przez program dający się określić przez identyfikator (J=..., patrz MOTV GT). Co 40ms, proces MOTV czyta tablicę i wyznacza najniższą prędkość, która jest potem wybierana na górne ograniczenie prędkości robota.
J=
Identyfikuje program wywołujący polecenie.
[V=]
najwyższa możliwa prędkość wyznaczająca górne ograniczenie, podana w mm/s. Dostępny zakres tego parametru to <0, ..., 1000>. Wartością domyślną jest V=1000. Jeśli V jest mniejsze niż 50, to przyjmuje się, że została podana prędkość V=0.
[L=], [D=], [T=]
mogą być wykorzystane aby zdefiniować liniowe przyspieszenie, aby uzyskać nową górną liniową prędkość.
[L=] liniowe przyspieszenie, w mm/s2. Zakres parametru to <1, 900>. L+ znaczy L=900. Gdy stosujemy parametr L=..., parametry D=... i T=... nie mogą zostać wykorzystane.
[D=] maksymalna droga, aby uzyskać nową prędkość, w mm, w zakresie <1, 231-1>. Parametr ten powoduje, że w aktualnej prędkości robota i wartości D=... wyznacza się liniowe przyspieszenie. Z parametrem D=... nie mogą być użyte parametry L=... i T=...
[T=] maksymalny czas na uzyskanie nowej prędkości. 1 jednostka jest równa 10ms, zakres parametru <1, 231-1>. MOTV proces wyznacza nową wartość przyspieszenia na podstawie aktualnej prędkości robota i wartości parametru T=... Gdy parametr T=... jest zdefiniowany parametry L=... i D=... nie mogą być wykorzystane.
Należy zaznaczyć że tak jak jest ograniczana maksymalna prędkość tak jest i ograniczane maksymalne przyspieszenie (jeśli wykorzystamy wyszczególnione wyżej parametry).
Ograniczenie kątowej prędkości
MOTV WL J=<identyfikator>
[W=<kątowa prędkość>]
[K=<kątowe przyspieszenie>]|[K+]|[A=<kąt>]|[T=<czas>]
WL
(ograniczenie prędkości kątowej) MOTV WL pozwala programowi użytkownika na ograniczanie prędkości kątowej robota podczas ruchu. W takich przypadkach, proces MOTV próbuje utrzymać podaną ścieżkę. W przypadku koła jest modyfikowany parametr V... (liniowa prędkość). MOTV WL wyznacza maksymalną dozwoloną prędkość kątową tak jak MOTV VL. W wypadku gdy obie prędkości są ograniczone (liniowa i kątowa) proces MOTV wybiera tą ograniczoną bardziej.
J=
Identyfikuje program wywołujący polecenie.
[W=]
Wskazuje żądaną maksymalną wartość kątowej prędkości wykorzystanej jako górna granica w mrad/s. Jej wartość jest z zakresu <0, ..., 1000>, a wartością domniemaną jest W=1000. Jeśli W jest mniejsze niż 100, to przyjmowane za W jest W=0.
[K=], [A=], [T=]
mogą być wykorzystane aby zdefiniować minimalne kątowe przyspieszenie, aby zyskać nową kątową prędkość. Jeśli nic nie zostanie podane przyjmowana jest wartość 500 mrad/s2.
[K=] kątowe przyspieszenie, w mrad/s2. Jego zakres jest <1,900>. K+ znaczy K=900. Gdy wykorzystujemy K=..., nie możemy używać A=... i T=...
[A=] maksymalna droga kątowa na której powinniśmy uzyskać nową prędkość. Podaje się ją w stopniach, w zakresie <1, 231-1]. Proces MOTV wyznacza nowe przyspieszenie z aktualnej prędkości kątowej i wartości parametru A=... Z parametrem A=.. nie wolno wykorzystywać parametrów K=.. i T=...
[T=...] maksymalny czas aby uzyskać nową wartość prędkości. 1 jednostka to 10ms, zakres dozwolonych czasów <1, 231-1>. Przyspieszenie jest wyznaczane od aktualnej prędkości. Z tym parametrem nie mogą być użyte parametry K=... i A=...
Tak jak w przypadku kontroli prędkości MOTV przegląda wewnętrzną tablicę co 40 ms aby określić największe możliwe przyspieszenie. Gdy je znajdzie wykorzystuje je jako nowe przyspieszenie jeśli okazuje się że jest ono większe niż te podane przy zadawaniu ruchu.
Pobierz znacznik
MOTV GT N=<nazwa> [O=<wyjscie>]
GT
(get token) Przed wykorzystaniem komend MOTV VL i MOTV WL, jakikolwiek program użytkownika musi pobrać znacznik. Dokonuje tego przez podanie swojej nazwy (4 litery lub cyfry). Program użytkownika jest wtedy wykorzystywany do kontrolowania maksymalnej prędkości robota. Ta właściwość jest szczególnie dobrze dostosowana do współpracy z czujnikami, takimi jak czujniki sonarowe. Dwa programy kontrolujące prędkość robota nie mogą mieć takich samych nazw. Nazwa może być wykorzystana aby zidentyfikować program, który aktualnie ogranicza prędkość ruchu robota (patrz polecenie MOTV ST). MOTV GT zwraca ilość wykorzystanych znaczników, tzn. takich które mogą być wykorzystane przez MOTV VL i WL. Możliwe jest zdefiniowanie do 10 znaczników od 0 do 9 (tyle jest dostępnych w systemie).
[O=]
pozwala zapisać ilość wykorzystanych znaczników w pamięci robota jako (long int) pod podanym adresem (w heksadecymalnej formie).
Skasuj znacznik
MOTV DT J=<znacznik>
DT
(delete token) Zwalnia podany znacznik gdy program użytkownika już go nie potrzebuje, nie będzie wykorzystywał komend MOTV VL i WL. Zwolniony znacznik może być wykorzystany przez inny program.
Klotoida
MOTV CL V=<liniowa prędkość>|V+]
A=<kąt>
K=<kątowa prędkość>
[O=<wyjście>]
UWAGA: Ta komenda może być wykonywana przez okres czasu większy niż 10 ms
CL
(klotoida) MOTV CL wylicza parametry 2 pół-klotoid wykorzystywanych, aby zmienić kierunek ruchu robota. Należy jednak zaznaczyć, że RobuterTM nie może podążać w pełni klotoidalnym torem.
V=
Wyznacza prędkość robota w momencie rozpoczynania pierwszej klotoidy. Tor ruchu poprzedzający klotoidę musi być linią prostą, prędkość robota zaś musi być taka sama jak wyspecyfikowana dla klotoidy. Prędkość musi być z zakresu <-1000, ..., -50, 50, ..., 1000>.
A=
Definiuje docelowy kąt o jaki ma się obrócić robot, w stopniach. Zakres <0, 180>.
K=
Określa kątowe przyspieszenie, w mrad/s2, może to być dowolna wartość z zakresu <1, 900>.
MOTV CL zwraca czas t (1 jednostka to 10ms), który jest czasem trwania pół-klotoidy, odległości X i Y oraz drogę s pokonywaną przez punkt RC robota. Parametry klotoidy wyjaśniono na rysunku:
Rys. 3. Parametry klotoidy.
PRZYKŁAD:
Aby wykonać obrót o 60 stopni, z prędkością liniową 300 mm/s i kątowym przyspieszeniem 45 mrad/s2, następująca komenda musi zostać wprowadzona:
Robuter>motv cl v=300 a=60 k=45
Zwróci ona następujące dane:
W=214
T=119
X=1471
Y=243
S=1369
Na podstawie tych danych aby wykonać zamierzony skręt następujące instrukcje muszą zostać wywołane:
Robuter>motv ad v=300 d=2000-1471=529
Robuter>motv ad v=300 w=-214 t=119 k=45
Robuter>motv ad v=300 w=0 t=119 k=45
Robuter>motv ad v=300 d=2500-1471=1029
Odnośnie W poleca się wykorzystywać wartość nieco większą niż ta która została wyliczona. Jesteśmy wtedy pewni, że nie zostanie ona osiągnięta co ustrzeże nas przed uzyskaniem wycinku koła, a nie klotoidy.
[O=]
jeśli podamy łącznie z adresem (forma heksadecymalna) to wyliczone parametry zostaną umieszczone w pamięci robota. Struktura tych danych jest następująca (wszystkie dane typu long int):
(ad) W, w mrad/s
(ad+4) czas T
(ad+8) X, w mm
(ad+12) Y, w mm
(ad+16) s, w mm
Tryb joystick-a
MOTV JK CH [V=<1_prędkość>][L=<1_przyspieszenie>][W=<a_prędkość>] [K=<a_przyspieszenie>][J=<adres>][R=<promien>][C=<środek>] Zmiana parametrów joystick-a
MOTV JK ON Uruchom poruszanie z wykorzystaniem joystick-a
MOTV JK OFF Zatrzymaj poruszanie z wykorzystaniem joystick-a
MOTV JK PP Drukuj parametry dla konwersji danych z joystick-a
MOTV OFF Zakończ podprogram wykonywania ruchu
MOTV ON [M.=<adress>]
wystartuj podprogram wykonywania ruchu
OPIS:
Komenda MOTV jest aktualnie dostosowana do przyjmowania parametrów ruchu robota z interfejsu joystick'a. Parametry ruchu przyjmowane są przez interfejs analogowo-cyfrowy i przetwarzane na dane dla instrukcji MOTV. Istnieje możliwość zmodyfikowania parametrów wejścia analogowego tak, aby można było zastosować inny joystick niż ten, który oferuje firma produkująca robota. Także parametry konwersji danych z przetwornika na polecenia MOTV mogą być częściowo modyfikowane. Ogólny sposób konwersji został przedstawiony na rysunkach.
Rys. 4. Definicja liniowych i kątowych parametrów zależności prędkości od wychylenia.
Rys. 5. Definicja parametrów zależności promienia łuku od wychylenia.
JK CH
Zmiana domniemanych parametrów dla joystick'a
[J=]
heksadecymalny numer który określa adres, pod którym będą umieszczane dane określające wyjście z joystick'a. Zapamiętywana struktura składa się z dwóch liczb typu short.
[K=]
liczba dziesiętna określająca kątowe przyspieszenie [mrad/s2]
[W=]
zestaw 4 parametrów oddzielonych przecinkami. Opisują one konwersję danych z joystick'a na kątowe prędkości. Pierwsze dwa określają najniższą prędkość dla danego wyjścia z joystick'a. Ostatnie dwa określają zaś najwyższą prędkość. Każda dwójka parametrów składa się z liczby heksadecymalnej opisującej względną wartość odchylenia joystick'a od środka i wartości dziesiętnej określającej prędkość.
[C=]
zestaw 2 heksadecymalnych wartości które opisują pozycję X i Y joystick'a gdy jest on w pozycji centralnej.
[L=]
liczba dziesiętna opisująca wartość liniowego przyspieszenia.
[V=]
zestaw 4 parametrów oddzielonych przecinkami. Definiuję one konwersję danych z joystick'a na prędkość liniową. Pierwsze dwa parametry określają najniższą prędkość dla danego ustawienia joystick'a. Ostatnie dwa prędkość najwyższą. Para jest tworzona z liczby heksadecymalnej opisującej względną pozycję joystick'a od środka i liczby dziesiętnej opisującej prędkość.
[R=]
zestaw 4 parametrów oddzielonych przecinkami. Definiuję one konwersję danych z joystick'a na kąt. Pierwsze dwa parametry określają największy kąt dla danego ustawienia joystick'a. Ostatnie dwa kąt najmniejszy. Para jest tworzona z liczby heksadecymalnej opisującej względną pozycję joystick'a od środka i liczby dziesiętnej opisującej kąt.
JK OFF
wyłącz poruszanie robotem za pomocą joystick'a.
JK ON
włącz poruszanie robotem za pomocą joystick'a.
JK PP
drukuj parametry sterowania joystick'iem
KODY BŁĘDÓW POLECENIA MOTV
PARM Błędny parametr
LVEL Prędkość liniowa spoza zakresu
AVEL Prędkość kątowa spoza zakresu
DIST Odległość spoza zakresu
ANGL Kątowa odległość spoza zakresu
TIME Czas spoza zakresu
LACC Liniowe przyspieszenie spoza zakresu
AACC Kątowe przyspieszenie spoza zakresu
TOKE Znacznik spoza zakresu, lub nie istnieje
NOTO Nie ma więcej znaczników
NAEX Nazwa już istnieje
VELI Ograniczenie prędkości spoza zakresu
MOVE Robot się porusza
MOFF Nie aktywny podprogram poruszania robotem
FUST Kolejka ruchów jest pełna
EMST Kolejka ruchów jest pusta
RADI Kąt spoza zakresu
JKON Joystick jest w użyciu
SERV Pętla kontroli ruchu aktywna. Nie można aktywować podprogramu MOTV
Instrukcje procesu określania pozycji
Instrukcje te pozwalają skonfigurować i uruchomić proces określania pozycji robota w zewnętrznych, kartezjańskich współrzędnych.
System odometrii Robuter-a został zaprojektowany tak, aby jak najdokładniej określać pozycję robota w kartezjańskim układzie współrzędnych. Pozycja ta jest określana za pomocą trzech współrzędnych (x, y, θ) gdzie x i y określają pozycję robota, zaś kąt θ określa orientację robota w odniesieniu do osi OX.
Estymowana pozycja robota odnosi się do jego punktu odniesienia, umieszczonego na środku osi napędowej robota. Rysunek pokazuje zorientowanie układu współrzędnych w stosunku do punktu odniesienia.
System odometrii wykorzystuje arytmetykę zmiennopozycyjną o rozszerzonej precyzji, umożliwia to osiągnięcie wysokiej dokładności obliczeń. Niestety takie rozwiązanie powoduje zwiększone obciążenie procesora robota, dlatego też proces wyznaczania pozycji może być dostosowywany do potrzeb wymaganej dokładności przez zmianę okresu próbkowania pozycji. Może to być konieczne jeśli system operacyjny robota jest mocno obciążony wieloma równolegle wykonywanymi procesami.
Rys. 6. Orientacja układu współrzędnych robota.
Instrukcja ODOM
Rozkaz ODOM pozwala uruchomić i zatrzymać proces odometrii, a także podaje pozycję robota. ODOM podaje aktualną pozycję robota w formacie:
x y θ
dx dy dθ
gdzie: zestaw współrzędnych (x, y, θ) określa pozycję robota zaś trójka (dx, dy, dθ) pozycję robota w stosunku do poprzednio estymowanego punktu. Współrzędne kartezjańskie są podane w metrach zaś kąt w stopniach, patrz rysunek.
Składnia
ODOM
ODOM ON|OFF [P=<okres>]
ODOM O=<wyjście> [D]
Parametry:
ODOM
Wyświetla na standardowym wyjściu aktualną i względną pozycję robota w podanym wyżej formacie.
ODOM ON|OFF [P=<period>]
ON Uruchom proces odometrii
OFF Zatrzymaj proces odometrii
[P=] Okres próbkowania procesu odometrii. Okres musi być podany jako ilość cykli podstawowych (zwykle 10 ms). Domniemana wartość to P=5, czyli 50 ms.
ODOM O=<wyjście> [D]
O= Heksadecymalny adres bufora wyjściowego. Wykorzystanie tej opcji powoduje, że wartości wyjściowe są przesyłane pod podany adres. Wszystkie współrzędne są zapamiętywane jako liczby typu long integer. Współrzędne x i y są wyrażone w milimetrach, a kąt w stopniach.
[D] Zapisz wszystkie wymienione wyżej współrzędne jako wartości typu double (64 bitowe liczby zmienno pozycyjne), jednostki są takie same jak poprzednio.
Kody błędów
ADDR Adres bufora jest nieprawidłowy.
ODON Proces odometrii już był aktywowany.
PARM Błędny parametr.
PERD Nieprawidłowa wartość okresu próbkowania.
Instrukcja ODOS
Komenda ODOS powoduje zastąpienie aktualnej pozycji wyznaczonej przez proces odometrii, pozycją podaną przy wywołaniu polecenia.
Składnia:
ODOS C=<x>, <y>, <θ>
Parametry:
C= Pozycja urządzenia. Współrzędne x i y muszą być podane w milimetrach zaś kąt θ w stopniach. Wszystkie współrzędne muszą być podane jako liczby całkowite.
Kody błędów
PARM Błędny parametr.
Rys. 7. Zastosowanie komend ODOM i ODOS.
Instrukcja ODOF
Komenda ODOF powoduje przesunięcie pozycji wyznaczanej przez proces odometrii o podany wektor.
Składnia:
ODOF C=<dx>, <dy>, <dθ>
Parametry:
C= Offset. Wartości dx i dy muszą być podane w milimetrach, zaś wartość dθ w stopniach. Wszystkie współrzędne muszą być podane jako wartości całkowite.
Komendy przydatne podczas ćwiczeń laboratoryjnych:
odom on - włączenie systemu odometrycznego
motv on - wyłączenie hamulców
Dodawanie ruchów do kolejki (max 10 pozycji):
motv ad v=100 d=500 - ruch do przodu (prędkość 100mm/s, odległość 500mm)
motv ad v=0 w=100 a=90 - rotacja o 90
wykonanie kolejki:
motv la
Podsumowanie
Podłączenie: przez RS (TxD, RxD i GND). Parametry transmisji:
Baud: 9600, 8 bitów danych, brak parzystości, 1 bit stopu, brak sterowania przepływem.
Po resecie systemu Robuter wysyła przez linię zgłoszenie się systemu operacyjnego czasu rzeczywistego: Albatros. Następnie pojawia się linia poleceń. Wpisanie znaku powoduje wyświetlenie go na ekranie Hyper Terminala, czyli zostaje on odesłany. Linia poleceń wygląda tak:
Ro13 6.0>
System nie rozróżnia wielkich i małych liter, więc można wpisywać dowolnie.
Podstawowe komendy:
ODOM ON - powinno się wpisać na początku pracy.
MOTV ON - odblokowanie kół. Dopiero potem można jeździć.
Poniższe komendy nie spowodują bezpośrednio ruchu. Zapisywane są na kolejkę ruchów i wykonywane będą dopiero po starcie wykonywania tej kolejki.
MOTV AD V=100 D=200 - jazda do przodu (znak V) na odległość 200mm. V to prędkość w [mm/s]
MOTV AD V=-100 D=200 - jazda w tył
MOTV AD V=0 W=-100 A=30 - obrót w miejscu w prawo o kąt A [o] z prędkością W=-100 mrad/s
Wykonanie sekwencji ruchów odbywa się po wpisaniu komendy:
MOTV LA
Natychmiastowe wykonanie ruchu:
MOTV LA V=300 D=200
Komenda MOTV NS powoduje wyświetlenie liczby mówiącej ile ruchów zostało jeszcze do wykonania z sekwencji. Można to wpisywać w dowolnym momencie (podczas jazdy także).
Wyjście (zakończenie):
MOTV OFF
ODOM OFF
Dodatkowe komendy:
MOTV RS - kasuje kolejkę ruchów
MOTV KI - kasuje kolejkę i przerywa natychmiast wykonywany ruch (coś jak stop awaryjny). Nie następuje blokada kół i robot jedzie swoim pędem.
Wstęp
Strona 1
Opis robota mobilnego • Ogólna charakterystyka
Opis robota mobilnego • Koncepcja sterowania
Opis robota mobilnego • Koncepcja sterowania
Opis robota mobilnego • Język robota • Instrukcje warstwy niższej
Opis robota mobilnego • Język robota • Instrukcje warstwy niższej • Instrukcja SERV
Opis robota mobilnego • Język robota • Instrukcje warstwy niższej • Instrukcja SERV
Opis robota mobilnego • Język robota • Instrukcje warstwy niższej • Instrukcja POS
Opis robota mobilnego • Język robota • Instrukcje warstwy niższej • Instrukcja MOVE
Opis robota mobilnego • Język robota • Instrukcje warstwy niższej • Instrukcja MOVE
Opis robota mobilnego • Język robota • Instrukcje warstwy wyższej sterujące ruchem robota • Instrukcja MOTN
Opis robota mobilnego • Język robota • Instrukcje warstwy wyższej sterujące ruchem robota • Instrukcja MOTN
Opis robota mobilnego • Język robota • Instrukcje warstwy wyższej sterujące ruchem robota • Instrukcja MOTV
Opis robota mobilnego • Język robota • Instrukcje warstwy wyższej sterujące ruchem robota • Instrukcja MOTV
Opis robota mobilnego • Język robota • Instrukcje procesu określania pozycji
Opis robota mobilnego • Język robota • Instrukcje procesu określania pozycji • Instrukcja ODOM
Opis robota mobilnego • Język robota • Instrukcje procesu określania pozycji • Instrukcja ODOF
Laboratorium