Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie Wydział Informatyki, Elektroniki i Telekomunikacji Katedra Informatyki Projekt inżynierski Algorytmy sterowania robotem mobilnym w technologii Erlang Dokumentacja użytkownika Piotr Anielski, Bogna Błaszczyk Opiekun: dr inż. Wojciech Turek Kraków 2013
OŚWIADCZENIE AUTORÓW PRACY Oświadczamy, świadomi odpowiedzialności karnej za poświadczenie nieprawdy, że niniejszą pracę dyplomową wykonaliśmy osobiście i samodzielnie (w zakresie opisanym we wstępie) i że nie korzystaliśmy ze źródeł innych niż wymienione w pracy................................................................... PODPISY
Spis treści 1 Wstęp 4 1.1 System rocopie................................. 4 1.2 Rzeczywisty robot................................ 4 2 Przygotowanie środowiska 5 2.1 Symulacja.................................... 5 2.1.1 Definicje XML............................. 5 2.2 Robot...................................... 7 3 Instalacja i uruchamianie 8 3.1 Konfiguracja................................... 8 3.2 Uruchamianie.................................. 8 3.2.1 ROBOSS................................ 8 3.2.2 Rzeczywisty robot........................... 9 3.2.3 Aplikacje demonstracyjne....................... 10 4 Zarządzanie uruchomieniami, parametryzacja 11 4.1 Zadawanie trajektorii.............................. 11 4.1.1 Format pliku tekstowego........................ 12 4.1.2 Wygładzanie trasy........................... 12 4.2 Parametry algorytmu.............................. 13 4.3 Wizualizacja wyniku.............................. 14 5 Rocopie logger 15 5.1 Instalacja.................................... 15 5.1.1 Klient.................................. 15 5.1.2 Serwer.................................. 15 5.2 Instrukcja obsługi................................ 16 5.2.1 Klient.................................. 16 5.2.2 Monitor (serwer, GUI)......................... 16 5.2.3 Widok bazy danych........................... 16 5.2.4 Widok realtime............................. 16 5.2.5 Uwagi.................................. 17 3
4 1. Wstęp 1.1. System rocopie System rocopie umożliwia sterowanie robotem mobilnym, który wykonuje przejazd według zadanej trajektorii. Sterowany robot może być rzeczywistym urządzeniem, ale może też być symulowany. Algorytm przejazdu jest parametryzowany, są również dwa tryby zadawania trajektorii oraz opcja jej wygładzenia. Całość jest komponentem napisanym w języku Erlang. W tym języku został udostępniony interfejs programistyczny do zlecania przejazdu zadaną trajektorią. Do dyspozycji użytkownika są również skrypty demonstracyjne uruchamiane z linii poleceń pokazujące przykładowe działanie systemu. W zależności od sterownika system może zostać uruchomiony na maszynie użytkownika lub bezpośrednio na robocie. 1.2. Rzeczywisty robot Robot mobilny jest oparty o zestaw Lynxmotion 4WD1 Rover Kit [6]. Posiada 4 koła napędzane oddzielnie. Został wyposażony w moduł lokalizacyjny StarGazer RS 1.0 firmy HagiSonic [11]. Moduł StarGazer wykorzystuje promieniowanie podczerwone do wyznaczania pozycji robota na podstawie znaczników umieszczonych na suficie laboratorium, w którym testowano robota. Jako urządzenie obsługujące pozostałe komponenty, będące najważniejszym elementem robota mobilnego została użyta platforma PandaBoard [8] wyposażona w procesor ARM Cortex-A9. Rysunek 1: Lynxmotion 4WD1 Rover Kit Rysunek 2: Moduł lokalizacyjny StarGazer RS 1.0 Rysunek 3: Kompletny robot. Na zdjęciu widoczny jest dodatkowo telefon służący jako kamera przednia, a także miernik napięcia baterii
5 2. Przygotowanie środowiska 2.1. Symulacja Środowisko symulacyjne do działania wymaga platformy Microsoft.NET w wersji 3.0 lub wyższej. Wymaganym systemem operacyjnym jest system Windows w wersji 7 lub wyższej. Do uruchamiania aplikacji erlangowych niezbędna jest windowsowa implementacja Erlang/OTP (Open Telecom Platform) w wersji co najmniej R15B [4]. Do kompilacji używany jest program make, więc potrzebny będzie również MinGW razem z MSYS [7] lub Cygwin [3]. Samo środowisko ROBOSS można znaleźć na stronie projektu w serwisie sourceforge.net [9]. 2.1.1. Definicje XML Aby było czym sterować należy zdefiniować środowisko oraz symulowanego robota. Dokładna specyfikacja tych kroków znajduje się w dokumentacji systemu ROBOSS. W projekcie rocopie, symulowany świat składa się z kwadratowej płaszczyzny o boku równym 400 metrów, otoczonej wysokimi ścianami. Jeśi chodzi zaś o robota, składa się z: korpusu Body o wymiarach 0.2032m 0.24765m 0.1m i masie równej 1.2854kg czterech kół (cylindrów) o promieniu równym szerokości i wynoszącym 0.0603 m czterech połączeń typu zawiasowego (hinge) pomiędzy korpusem i kołami
6 RobotCar.xml... <Robot type="robotcar"> <Parts> <Part name="body" position_z="-0.1"> <Mass type="box" size_x="0.2032" size_y="0.24765" size_z="0.1" mass="1.2584"/> <Geoms> <Geom type="box" position_z="0.1" size_x="0.2032" size_y="0.24765" size_z="0.1016" friction="0.02" bouncyness="0"/> </Geoms> </Part> <Part name="leftfrontwheel" position_x="-0.13176" position_y="0.1238" position_z="0"> <Mass type="cylinder" size_x="0.0603" size_y="0.0603" mass="0.1814"/> <Geoms> <Geom type="cylinder" color="00662211" rotation_y="1.5707963267948966192313216916398" size_x="0.0603" size_y="0.0603" friction="3.9" bouncyness="0.2"/> </Geoms> </Part>... </Parts> <Sensors> </Sensors> <Joints> <Joint name="leftfront" part1="body" part2="leftfrontwheel" type="hinge" direction_x="1" direction_y="0" direction_z="0" anchor_x="-0.13176" anchor_y="0.1238" position_z="0"> <Motor const_force="10"/> </Joint>... <Joint name="rightrear" part1="body" part2="rightrearwheel" type="hinge" direction_x="1" direction_y="0" direction_z="0" anchor_x="0.13176" anchor_y="-0.1238" position_z="0"> <Motor const_force="10"/> </Joint> </Joints> </Robot> Pliki zawierające wyżej wymienione definicje znajdują się w katalogu models. W efekcie otrzymano robota przedstawionego na rysunku 4.
7 Rysunek 4: Robot został zdefiniowany w pliku models/robotcar.xml 2.2. Robot Systemem operacyjnym działającym na platformie PandaBoard jest dystrybucja Ubuntu systemu GNU/Linux w wersji 12.04. Platforma znajduje się wewnątrz obudowy robota. Niezbędna jest erlangowa maszyna wirtualna działająca na maszynach z procesorami ARM [4]. Potrzebne jest również oprogramowanie umożliwiające dostęp do lokalizatora oraz silników robota. W tym celu należy przygotować i skompilować aplikację amber. Jest to projekt inżynierski Michała Konarskiego i Konrada Gądka, którego celem jest m.in. oprogramowanie robota i udostępnienie interfejsu do jego komponentów w technologii Erlang. Kod źródłowy aplikacji oraz instrukcję kompilacji i uruchomienia można znaleźć w repozytorium projektu w serwisie github [1]. Główny katalog projektu amber powinien znajdować się na tym samym poziomie, co główny katalog rocopie.
8 3. Instalacja i uruchamianie 3.1. Konfiguracja Przed uruchomieniem aplikacji należy ustawić parametry aplikacji znajdujące się w pliku rocopie.config. Parametry, które należy ustawić to: driver nazwa wybranego sterownika, dopuszczalne wartości to: roboss_driver dla symulacji amber_driver dla rzeczywistego robota robot wymiary robota: track odległość pomiędzy środkami lewego i prawego koła (w metrach) radius promień koła robota (w metrach) (tylko w przypadku symulacji) exec_path ścieżka do pliku.exe aplikacji łączącej się ze środowiskiem symulacji ROBOSS (tylko w przypadku symulacji) interval liczba milisekund, którą odczekuje pomiędzy wysłaniem kolejnych odczytów aplikacja dostarczająca informacje o lokalizacji (tylko w przypadku rzeczywistego robota) Zadawanie trajektorii, parametry algorytmu oraz ich konfiguracja zostały opisane w sekcji 4. 3.2. Uruchamianie 3.2.1. ROBOSS Aby skompilować projekt należy w wybranym shellu (MinGW/Cygwin) przejść do katalogu głównego rocopie i wywołać polecenie: make Jeśli nie dysponujemy źródłami projektu amber i chcemy pracować jedynie z symulacją, należy zbudować projekt poleceniem: make no_amber Uruchomienie należy rozpocząć od startu symulacji. Uzyskuje się to przez uruchomienie aplikacji Kontroler wchodzącej w skład środowiska ROBOSS. Wymaga to wyboru adresu używanego przez symulację, wybrania definicji świata oraz definicji
9 symulowanego robota. Przykładowe używane modele wejściowe znajdują się w katalogu models. Aby uniknąć potencjalnych problemów z nadmiernym obciążeniem procesora i jego wpływów na symulację, należy zaznaczyć opcję simulation timestep -> set timestep directly. Następnym krokiem jest przygotowanie trajektorii oraz parametrów algorytmu (patrz: sekcja 4). Pozostaje tylko uruchomienie skryptu:./run_roboss a robot podąży zadaną trajektorią. Po zakończeniu przejazdu należy zresetować symulację przez kliknięcie przycisku Reset. 3.2.2. Rzeczywisty robot W celu kompilacji projektu należy udać się do głównego katalogu projektu i wywołać polecenie: make Jeśli omyłkowo wywołaliśmy polecenie make no_amber, należy przebudować projekt: make clean make Następnie należy uruchomić aplikację amber. Jej głównym elementem jest mediator, będący serwerem. Można wykonywać wielokrotne zlecenia przejazdu danymi trajektoriami bez jej restartowania. Uruchomienie następuje przez wywołanie polecenia z katalogu głównego projektu amber:./start_amber Następnym krokiem jest przygotowanie trajektorii oraz parametrów algorytmu (patrz: sekcja 4). Pozostaje tylko uruchomienie skryptu:./run_amber a robot podąży zadaną trajektorią.
10 3.2.3. Aplikacje demonstracyjne W katalogu demo znajdują się przygotowane skrypty demonstrujące wybrane cechy systemu. Każdy z nich umieszczony jest w osobnym folderze razem z plikami konfigurującymi jego trajektorię, wizualizację i parametry algorytmu. Pliki te można edytować, żeby poznać wpływ tych czynników na trasę przejazdu. Aby uruchomić każdy ze skryptów, należy wywołać:./nazwa_skryptu To, czy algorytm ma sterować symulacją, czy rzeczywistym robotem zdefiniowane jest w pliku rocopie.config. Skrypty są następujące: demo_lemniscate Demonstracja trasy w kształcie lemniskaty. Trajektoria wejściowa jest dodatkowo wygładzona krzywymi Béziera, a parametry zostały dobrane optymalnie dla trasy przejazdu. demo_sharp Ta trasa charakteryzuje się nie wygładzonymi w żaden sposób ostrymi kątami, które w połączeniu ze zadaniem stosunkowo dużej prędkości liniowej umożliwią zaobserwowanie, jak robot zwalnia na zakrętach. demo_sharp_bend W tym skrypcie trasa pozostaje taka sama, jak w demo_sharp, ale zwiększony został parametr lookahead, przez co pojazd przycina zakręty, skracając trasę i zwiększając promień skrętu. demo_sharp_smoothed Demonstracja operuje na tych samym parametrach, co poprzednie, z wyjątkiem tego, że wygładzona jest za pomocą krzywych Béziera. Można zaobserwować różnicę pomiędzy efektem wygładzenia w tym przypadku oraz w poprzednim. demo_variable_speed Skrypt pokazujący działanie trybu pointswithtime, gdzie razem ze współrzędnymi punktu zadane są czasy docelowe, przez co prędkość zmienia się pomiędzy odcinkami.
11 4. Zarządzanie uruchomieniami, parametryzacja Podstawowym interfejsem udpostępniającym pełną funkcjonalność komponentu jest moduł rocopie udostępniający funkcję uruchamiającą algorytm start/3 oraz zatrzymującą go stop/0. Mając już skonfigurowany sterownik komunikujący się z robotem i jego fizyczne parametry w pliku rocopie.config (zobacz 3.1) można skonfigurować parametry przejazdu, różne dla każdego uruchomienia. Są one definiowane za pomocą argumentów przekazanych do funkcji: rocopie.erl start(trajectoryinput, TrajectoryOptions, AlgParamsInput) gdzie: TrajectoryInput służy do definicji trajektorii i sposobu jej przekazania. Dopuszczalne wartości: {filename, Filename} wczytanie trajektorii z pliku tekstowego o podanej nazwie. Można go podać jako ścieżkę bezwzględną bądź względną wobec katalogu głównego aplikacji. {list, Trajectory} przekazanie trasy explicite jako listę krotek. TrajectoryOptions Lista opcji. Możliwe opcje to: - pointswithtime punkty trasy zadane są razem z czasami, w których robot ma się w nich znaleźć. - smoothbezier wygładzenie trajektorii za pomocą krzywych Béziera. AlgParamsInput Parametry algorytmu. {filename, Filename} wczytanie parametrów z pliku o podanej nazwie. {record, AlgParams} przekazanie parametrów w formie rekordu algparams. Szczegółowy opis i format danych znajduje się poniżej. 4.1. Zadawanie trajektorii Algorytm może działać w dwóch podstawowych trybach: Tor ruchu zadana jest jako lista punków na płaszczyźnie XY oraz maksymalna prędkość, jaką robot będzie starał się utrzymać na całej trasie. Jest to domyślny tryb.
12 Trajektoria przejazd określa lista punktów na płaszczyźnie oraz czas, w jakim powinien się znaleźć w każdym z tych punktów. Aby z niego korzystać, należy przekazać opcję pointswithtime. Należy zdecydować się na odpowiedni tryb w zależności od tego, czy oczekuje się stałej prędkości przez większość przejazdu, czy by zmieniała się w zależności od odcinka, w którym znajduje się robot. Współrzędne są typu float, w metrach. Czas jest typu int i podaje się go jako sekundy względem momentu uruchomienia algorytmu. 4.1.1. Format pliku tekstowego Każda linijka oznacza osobny punkt trasy. Współrzędne (i opcjonalnie czas) powinny być oddzielone spacją bądź tabulacją. #x y czas 0.0 0.0 0 0.0 20.0 10 20.0 20.0 30 # ta linijka to komentarz 20.0 0.0 35 0.0 0.0 100 Przykład 1: Trasa w kształcie kwadratu Linijki puste lub zaczynające się znakiem # są ignorowane. Na przykładzie 1 zadana jest trajektoria w kształcie kwadratu. 4.1.2. Wygładzanie trasy Jeżeli przekazana została opcja smoothbezier, zadana trajektoria zostanie wygładzona za pomocą krzywych Béziera, których punktami kontrolnymi są punkty wejściowe. Dodane zostaną nowe punkty tworzące łamaną ze znacznie większymi kątami skrętu. Liczbę segmentów, na które ma być podzielony każdy odcinek wejściowej trasy można określić za pomocą pola algparams.bezier_segments_n. Przykład działania:
13 Rysunek 5: Porównanie trajektoria wejściowa i po wygładzeniu 4.2. Parametry algorytmu Parametry przechowywane są w rekordzie algparams. Aby przekazać je do aplikacji, można przekazać skonstruowaną już strukturę, bądź podać nazwę pliku, który ma format erlangowego wyrażenia. Zawiera on następujące pola: lookahead [m] określa, na jak długi dystans algorytm będzie wybiegać do przodu planując kolejny ruch. W praktyce duże wartości (rzędu odległości pomiędzy kolejnymi punktami trajektorii) oznaczają trasę krótszą i mocno wygładzoną. Im mniejsze wartości, tym bliżej zadanych punktów będzie przebiegała przebyta trasa i bliższa będzie wejściowej łamanej. i_alpha oraz i_track wagi odległości kątowej oraz liniowej przy wyliczaniu odchylenia od trasy. Wartości domyślne są optymalne, jednak dla nietypowych trajektorii może eksperymentować z ich konfiguracją. Zakres wartości nie jest ograniczony, jednak ostatecznie w algorytmie ich wartości są normalizowane. centr_acc [ m s 2 ] maksymalne przyśpieszenie odśrodkowe jakie powinno wystąpić podczas jazdy. Zapobiega wywracaniu się robota na zakrętach. max_lin_vel [ ] m s maksymalna prędkość liniowa. W trybie stałej prędkości oznacza ona pożądaną prędkość samochodu na całej trasie. W trybie punktów z czasami interpretowana będzie jako fizyczne ograniczenie możliwości robota. bezier_segments_n liczba odcinków, na które dzielony jest pojedyńczy odcinek trajektorii wejściowej przy wygładzaniu (patrz 4.1.2). Wartość powinna być 4.
14 scale stały współczynnik przy prędkościach. Może być użyty do korygowania wartości zadawanych przez sterownik. Dla niezdefiniowanych parametrów przyjęta zostanie wartość domyślna (patrz: definicja rekordu w pliku include/records.hrl). {alg_params, [ ]}. {lookahead, 2}, {i_alpha, 0.8815}, {i_track, 0.1185}, {centr_accel, 4}, {max_lin_vel, 1}, {bezier_segments_n, 8} Przykład 2: Plik z parametrami algorytmu 4.3. Wizualizacja wyniku W przypadku symulacji do wizualizacji wyniku można użyć różnych narzędzi wchodzących w skład pakietu symulatora ROBOSS pozwalających na bieżąco śledzić trasę robota w dwóch (Monitor2D) lub trzech (Monitor) wymiarach. Z kolei aplikacja Symulator umożliwia podgląd różnych parametrów symulacji. Do dyspozycji użytkownika jest też funkcja demo:plot/0. Korzysta ona z zapisu trasy tworzonego podczas przejazdu (track.log) oraz skryptów wsadowych programu gnuplot [5] do wizualizacji trasy przejazdu oraz jej parametrów. Aby zmodyfikować wyświetlane wykresy należy wyedytować plik plot_traj.gp.
15 5. Rocopie logger Projekt rocopie_logger jest projektem towarzyszącym i służy do logowania informacji pozyskiwanych ze zdalnego urządzenia. Projekt ten nie jest integralną częścią systemu rocopie i nie jest wymagana jego obecność w celu poprawnego działania systemu. Treść tego rozdziału należy traktować jako możliwość rozszerzenia systemu o funkcjonalności dostarczone przez wyżej wspomniany projekt. 5.1. Instalacja 5.1.1. Klient Klient jest erlangowym modułem i nie wymaga instalacji przed wywołaniem. 5.1.2. Serwer Do uruchomienia aplikacji serwerowej potrzebne będą następujące środowiska i narzędzia: System operacyjny Windows w wersji 7 lub wyższej Platforma.NET w wersji 4.0 lub wyższej MinGW + MSYS (z narzędziem make) [7] Erlang/OTP w wersji co najmniej R15B [4] CouchDB w wersji 1.20 lub wyższej [2] 1. Pobranie projektu Rocopie logger z repozytorium serwisu bitbucket [10] 2. Przejście do katalogu głównego projektu 3. Wywołanie polecenia: make install Spowoduje to utworzenie skryptu startowego start_rocopie_server.bat Aby wygenerować dokumentację, należy wywołać polecenie: make doc
16 5.2. Instrukcja obsługi 5.2.1. Klient W celu użycia rocopie_loggera należy zmodyfikować pożądany moduł, tak aby spełnić podane niżej warunki. Moduł loggera roco_logger należy: 1. Zainicjalizować funkcją start/4 podając: nazwę mającą identyfikować go w systemie, port na którym będzie nasłuchiwać oraz adres i port serwera. 2. Zgłaszać żądanie logowania funkcją log/3 podając Subject, Name oraz Value, ktore mają być wysłane do serwera. 3. Zakończyć funkcją stop/1. Moduł stat_monitor jest przykładowym modułem wykorzystującym system logowania do podawania wartości bieżącego obciążenia systemu. Subject i Name powinny być zdefiniowane w pliku konfiguracyjnym aplikacji.net. Należy również pamiętać o dostarczeniu ścieżek do katalogu ebin oraz deps/*/ebin projektu rocopie_logger w celu skorzystania z funkcji jego modułów. 5.2.2. Monitor (serwer, GUI) Aby wizualizować na żywo lub przeglądać dane zgromadzone w bazie należy uruchomić serwer z linii poleceń start_rocopie_server.bat. To polecenie zainicjalizuje połączenie z bazą danych i uruchomi aplikację graficzną. Zakładki przełączają pomiędzy widokiem danych zgromadzonych w bazie danych na danym komputerze a danych zbieranych przez roco_server w czasie rzeczywistym. 5.2.3. Widok bazy danych dodanie logowanej wartości do wykresu Po rozwinięciu tematów wysyłanych przez dane urządzenie należy wybrać wartość (name) i z menu kontekstowego wybrać opcję Add to plot. dodanie nowej sesji Należy kliknąć przycisk Add session, który wyświetli okno z wszystkimi sesjami zgromadzonymi w bazie danych. Dla danego robota może być wiele sesji, identyfikowane są przez datę rozpoczęcia. Po wybraniu sesji zostanie ona dodana do widoku drzewa i stamtąd można dodać ją do wykresu. 5.2.4. Widok realtime Przed uruchomieniem należy wyedytować pliki konfiguracyjne określające subskrypcje znajdujace sie w folderze rocopie_logger/config: available.subs lista wszystkich par {subject, name} możliwych do wysłania przez obecne urządzenia, które chce się monitorować.
17 default.subs lista subskrypcji (czyli par {subject, name}), które mają domyślnie być odbierane. Można to zmienić potem w czasie działania programu. Dodawanie i usuwanie wartości z wykresu odbywa się analogicznie jak w widoku bazy danych. Aby zmienić subskrypcję należy odznaczyć/zaznaczyć odpowiednią wartość na drzewie. 5.2.5. Uwagi Po uruchomieniu serwera (oraz automatycznie aplikacji.net) można otworzyć erlangowego shella, upewnić się, że rocopie_logger/ebin znajduje się na erlangowej ścieżce. Następnie uruchomić przykładowy moduł stat_monitor za pomocą funkcji stat_monitor:start/0. stat_monitor generuje i loguje komunikaty z niewielkim odstępem czasowym Ani moduł roco_logger, ani stat_monitor nie jest sprzężony z częścią serwerową. Można przenieść plik tego modułu na inną maszynę i tam z niego korzystać (podając adres IP i port na którym działa roco_server)
Spis rysunków 1 Lynxmotion 4WD1 Rover Kit......................... 4 http://www.lynxmotion.com/images/product/large/a4wd01.jpg 2 Moduł lokalizacyjny StarGazer RS 1.0.................... 4 http://eng.hagisonic.kr/data/attach/5i7s9lpa6.png 3 Kompletny robot................................ 4 4 Symulowany robot............................... 7 5 Porównanie trajektoria wejściowa i po wygładzeniu............ 13 18
19 Materiały źródłowe [1] Amber. http://github.com/kgadek/amber. [2] Instalator couch db dla windows. http://www.apache.org/dyn/closer.cgi?path= /couchdb/packages/win32/1.2.0/setup-couchdb-1.2.0_otp_r15b.exe. [3] Cygwin. http://cygwin.com/install.html. [4] Erlang/otp downloads. https://www.erlang-solutions.com/downloads/ download-erlang-otp. [5] Gnuplot program do tworzenia wykresów. http://www.gnuplot.info/. [6] Baza robota. http://www.lynxmotion.com/p-603-aluminum-4wd1-rover-kit. aspx. [7] Mingw + msys. http://www.mingw.org/wiki/msys. [8] Pandaboard. http://pandaboard.org/. [9] Roboss. http://sourceforge.net/projects/roboss/. [10] Strona projektu rocopie logger w serwisie bitbucket. https://bitbucket.org/ rocopie/rocopie-logger/downloads. [11] Moduł lokalizacyjny. http://eng.hagisonic.kr/cnt/prod/prod010102?uid= 11&cateID=2&fieldName=&orderBy=.