Symulator zachowania prostych robotów mobilnych

Transkrypt

Symulator zachowania prostych robotów mobilnych
Rok akademicki 2011/2012
Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Instytut Informatyki
PRACA DYPLOMOWA INŻYNIERSKA
Krzysztof Lichocki
Symulator zachowania prostych robotów mobilnych
Opiekun pracy
mgr inż. Krzysztof Gracki
Ocena: .....................................................
.................................................................
Podpis Przewodniczącego
Komisji Egzaminu Dyplomowego
Specjalność:
Inżynieria Systemów Informatycznych
Data urodzenia:
1988.09.04
Data rozpoczęcia studiów:
2007.10.01
Życiorys
Urodziłem się 4 września 1988 roku w Gdańsku. W roku 2004 ukończyłem gimnazjum i
rozpocząłem naukę w I LO im. W. Kętrzyńskiego w Kętrzynie. W roku 2007 zdałem maturę i
rozpocząłem studia dzienne na wydziale Elektroniki i Technik Informacyjnych Politechniki
Warszawskiej na kierunku Informatyka.
.......................................................
Podpis studenta
EGZAMIN DYPLOMOWY
Złożył egzamin dyplomowy w dniu .................................................................................2012 r.
z wynikiem ...................................................................................................................................
Ogólny wynik studiów: ................................................................................................................
Dodatkowe wnioski i uwagi Komisji: ..........................................................................................
.......................................................................................................................................................
.......................................................................................................................................................
STRESZCZENIE
Praca obejmuje stworzenie symulatora służącego do modelowania poruszających się
obiektów z uwzględnieniem ich własności fizycznych, a także umożliwiającego testowanie
algorytmów sterowania. Porusza tematy dotyczące tworzenia modeli poruszających się
obiektów, interakcji między obiektami oraz ich wizualizacji.
Słowa kluczowe: symulacja, robotyka mobilna, algorytmy sterowania
SIMULATOR OF SIMPLE MOBILE ROBOTS BEHAVIOR
Thesis describes creation of the simulator used for modeling moving objects with respect to
their physical properties and for testing of control algorithms. It takes up topics related to
modeling of moving objects, the interaction between objects and their visualization.
Keywords: simulation, mobile robotics, control algorithms
Spis treści
1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1. Problemy zwiazane
˛
z symulacja˛ . . . . . . . . . . . . . . . . . . . . . . .
1
1.2. Zalety symulatorów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3. Zastosowanie symulatorów robotów mobilnych . . . . . . . . . . . . . .
4
1.4. Cel i zakres pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2. Istniejace
˛ rozwiazania
˛
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.1. Player Project
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.1.1. Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.1.2. Stage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.1.3. Gazebo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2. Simbad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.3. Webots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.4. SimRobot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3. Projekt systemu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1. Wymagania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2. Ogólna struktura symulatora . . . . . . . . . . . . . . . . . . . . . . . . 12
4. Implementacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1. Graf sceny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1.1. X3D - format zapisu
. . . . . . . . . . . . . . . . . . . . . . . . . 15
4.1.2. Edycja drzewa sceny . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2. Silnik fizyczny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.1. ODE - Open Dynamics Engine . . . . . . . . . . . . . . . . . . . 18
4.2.2. Własności fizyczne obiektów . . . . . . . . . . . . . . . . . . . . . 19
4.2.3. Detekcja kolizji
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.3. Wizualizacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
ii
Spis treści
4.4. Sterowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.1. Architektura klient-serwer . . . . . . . . . . . . . . . . . . . . . . 23
4.4.2. Protokół komunikacji . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.4.3. API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5. Testowanie oraz przykłady użycia . . . . . . . . . . . . . . . . . . . . . . . 28
5.1. Wydajność systemu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2. Wiarygodność symulacji . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
A. Plik wallAvoiders.x3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
B. Plik WallAvoiders.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
C. Plik wallFollower.x3d . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
D. Plik WallFollower.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
E. Instrukcja obsługi programu . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
E.1. Okna programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
E.2. Interfejs programu
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
E.2.1. File menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
E.2.2. View menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
E.2.3. Help menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
E.2.4. Pasek narze˛ dzi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
E.3. Drzewo sceny
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
E.4. Okno wizualizacji 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
1. Wprowadzenie
Zwi˛ekszajaca
˛ si˛e moc obliczeniowa komputerów powoduje, że symulacja
znajduje coraz szersze zastosowanie w dziedzinie robotyki mobilnej. Symulatory oferuja˛ coraz dokładniejsze odwzorowanie rzeczywistego świata
zarówno pod wzgl˛edem zjawisk w nim zachodzacych
˛
jak i jego wizualizacji.
Pozwala to na zwi˛ekszenie roli jaka˛ odgrywa symulacja w procesie tworzenia
i testowania modeli robotów oraz algorytmów nimi sterujacych.
˛
[7]
1.1. Problemy zwiazane
˛
z symulacja˛
Mimo systematycznie rosnacej
˛
wydajności komputerów moc obliczeniowa jest nadal sporym ograniczeniem. Istnieja˛ problemy, które z samej
swojej natury sa˛ kosztowne obliczeniowo, takie jak realistyczna symulacja
wody czy efektów aerodynamicznych. W dziedzinie robotyki mobilnej symulatory musza˛ zapewnić zarówno generacj˛e świata jak i odczyty sensorów, w
które zazwyczaj wyposażone sa˛ roboty. Zwykle symulatory zapewniaja˛ także
odwzorowanie fizyki w zakresie kinematyki oraz dynamiki ruchu brył sztywnych. Duża złożoność obliczeniowa jest wobec tego obecnie ich głównym
ograniczeniem. Powoduje, że użytkownicy symulatorów musza˛ przystać na
pewien kompromis mi˛edzy dokładnościa˛ odwzorowania rzeczywistości a wydajnościa˛ symulacji.
Przeprowadzajac
˛ eksperyment przy użyciu symulatora użytkownik oczekuje zwykle czasu wykonania równego lub lepszego od czasu rzeczywistego.
Przy bardziej skomplikowanych scenach spełnienie tego warunku może
w dużym stopniu wpłynać
˛ na inne parametry symulacji np. zmniejszyć
płynność jej wizualizacji, czy nawet wymagać jej wyłaczenia.
˛
W niektórych
przypadkach konieczne może być ponadto zwi˛ekszenie kroku symulacji, a
co za tym idzie zmniejszenie jej dokładności i wiarygodności wyników.
1.2. Zalety symulatorów
2
Kolejnym problemem jest trudność odpowiedniego zamodelowania
świata. Ponieważ możemy uzyskać jedynie przybliżony model świata rzeczywistego konieczne jest ustalenie jaki wycinek oraz jakie cechy tego świata
sa˛ krytyczne dla uzyskania wiarygodnych wyników symulacji. Napotkać
można w tym przypadku ponownie na problem złożoności, gdy system okaże
sie˛ zbyt skomplikowany na jego wierne odtworzenie.
Roboty mobilne, aby podjać
˛ decyzj˛e na temat swojego dalszego działania, zwykle opieraja˛ si˛e na odczytach z sensorów, w które sa˛ wyposażone.
Informacja pochodzaca
˛ z sensorów jest dla robota źródłem wiedzy o jego otoczeniu i jako pełniaca
˛ istotna˛ rol˛e w procesie podejmowania decyzji powinna
być zapewniona także w symulatorze. Rzeczywiste sensory nie sa˛ oczywiście
idealne - wprowadzaja˛ zwykle pewien szum. Symulator, aby jak najwierniej
odwzorować rzeczywistość powinien symulować także te zakłócenia, co nie
jest problemem trywialnym.
Wszystkie powyższe problemy sprowadzaja˛ si˛e do jednej zasadniczej kwestii określajacej
˛
przydatność, badź
˛ też nie, symulatora. Kryterium takim jest
rozbieżność mi˛edzy wynikami osiagni˛
˛ etymi poprzez wykonanie określonego
eksperymentu w rzeczywistości a tymi uzyskanymi za pomoca˛ symulacji.
Jeśli symulacja z wymienionych powodów nie jest odpowiednio dokładnym
odwzorowaniem rzeczywistego modelu, osiagni˛
˛ ete rezultaty moga˛ na tyle odbiegać od rzeczywistych, że symulacja staje si˛e bezużyteczna.
1.2. Zalety symulatorów
Mimo wymienionych problemów, symulatory robotów mobilnych sa˛ bardzo cz˛esto i szeroko wykorzystywane. Przyczyna˛ takiego stanu rzeczy sa˛
oferowane przez nie korzyści, które można sprowadzić do dwóch cech - obniżenie kosztów oraz oszcze˛ dność czasu.
Symulacja pozwala uniknać
˛ typowych problemów spowodowanych przez
fizyczność rzeczywistych modeli robotów. Materiały, z których zbudowane
sa˛ roboty zużywaja˛ si˛e, baterie podczas użytkowania traca˛ na wydajności.
Wirtualne modele pozbawione sa˛ tych niedogodności - pozwala to także
1.2. Zalety symulatorów
3
na przeprowadzenie ryzykownych eksperymentów bez obaw o uszkodzenie
robota.
Znacznie prostsze, albo też wre˛ cz możliwe, staje si˛e przeprowadzanie
eksperymentów wykorzystujacych
˛
wiele robotów.
Podczas gdy rzeczywi-
sty eksperyment z powodu ustalonego budżetu musiałby ograniczać si˛e do
niewielkiej ich liczby, ilość symulowanych robotów ograniczona jest zwykle
jedynie przez możliwości symulatora oraz wydajność komputera. W wi˛ekszości przypadków znacznie przekracza ona liczb˛e możliwa˛ do osiagni˛
˛ ecia
w przypadku rzeczywistego eksperymentu. W przypadku symulacji nie istnieje także typowo logistyczny problem zwiazany
˛
z zasilaniem wi˛ekszej liczby
robotów - czy to poprzez kable, które moga˛ zaczać
˛ si˛e platać,
˛
czy poprzez
baterie, które trzeba ponownie ładować. [6]
Kolejna˛ zaleta˛ pozwalajac
˛ a˛ znacznie obniżyć koszty jest możliwość ponownego użycia stworzonych modeli, a także łatwej modyfikacji już istniejacych.
˛
Oferuje to sposobność taniego testowania różnych konfiguracji robota, co w przypadku modeli rzeczywistych mogłoby okazać si˛e zarówno
kosztowne jak i czasochłonne.
Oszcz˛edność czasu jest druga˛ główna˛ korzyścia˛ oferowana˛ przez symulatory. Przy ich użyciu możliwe staje si˛e np. równoległe przeprowadzenie
wielu symulacji danego eksperymentu z różnymi parametrami wykonania.
Zwykle symulatory oferuja˛ także możliwość wyboru pre˛ dkości z jaka˛ ma być
przeprowadzona symulacja. Cz˛esto wia˛że si˛e to z pewnymi ograniczeniami
np. brakiem prezentacji graficznej, ale dzi˛eki temu wyniki można osiagn
˛ ać
˛
szybciej niż w czasie rzeczywistym.
Symulatory szczególna˛ rol˛e pełnia˛ przy testowaniu algorytmów uczacych
˛
sie˛ np. z wykorzystaniem sztucznych sieci neuronowych czy algorytmów
ewolucyjnych. Specyfika tych algorytmów powoduje, że wymagaja˛ one licznych iteracji, badź
˛ też długiego czasu uczenia, co w przypadku rzeczywistych eksperymentów może być kłopotliwe lub nawet niemożliwe do przeprowadzenia. Symulatory dzi˛eki wyżej wymienionym cechom rozwiazuj
˛ a˛ ten
problem.
4
1.3. Zastosowanie symulatorów robotów mobilnych
1.3. Zastosowanie symulatorów robotów mobilnych
Symulatory robotów mobilnych znajduja˛ zastosowanie wsz˛edzie tam,
gdzie wyniki uzyskane za pomoca˛ symulacji nie odbiegaja˛ zbytnio od tych
możliwych do otrzymania w rzeczywistości. Jest to spowodowane wspomniana˛ już oszcz˛ednościa˛ czasu oraz niższymi kosztami - w przeważajacej
˛
wiekszości
˛
przypadków symulacja jest bardziej opłacalna.
Coraz cz˛eściej zaawansowane systemy CAD (ang.
Computer Aided
Design) pozwalaja˛ na przeprowadzenie symulacji działania zaprojektowanych elementów. Umożliwia to w pewnym stopniu zastosowanie takiego
systemu w dziedzinie robotyki. Jednak specyfika systemów CAD powoduje,
że nadaja˛ si˛e one raczej do pracy nad robotami stacjonarnymi jak np. roboty
przemysłowe. W przypadku robotów mobilnych używa si˛e ich do projektowania szczegółowych modeli robotów, które nast˛epnie importowane sa˛ do
wyspecjalizowanych symulatorów robotów mobilnych i tam testowane.
Symulatory sa˛ również szeroko wykorzystywane w celach dydaktycznych. Sa˛ doskonałym narz˛edziem edukacyjnym przybliżajacym
˛
temat robotyki w przypadku, gdy studenci nie maja˛ dost˛epu do rzeczywistych robotów.
Najcz˛eściej jednak symulacja wykonywana jest z myśla˛ o wykorzystaniu
wyników w dalszym rozwoju rzeczywistego robota. Z tego wzgl˛edu wi˛ekszość
przypadków użycia symulatorów można sprowadzić do dwóch głównych zastosowań: testowania różnych konfiguracji budowy robota oraz testowania
algorytmów sterowania.
1.4. Cel i zakres pracy
Celem pracy jest stworzenie symulatora, który b˛edzie umożliwiał przede
wszystkim tworzenie oraz edytowanie modeli prostych robotów, a także
pozwalał na wygodne testowanie algorytmów sterowania.
Zakres edycji
obejmuje zarówno geometri˛e, wyglad,
˛ jak i podstawowe własności fizyczne
obiektów. System ma umożliwić tworzenie robotów mobilnych kołowych
1.4. Cel i zakres pracy
5
oraz kroczacych.
˛
Praca nie obejmuje modelowania czy symulowania robotów latajacych,
˛
badź
˛ pływajacych.
˛
Jest to powodowane odmiennym charakterem zjawisk fizycznych wyst˛epujacych
˛
w takich przypadkach.
W kolejnym rozdziale przedstawione zostały niektóre z dost˛epnych obecnie na rynku symulatorów. Wybrano je tak, aby zaprezentować jak najbardziej zróżnicowane produkty, a jednocześnie wskazać cechy, które wystepuj
˛
a˛ w wi˛ekszości z nich. W rozdziale trzecim nakreślona została ogólna
struktura projektowanego symulatora, podczas gdy rozdział czwarty opisuje
poszczególne moduły wraz ze szczegółami ich implementacji. W rozdziale
piatym
˛
opisane zostały spsoby testowania zrealizowanego systemu ze szczególnym uwzgl˛ednieniem wydajności oraz wiarygodności symulacji. Ostatni
rozdział stanowi podsumowanie wykonanej pracy oraz rozważania na temat
jej dalszego rozwoju.
2. Istniejace
˛ rozwiazania
˛
Obecnie na rynku dost˛epny jest szeroki wybór zarówno symulatorów
komercyjnych - m.in.
Webots1 , anyKode Marilou2 , Microsoft Robotics
Developer Studio3 czy Cogmation robotSim4 , jak i darmowych - open source - takich jak: Player Project5 , Simbad6 , SimRobot7 czy UchilSim8 . Wiele
symulatorów open-source powstaje jako projekt przygotowywany na studia,
co niesie ze soba˛ pewne niedogodności, takie jak brak dalszego rozwoju projektu, czy brak wsparcia. Istnieje jednak kilka produktów, które moga˛ stanowić alternatyw˛e dla rozwiaza
˛ ń komercyjnych. W dalszej cz˛eści rozdziału
zaprezentowane zostana˛ niektóre z nich, a także komercyjne oprogramowanie Webots.
2.1. Player Project
Jednym z najbardziej popularnych środowisk open-source zwiazanych
˛
z symulacja˛ robotów mobilnych jest Player Project. Projekt ten powstał
w 2000 roku na Uniwersytecie Południowej Kalifornii. Obecnie jest szeroko
używany w celach edukacyjnych jak i naukowych. Jest oparty na licencji
GNU GPL i gromadzi wokół siebie wielu ludzi oferujacych
˛
swój wkład w tworzenie projektu, dzi˛eki czemu dynamicznie si˛e rozwija. Na projekt składaja˛
sie˛ trzy niezależne elementy, które moga˛ ze soba˛ współpracować: serwer
Player, symulator 2D Stage oraz symulator 3D Gazebo.
1
2
3
4
5
6
7
8
http://www.cyberbotics.com/overview
http://www.anykode.com
http://www.microsoft.com/robotics/
http://www.cogmation.com/
http://playerstage.sourceforge.net
http://simbad.sourceforge.net
http://www.informatik.uni-bremen.de/simrobot
http://www.robocup.cl/uchilsim
2.1. Player Project
7
2.1.1. Player
Player to serwer prezentujacy
˛ ujednolicony interfejs sterowania wieloma
sensorami oraz efektorami używanymi w robotach mobilnych. Jest multiplatformowy - działa na wszystkich popularnych systemach operacyjnych
(Linux, Solaris, BSD, Mac OS X, Windows). Komunikacja z programem
klienckim prowadzona jest za pomoca˛ protokołu TCP/IP. Dzi˛eki temu użytkownik ma możliwość tworzenia programu sterujacego
˛
robotem w dowolnym j˛ezyku programowania obsługujacym
˛
gniazda TCP. Dodatkowe wsparcie oferowane jest dla najpopularniejszych j˛ezyków takich jak C, C++, Ruby,
Python czy Java. [9]
Player oferuje obecnie sterowniki dla kilkunastu popularnych robotów
takich jak epuck, Khephera, Mindstorms NXT czy Nomad200. Dzi˛eki modularnej budowie dodawanie nowych sterowników jest stosunkowo łatwe zrealizowane jest to za pomoca˛ systemu wtyczek. Duża˛ zaleta˛ środowiska
Player jest to, że stara si˛e udost˛epniać jeden interfejs dla wielu urzadze
˛
ń.
Umożliwia to wykorzystywanie jednego programu sterujacego
˛
do różnych
modeli robotów. Dzi˛eki temu programy sterujace
˛ dla symulatora Stage czy
Gazebo działaja˛ także z prawdziwymi robotami.
Istotna˛ cecha˛ serwera Player jest obsługa wielu klientów jednocześnie.
Ponieważ do jednego serwera połaczyć
˛
może si˛e wiele programów sterujacych
˛
możliwe jest testowanie algorytmów sterowania rozproszonego czy
monitorowanie eksperymentów.
2.1.2. Stage
Stage jest to wieloagentowy symulator 2D. Przystosowany jest do symulowania wielu mało skomplikowanych modeli. Udost˛epnia zróżnicowane modele sensorów oraz efektorów m.in. sonar, IR, dalmierze laserowe, systemy
wizyjne, odometr, nap˛ed różnicowy.
2.1.3. Gazebo
Gazebo, podobnie jak Stage, jest wieloagentowym symulatorem - posiada
jednak wizualizacj˛e 3D. W przeciwieństwie do Stage najlepiej sprawdza si˛e
8
2.2. Simbad
Rysunek 2.1: Przykładowa scena symulatora Player/Stage
przy symulacji niewielkiej liczby robotów o dużej złożoności.
Zapewnia
dokładne odwzorowanie fizyki - wykorzystuje do tego celu bibliotek˛e ODE
(Open Dynamics Engine). Oprócz sensorów udost˛epnianych przez Stage
oferuje dodatkowo kamery oraz GPS. Poza biblioteka˛ sensorów Gazebo zawiera także bibliotek˛e modeli rzeczywistych robotów m.in.
Pioneer2DX,
Pioneer2AT czy SegwayRMP. Model świata zapisywany jest w pliku XML
co ułatwia jego edytowanie.
2.2. Simbad
Simbad jest stosunkowo prostym symulatorem 3D stworzonym w Javie.
Jest multiplatformowy - wymaga jedynie zainstalowanej Javy oraz biblioteki
Java 3D używanej do generowania grafiki. Także udost˛epnia gotowa˛ biblioteke˛ sensorów m.in. sonary, IR, czujniki dotyku, kamery. Simbad został
stworzony z myśla˛ o testowaniu algorytmów sztucznej inteligencji i uczenia
maszynowego. Dost˛epne sa˛ rozszerzenia zwi˛ekszajace
˛ jego możliwości w postaci bibliotek sieci neuronowych PicoNode oraz algorytmów ewolucyjnych
PicoEvo. [10]
Z powodu określonej funkcji jaka˛ miał pełnić Simbad nie nadaje si˛e do
każdego typu zastosowań. Jednym z głównych ograniczeń jest niedokładne
odwzorowanie rzeczywistości - Simbad nie zapewnia dokładnej symulacji
fizyki. Innym znaczacym
˛
ograniczeniem jest brak edytora. Do dyspozycji
9
2.3. Webots
Rysunek 2.2: Przykładowa scena symulatora Simbad
użytkownika oddane sa˛ dwa gotowe modele, które sa˛ dość proste w budowie. Pewnym problemem może być także możliwość pisania programów
sterujacych
˛
jedynie w j˛ezykach Java oraz Python.
2.3. Webots
Webots to komercyjny produkt firmy Cyberbotics. Pozwala na modelowanie i symulowanie różnych typów robotów mobilnych: jeżdżacych,
˛
kroczacych
˛
oraz latajacych.
˛
Podobnie jak wi˛ekszość symulatorów wykorzy-
stuje ODE do odwzorowywania fizyki. Pozwala na importowanie istnieja˛
cych modeli z innych programów graficznych 3D w standardowym formacie
VRML97 (Virtual Reality Modelling Language) uzupełnionym o w˛ezły opisujace
˛ obiekty zwiazane
˛
z robotyka˛ mobilna.
˛ Posiada także rozbudowany
edytor umożliwiajacy
˛ budow˛e modeli oraz ich otoczenia.
Programy sterujace
˛ moga˛ być tworzone w j˛ezykach C, C++, Java, Python
oraz Matlab, a także innych poprzez protokół TCP/IP. Webots posiada bardzo bogata˛ bibliotek˛e sensorów oraz efektorów m.in. dalmierze, kamery,
czujniki światła, czujniki dotyku, GPS, akcelerometry, żyroskopy, chwytaki,
diody LED, nadajniki i odbiorniki. Oferuje także modele rzeczywistych robotów takie jak e-puck, Nao, Katana czy Hoap-2 oraz możliwość transferu
programów sterujacych
˛
do ich fizycznych odpowiedników. [3]
2.4. SimRobot
10
2.4. SimRobot
SimRobot został stworzony na Uniwersytecie Bremeńskim z myśla˛ o wykorzystaniu na zawodach RoboCup - mi˛edzynarodowych zawodach robotów. W dalszym ciagu
˛ wykorzystywany jest przez niemiecka˛ drużyn˛e w Sony
Four-Legged League.
SimRobot ma budow˛e modułowa.
˛ SimRobotCore - jadro
˛
systemu, odpowiada za symulacj˛e, modeluje obiekty oraz świat, a także symuluje odczyty sensorów. Jest niezależne od platformy, dzi˛eki czemu SimRobot działa
na różnych systemach operacyjnych. Moduł Controller, który jest programem sterujacym
˛
robota, jest wywoływany przez symulator i działa w p˛etli
sense-think-act.
Opis modeli robotów oraz świata ładowany jest z pliku zewn˛etrznego.
Format zapisu to RoSiML (Robot Simulation Markup Language) - j˛ezyk
oparty na XML. Został on stworzony z myśla˛ o standaryzacji zapisu modeli oraz możliwości wymiany komponentów mi˛edzy różnymi symulatorami. Struktura pliku XML dobrze oddaje sposób przechowywania struktury sceny w symulatorze - graf sceny. [11]
2.5. Podsumowanie
Wiele z dost˛epnych obecnie produktów symuluje fizyk˛e w zakresie dynamiki brył sztywnych. Zwykle w tym celu wykorzystuje si˛e zewn˛etrzne silniki
fizyczne - bardzo popularnym rozwiazaniem
˛
jest biblioteka Open Dynamics
Engine (ODE). [4]
Jedna˛ z cech, która charakteryzuje wi˛ekszość dost˛epnych produktów jest
obecność bibliotek gotowych modeli istniejacych
˛
w rzeczywistości robotów,
takich jak np. e-puck, Khephera czy Aibo. Niektóre z symulatorów umożliwiaja˛ oprócz ładowania gotowych modeli ich edycj˛e oraz tworzenie nowych.
Dotyczy to zarówno modeli robotów jak i świata, w którym si˛e poruszaja.
˛
Oprócz bibliotek modeli robotów zwykle udost˛epniane sa˛ także mniej lub
bardziej liczne biblioteki sensorów oraz efektorów, w które można wyposażyć
2.5. Podsumowanie
11
wirtualne roboty. Najcz˛eściej spotykanymi sa˛ m.in. kamery, czujniki IR,
sonary, nap˛edy różnicowe czy diody LED.
Wi˛ekszość symulatorów oferuje także pewien rodzaj wizualizacji świata.
Niektóre ograniczaja˛ si˛e do widoku 2D, ale dużo jest rozwiaza
˛ ń zapewniajacych
˛
realistyczna˛ grafik˛e 3D - zwykle przy użyciu bibliotek grafiki jak
OpenGL czy DirectX.
Głównym ograniczeniem wielu darmowych rozwiaza
˛ ń jest utrudniona
edycja modeli robotów, lub nawet jej brak. Wada˛ niektórych jest także brak
możliwości rozdzielenia środowisk uruchomieniowych symulatora oraz programów sterowania. Jednak głównym problemem jest używanie przez poszczególne produkty zupełnie różnych, cz˛esto autorskich, formatów plików
do zapisu scen. Uniemożliwia to wymian˛e modeli mi˛edzy poszczególnymi
symulatorami.
Tworzony system powinien posiadać podstawowe funkcje dost˛epnych na
rynku symulatorów, a wi˛ec symulacj˛e fizyki oraz wizualizacj˛e świata, a przy
tym umożliwiać łatwa˛ edycj˛e sceny oraz testowanie programów sterowania.
Ważne jest, aby wykorzystywany do zapisu scen format plików miał okazj˛e
stać si˛e w przyszłości standardem w tego typu zastosowaniach.
3. Projekt systemu
3.1. Wymagania
Projektowany system powinien uwzgl˛edniać dwa najcz˛estsze powody
użycia symulatorów robotów mobilnych - testowanie różnych konfiguracji
budowy robota oraz testowanie algorytmów sterujacych.
˛
Oba przypadki narzucaja˛ wiele wymagań funkcjonalnych, które system musi spełnić. Przede
wszystkim powinien umożliwiać tworzenie oraz edytowanie zarówno modeli
robotów, jak i ich środowiska. Aby ułatwić prac˛e użytkownikowi powinien
także umożliwiać ponowne wykorzystanie stworzonych elementów np. poprzez funkcj˛e importu/eksportu do pliku.
W celu uzyskania odpowied-
niego odwzorowania rzeczywistości symulator powinien modelować fizyk˛e
w zakresie dynamiki brył sztywnych, a także pozwalać użytkownikowi na
definiowanie wartości podstawowych własności fizycznych modelowanych
obiektów. System powinien także umożliwiać tworzenie oraz wykonywanie
programów sterujacych
˛
dla poszczególnych robotów, a także wizualizacj˛e
przebiegu symulacji.
System musi spełniać także szereg wymagań niefunkcjonalnych,
w szczególności wydajnościowych. Założono, że symulacja średnio skomplikowanej sceny powinna wykonywać si˛e w czasie rzeczywistym lub szybciej na średniej klasy sprz˛ecie. Wymaga si˛e także, aby symulacja dawała
powtarzalne wyniki dla tych samych warunków poczatkowych.
˛
3.2. Ogólna struktura symulatora
Biorac
˛ pod uwag˛e powyższe wymagania przyj˛eto zaprezentowana˛ na rysunku 3.1 strukture˛ symulatora. Budowa modułowa zapewni możliwość
łatwej modyfikacji oraz dalszego rozwoju systemu.
3.2. Ogólna struktura symulatora
13
Rysunek 3.1: Ogólny schemat systemu
— Graf sceny – Struktura danych przechowujaca
˛
informacje o modelu
świata wraz z obiektami w nim wyst˛epujacymi.
˛
Pełni rol˛e bufora w procesie wymiany informacji mi˛edzy modułem symulatora a modułem renderujacym.
˛
Symulator aktualizuje dane grafu sceny, tak aby odpowiadał
on stanowi symulowanego świata, natomiast moduł renderujacy
˛ na podstawie grafu sceny dokonuje wizualizacji tego świata.
Rysunek 3.2: Diagram klas wezłów
˛
drzewa sceny
— Symulator – Główny moduł systemu, odpowiadajacy
˛ za utworzenie modelu świata fizycznego opisywanego za pomoca˛ dynamiki brył sztywnych
na podstawie grafu sceny. Wykonuje kolejne kroki symulacji, a wi˛ec wyznacza na podstawie aktualnego stanu świata oraz działajacych
˛
w nim
3.2. Ogólna struktura symulatora
14
sił stan kolejny, modelujacy
˛ zadany świat po upływie ustalonego dyskretnego odcinka czasu.
— Renderer – Zapewnia wizualizacj˛e działania symulatora.
— Serwer – Umożliwia podłaczenie
˛
do symulatora programów sterujacych.
˛
— UI – Odpowiada za interfejs użytkownika.
Poszczególne moduły opisane zostały szczegółowo w nast˛epnym rozdziale
pracy.
4. Implementacja
4.1. Graf sceny
Centralnym elementem symulatora jest graf sceny. Jest to struktura
przechowujaca
˛ wszystkie statyczne dane dotyczace
˛ symulowanego świata.
Poprawnie skonstruowana definiuje konkretny stan świata określajac
˛ parametry istniejacych
˛
w nim obiektów - ich pozycj˛e, geometri˛e, wyglad
˛ oraz
właściwości fizyczne. Graf sceny umożliwia odwzorowanie hierarchii obiektów, jest wi˛ec cz˛esto stosowany przy scenach trójwymiarowych, gdzie zwykle
wyst˛epuja˛ składajace
˛ si˛e z prostszych złożone obiekty. Najcz˛eściej implementowany jest jako drzewo, w którym każdy w˛ezeł oprócz korzenia posiada jednego rodzica, lub jako skierowany graf acykliczny. Rozwiazanie
˛
drugie ma t˛e przewag˛e, że informacja o obiektach wyst˛epujacych
˛
w wielu
egzemplarzach nie jest duplikowana [1].
Cz˛esto graf sceny ma bezpośrednie odwzorowanie w formacie w jakim
scena zapisywana jest do pliku. Pewna˛ niedogodnościa˛ jaka˛ odznaczaja˛ si˛e
dostepne
˛
na rynku symulatory, ale i edytory grafiki 3D jest wielość tychże
formatów. Z tego powodu wykorzystanie modeli w innym programie niż
użytym do ich stworzenia jest utrudnione, a w przypadku braku możliwości
konwersji w ogóle niemożliwe.
4.1.1. X3D - format zapisu
Majac
˛ powyższe na uwadze, jako format zapisu danych, a także reprezentacj˛e drzewa sceny wybrano format Extensible 3D (X3D). Jest to otwarty
standard oparty na XML, tworzony przez konsorcjum Web3D i b˛edacy
˛ bezpośrednim nast˛epca˛ formatu Virtual Reality Modeling Language (VRML).
X3D zaprojektowany został z myśla˛ o stworzeniu jednolitego sposobu reprezentacji scen 3D i uzyskał status normy ISO [12]. Ważna˛ zaleta˛ formatu jest
16
4.1. Graf sceny
możliwość jego rozszerzania poprzez definiowanie własnych komponentów,
dzieki
˛ czemu możliwe staje si˛e jego użycie do zapisu danych zwiazanych
˛
z symulacja˛ robotów mobilnych. Na wydruku 4.1 zaprezentowano przykładowy plik x3d, natomiast na rysunku 4.1 wynik renderowania tego pliku.
1
<?xml version= " 1.0 " encoding= "UTF−8" ?>
<X3D>
<head>
</head>
<Scene>
5
<World>
<PointLight l o c a t i o n = " 3 3 1 " />
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 0 0 1 " />
10
</Appearance>
<Sphere radius= " 0.5 " />
</Shape>
<Transform r o t a t i o n = " 0 1 0 0 " t r a n s l a t i o n = " 0 −0.5 0 " >
<Shape>
15
<Appearance>
<Material d i f f u s e C o l o r = " 1 0 0 " />
</Appearance>
<Box s i z e = " 5 0.1 5 " />
</Shape>
20
</Transform>
</World>
</Scene>
</X3D>
Wydruk 4.1: Przykładowy plik x3d
Obsług˛e formatu X3D zapewniono poprzez użycie otwartej biblioteki
X3DToolkit1 .
Obsługuje ona podstawowe komponenty standardu X3D,
umożliwia ich rozszerzanie, a także definiowanie własnych. Biblioteka ta
wykorzystywana jest do ładowania oraz zapisywania plików X3D, a także
generowania i edycji drzewa sceny.
1
http://artis.imag.fr/Software/X3D/
17
4.1. Graf sceny
Rysunek 4.1: Wynikowy obraz sceny
4.1.2. Edycja drzewa sceny
Edycja drzewa sceny możliwa jest mi˛edzy innymi poprzez bezpośrednie
edytowanie pliku tekstowego X3D. Jednak aby uprościć i przyspieszyć proces modyfikacji sceny, zaprojektowano oraz zaimplementowano edytor oferujacy
˛ interfejs graficzny. Dzi˛eki temu użytkownik natychmiast widzi efekt
dokonywanych zmian w oknie prezentujacym
˛
wizualizacj˛e sceny. Edytor
umożliwia usuwanie oraz dodawanie nowych w˛ezłów do drzewa, a także
ich edycj˛e. Dodawanie nowego w˛ezła zostało sprowadzone do wyboru przez
użytkownika typu w˛ezła z listy typów dopuszczalnych w danym miejscu
drzewa. Zaznaczenie któregoś z w˛ezłów powoduje wyświetlenie panelu prezentujacego
˛
jego parametry oraz umożliwiajacego
˛
ich edycj˛e. Edytor pozwala także na zapis poszczególnych w˛ezłów do pliku oraz importowanie
ich z plików do drzewa sceny. W celu realizacji edytora użyto biblioteki
wxWidgets, która zapewnia wieloplatformowość, a korzystajac
˛ z natywnych
dla danego środowiska składników także wyglad
˛ charakterystyczny dla danej platformy.
Na rysunku 4.2 zaprezentowano wyglad
˛ edytora drzewa sceny dla prostej sceny zawierajacej
˛
model robota, natomiast na rysunku 4.3 wynikowy
model.
18
4.2. Silnik fizyczny
Rysunek 4.2: Edycja przykładowej sceny
4.2. Silnik fizyczny
4.2.1. ODE - Open Dynamics Engine
Systemy umożliwiajace
˛ symulacj˛e własności fizycznych obiektów zwykle
używaja˛ do tego celu gotowych bibliotek tzw. silników fizyki. W dziedzinie
symulatorów robotów mobilnych szczególnie cz˛esto znajduja˛ zastosowanie
trzy z nich: Bullet2 , PhysX3 oraz ODE (Open Dynamics Engine)4 .
W celu dokonania wyboru spośród dost˛epnych silników fizycznych przeanalizowano prac˛e zawierajac
˛ a˛ wyniki porównania siedmiu z nich [2]. Serie
testów wykazały, że żaden z nich nie wyróżnia si˛e znaczaco
˛ na tle pozostałych pod wzgl˛edem ogólnej oceny. Test sprawdzajacy
˛ stabilność narzuconych w symulacji ograniczeń wykazał, że najmniejszy bład
˛ wyst˛epuje przy
zastosowaniu biblioteki ODE. Ponieważ jest to istotny parametr w symulacji
obiektów składajacych
˛
si˛e z wielu brył sztywnych właśnie ten silnik fizyczny
został użyty w implementacji. Na korzyść ODE przemawia także otwartość
biblioteki oraz użycie jej w wielu istniejacych
˛
symulatorach, co powoduje,
że jest to rozwiazanie
˛
sprawdzone. [4]
2
3
4
http://bulletphysics.org/wordpress/
http://www.geforce.com/Hardware/Technologies/physx
http://www.ode.org/
19
4.2. Silnik fizyczny
Rysunek 4.3: Wynikowy model
4.2.2. Własności fizyczne obiektów
Zakres i dokładność odwzorowania symulowanych własności fizycznych
jest ściśle uzależniony od możliwości oferowanych przez silnik fizyczny ODE.
Sa˛ one jednak na tyle szerokie, że możliwe było uwzgl˛ednienie w symulatorze wszystkich liczacych
˛
si˛e w typowym zastosowaniu parametrów fizycznych.
Masa
Każdy z obiektów znajdujacych
˛
si˛e w drzewie sceny symulowany jest jako
bryła sztywna. W ogólnym przypadku obiekt taki może być zdefiniowany
przez użytkownika jako złożenie dowolnej liczby dost˛epnych brył geometrycznych tzn. sześcianu, walca i kuli. Podczas tworzenia modelu obiektu
dla każdej takiej bryły geometrycznej użytkownik ustala jej g˛estość lub
mase.
˛ W momencie uruchomienia symulacji, w procesie tworzenia świata
fizyki na podstawie drzewa sceny, ustalana jest ostateczna masa tak zdefiniowanego obiektu. Na podstawie obj˛etości brył, ich rodzaju, rozmieszczenia oraz masy lub g˛estości każdej z nich wyznaczana jest macierz tensora
bezwładności odpowiadajacego
˛
rozkładzie masy oraz wielkość masy całego
obiektu.
4.2. Silnik fizyczny
20
Wada˛ tego rozwiazania
˛
jest nieuwzgl˛ednienie przecinajacych
˛
si˛e brył geometrycznych. Masa obiektu wyznaczana jest z założeniem, że tworzace
˛ ja˛
bryły sa˛ rozłaczne.
˛
Drugim przybliżeniem wynikajacym
˛
bezpośrednio z ograniczeń ODE jest konieczność przesuni˛ecia środka masy tak aby odpowiadał
on punktowi odniesienia obiektu. Rozwiazanie
˛
odwrotne, czyli przesuni˛ecie
punktu odniesienia obiektu w miejsce środka masy zostało odrzucone, gdyż
generowałoby niejasne dla użytkownika przesuni˛ecia obiektów w momencie
uruchomienia symulacji.
Tarcie
Tarcie ślizgowe symulowane jest na podstawie przybliżonego modelu tarcia Coulomba. Jest to model zakładajacy,
˛
że siła tarcia zależy liniowo od siły
nacisku, a stosunek tych sił określa współczynnik tarcia zależny od właściwości powierzchni obu ciał m.in. ich chropowatości. Model Coulomba
powstał na drodze empirycznej i nie oddaje w pełni zjawisk zachodzacych
˛
w rzeczywistości. Jednak dla znacznej wi˛ekszości przypadków w wystarczajacym
˛
stopniu przybliża rzeczywistość, a jego mocna˛ strona˛ jest jego prostota.
ODE oferuje dwa modele tarcia b˛edace
˛
przybliżeniem modelu tarcia
Coulomba.
Pierwszy z nich zmienia interpretacj˛e współczynnika tarcia.
W modelu tym współczynnik określa maksymalna˛ sił˛e tarcia jaka może
zaistnieć w miejscu styku danych ciał. Jest to niezbyt dokładne odwzorowanie rzeczywistości, gdyż siła tarcia nie zależy w tym przypadku od siły
nacisku, ale mniej kosztowne obliczeniowo. Drugi model polega na wprowadzeniu przybliżenia poprzez dwa etapy wyznaczania sił - najpierw wyznaczane sa˛ siły nacisku z zupełnym pomini˛eciem tarcia, a nast˛epnie na
podstawie współczynników wyznaczane sa˛ maksymalne siły tarcia według
modelu Coulomba.
Implementujac
˛ system wybrano drugi model jako bardziej odpowiadajacy
˛
rzeczywistości. Wada˛ tego rozwiazania
˛
jest wi˛eksza złożoność obliczeniowa,
ale biorac
˛ pod uwag˛e pozostałe elementy symulacji wpływ na ogólna˛ wydajność jest pomijalny.
21
4.2. Silnik fizyczny
Spre˛ żystość
Dla każdej bryły geometrycznej użytkownik może ustalić wartość parametru określajacego
˛
jej spre˛ żystość. Parametr ten przyjmuje wartości w zakresie od 0 do 1, gdzie 1 oznacza zderzenie idealnie spre˛ żyste natomiast 0
brak odbicia.
Twardość
Użytkownik może także zdefiniować dla każdej bryły dwa parametry majace
˛ bezpośrednie przełożenie na parametry punktu kolizji. Sa˛ to parametr
redukcji bł˛edu - ERP (ang.
error reduction parameter) oraz CFM (ang.
constraint force mixing). W praktyce wartość obu parametrów odpowiada
twardości powierzchni kolidujacych
˛
brył, gdzie wyższe wartości odpowiadaja˛
powierzchniom bardziej mi˛ekkim.
4.2.3. Detekcja kolizji
Silnik fizyczny ODE posiada wbudowany algorytm detekcji kolizji. Algorytm ten stosowany jest przed każdym kolejnym krokiem symulacji. Jego
wynikiem sa˛ struktury danych odpowiadajace
˛ punktom kolizji zawierajace
˛
informacj˛e o kolidujacych
˛
bryłach, gł˛ebokości penetracji obu brył, normalnej punktu kolizji oraz współrz˛ednych tego punktu.
Na podstawie tych
struktur oraz opisanych powyżej współczynników fizycznych do odpowiadajacych
˛
brył sztywnych przypisywane sa˛ siły na nie działajace.
˛
Wynik
działania tych sił i ich wpływ na obiekty obliczany jest nast˛epnie w trakcie
kroku symulacji.
Naiwne sprawdzanie każdej bryły geometrycznej z każda˛ z pozostałych
ma kwadratowa˛ złożoność. Dla bardziej skomplikowanych scen staje si˛e
to zbyt kosztowne obliczeniowo, dlatego ODE umożliwia grupowanie brył
zlokalizowanych blisko siebie w przestrzenie (ang. spaces). Dzi˛eki temu
możliwe staje si˛e znaczne ograniczenie wymaganych testów poprzez stwierdzenie, które przestrzenie na pewno ze soba˛ nie koliduja˛ i pomini˛ecie testów
sprawdzajacych
˛
wzajemne kolizje brył do nich należacych.
˛
4.3. Wizualizacja
22
Stworzony symulator korzysta z tego rozwiazania
˛
poprzez kreowanie nowej przestrzeni dla każdego zdefiniowanego przez użytkownika obiektu. Ponadto przestrzenie moga˛ być zamykane w przestrzeniach wyższego poziomu
dla złożonych obiektów tworzac
˛ w ten sposób hierarchi˛e, która odzwierciedla ich strukture.
˛ Ponieważ specyfika rzeczywistych robotów mobilnych
wymaga zwykle, aby poszczególne elementy danego robota ze soba˛ nie kolidowały przyj˛eto założenie o nieistotności kolizji w ramach jednej przestrzeni.
W dalszym stopniu ogranicza to ilość koniecznych testów detekcji kolizji nie
wpływajac
˛ przy tym na wynik symulacji w typowych zastosowaniach.
4.3. Wizualizacja
W celu wizualizacji działania symulacji użyto biblioteki graficznej
OpenGL. Jej wybór spośród dwóch dominujacych
˛
obecnie rozwiaza
˛ ń jakim jest Direct3D oraz właśnie OpenGL powodowany był posiadana˛ przez
nia˛ zaleta˛ jaka˛ jest wieloplatformowość. Użycie konkurencyjnego Direct3D
ograniczałoby działanie systemu praktycznie jedynie do platformy Windows.
Dodatkowo użyto biblioteki pomocniczej freeglut5 , która jest kontynuacja˛
popularnej, lecz od dłuższego czasu już nie rozwijanej biblioteki GLUT,
a także modułu GLT ZPR6 umożliwiajacego
˛
prosta˛ nawigacj˛e w wizualizowanym świecie za pomoca˛ myszy.
Z uwagi na główne przeznaczenie symulatora jakim jest testowanie algorytmów sterowania postanowiono uprościć wizualizacj˛e świata do niezb˛ednego minimum liczac
˛ na poprawienie w ten sposób ogólnej wydajności systemu. Użytkownik ma możliwość definiowania wygladu
˛
obiektów poprzez
stosowanie podstawowych brył geometrycznych oraz określanie materiału
danej bryły, a wi˛ec m.in. jej koloru, stopnia odbicia światła otoczenia czy połysku. Użytkownik może także dowolnie ustalać oświetlenie sceny poprzez
umieszczanie w niej trzech standardowych typów świateł: kierunkowego,
5
6
http://freeglut.sourceforge.net/
http://www.nigels.com/glt/gltzpr/
23
4.4. Sterowanie
punktowego oraz stożkowego.
Zrezygnowano natomiast zarówno z moż-
liwości teksturowania obiektów jak i generowania cieni jako kosztownych
obliczeniowo i zwykle zb˛ednych przy wizualnej ocenie wyników symulacji.
System umożliwia także użytkownikowi pewna˛ kontrol˛e nad jakościa˛ wyświetlanej grafiki poprzez wybór trzech stopni detali - w praktyce sprowadza
sie˛ to do różnej liczby wierzchołków generowanych brył. Jednak głównym
parametrem majacym
˛
wpływ zarówno na wydajność systemu, jak i prezentacje˛ wizualna˛ jest liczba kroków symulacji przypadajacych
˛
na jedna˛ klatk˛e.
Duża wartość tego parametru zmniejsza płynność animacji umożliwiajac
˛
jednak przeprowadzenie symulacji z wi˛eksza˛ szybkościa.
˛ System udost˛epnia także tryb symulacji czasu rzeczywistego, gdzie średnia szybkość symulacji wynosi 1, a wi˛ec upływ czasu symulatora odpowiada rzeczywistemu.
Zachowanie takie osiagni˛
˛ eto poprzez zastosowanie zmiennej liczby kroków
symulacji na jedna˛ klatk˛e uzależnionej od chwilowej wydajności systemu.
4.4. Sterowanie
4.4.1. Architektura klient-serwer
Podstawowym przeznaczeniem systemu jest testowanie algorytmów sterowania mobilnych robotów. Powinien on zatem udost˛epniać użytkownikom
prosty sposób na odbieranie oraz przekazywanie informacji do symulatora.
W szczególności, aby możliwe było sterowanie robotem, użytkownik powinien mieć możliwość aktualizacji efektorów np.
silnika.
Natomiast aby
sterowanie to nie było przypadkowe, wymagana jest informacja na temat
aktualnego stanu świata, uzyskana np. na podstawie odczytów sensorów.
Symulacja grupy robotów zwykle wymaga ponadto uruchomienia kilku różnych sterowników w zależności od typu robota. Należy zauważyć, że bardziej złożone algorytmy sterujace
˛ moga˛ stanowić znaczace
˛ obcia˛żenie dla
mocy obliczeniowej komputera, co przy wi˛ekszej ilości robotów wpłyn˛ełoby
na wydajność całego systemu oraz szybkość symulacji.
Rozwiazaniem
˛
tego problemu jest rozdzielenie środowiska uruchomieniowego symulatora oraz sterownika, tak aby możliwe stało si˛e wykonywanie
24
4.4. Sterowanie
programu sterujacego
˛
na innej jednostce sprz˛etowej. Osiagni˛
˛ ete zostało to
poprzez zastosowanie architektury klient-serwer, gdzie symulator pełni rol˛e
serwera, natomiast programy sterujace
˛ pełnia˛ rol˛e klientów. Komunikacja
miedzy
˛
klientem a serwerem przebiega za pomoca˛ protokołu TCP/IP. Dodatkowa˛ zaleta˛ tego rozwiazania
˛
jest możliwość zastosowania sterowania
rozproszonego. Nie ma ograniczenia na liczb˛e sterowników podłaczonych
˛
do jednego robota, ani liczb˛e robotów sterowanych przez jeden program.
Funkcjonalność serwera jest osiagni˛
˛ eta przez system poprzez uruchomienie dwóch dodatkowych watków
˛
do obsługi połacze
˛ ń. Jeden z nich nasłuchuje połacze
˛ ń przychodzacych
˛
na porcie 48230. Port ten został wybrany
arbitralnie z rejestru usług i przypisanych im portów jako jeden z wolnych,
co zmniejsza ryzyko używania go przez inne programy. W przypadku udanego połaczenia
˛
watek
˛
nasłuchujacy
˛ przekazuje jego obsług˛e do drugiego
watku,
˛
który pełni rol˛e managera połacze
˛ ń. Rozwiazanie
˛
polegajace
˛ na przydzieleniu nowego watku
˛
do każdego nowego połaczenia
˛
zostało odrzucone,
gdyż przy wi˛ekszej liczbie połacze
˛ ń koszty przełaczania
˛
watków
˛
obniżyłyby
wydajność systemu. Wybierajac
˛ model jeden watek
˛
- wiele połacze
˛ ń udało
sie˛ także uniknać
˛ konieczności synchronizacji watków
˛
w tym konkretnym
przypadku.
4.4.2. Protokół komunikacji
Komunikacja mi˛edzy programami sterujacymi
˛
a serwerem prowadzona
jest według protokołu typu żadanie
˛
- odpowiedź i z założenia przebiega
w sposób synchroniczny. Program kliencki przed wysłaniem kolejnego zapytania zobowiazany
˛
jest odebrać odpowiedź serwera. Protokół definiuje
poprawne wiadomości jakie klient może przesłać do serwera, a także odpowiedzi jakie może od niego uzyskać. Każda z wiadomości posiada nagłówek o
długości 3 bajtów. Pierwszy bajt nagłówka jest identyfikatorem wiadomości
i określa jej typ. Dwa pozostałe bajty określaja˛ rozmiar całej wiadomości w
bajtach. Stosowana jest grubokońcowość (ang. big endian), tzn. najbardziej
znaczacy
˛ bajt przesyłany jest jako pierwszy.
Wyróżnić należy dwa tryby komunikacji, z jakich może korzystać program sterujacy.
˛
Jest to sterowanie synchroniczne oraz asynchroniczne.
4.4. Sterowanie
25
W przypadku sterowania synchronicznego system wykonuje kolejny krok
symulacji dopiero po otrzymaniu odpowiedniej wiadomości od programu
sterujacego
˛
pozostawiajac
˛ pełna˛ kontrol˛e nad przebiegem symulacji użytkownikowi. Sterowanie asynchroniczne wprowadza natomiast pewna˛ losowość poprzez pozwolenie symulatorowi na wykonywanie kolejnych kroków
nie czekajac
˛ na istrukcje od sterownika. Należy zauważyć, że w pewien sposób symuluje to rzeczywiste opóźnienia na drodze sterownik-urzadzenie.
˛
4.4.3. API
W celu ułatwienia tworzenia algorytmów sterujacych
˛
opracowana została
biblioteka zapewniajaca
˛ obsług˛e wyżej opisanego protokołu. Implementuje
ona protokół komunikacji zamykajac
˛ jego obsług˛e w łatwiejszych do stosowania przez użytkownika strukturach. API udost˛epnia mi˛edzy innymi
nastepuj
˛
ace
˛ klasy oraz metody:
— klasa Simulation – stanowi fasad˛e serwera symulatora; zapewnia komunikacj˛e z serwerem
— bool connect(std::string ip, bool synch) – próbuje połaczyć
˛
si˛e z serwerem o danym IP i uruchomić komunikacj˛e w trybie synchronicznym,
badź
˛ też asynchronicznym
— Robot* getRobot(std::string robotName) – zwraca wskaźnik na obiekt
reprezentujacy
˛ robota o danej nazwie
— bool step(int timeStep) – w trybie synchronicznym wykonuje krok symulacji o danej w milisekundach wielkości
— klasa Robot – fasada konkretnego robota; umożliwia jego sterowanie
— DistanceSensor* getDistanceSensor(std::string name) – zwraca wskaźnik na obiekt reprezentujacy
˛ czujnik odległości o danej nazwie
— GPS* getGPS(std::string name) – zwraca wskaźnik na obiekt reprezentujacy
˛ urzadzenie
˛
GPS o danej nazwie
— Motor* getMotor(std::string name) – zwraca wskaźnik na obiekt reprezentujacy
˛ silnik o danej nazwie
— klasa DistanceSensor – fasada czujnika odległości
— bool getDistance(float distance) – zwraca zmierzona˛ odległość
4.4. Sterowanie
26
— klasa GPS – fasada urzadzenia
˛
GPS
— bool getPosition(float x, float y, float z) – zwraca pozycj˛e GPS
— klasa Motor – fasada silnika
— bool getVelocity(float velocity) – zwraca obecna˛ pre˛ dkość
— bool setVelocity(float velocity) – ustawia pożadan
˛
a˛ pre˛ dkość
Korzystajac
˛ z klas oferowanych przez API możliwe jest zatem utworzenie
sterownika bez znajomości wykorzystywanego protokołu. Przykład zastosowania zaprezentowany jest na wydruku 4.2.
1
Simulation simulation = Simulation ( ) ;
simulation . connect ( " 127.0.0.1 " , true ) ;
Robot∗ robot = simulation . getRobot ( " robot1 " ) ;
Motor∗ motorR = robot−>getMotor ( " motor_right " ) ;
5
Motor∗ motorL = robot−>getMotor ( " m o t o r _ l e f t " ) ;
DistanceSensor ∗ dsF = robot−>getDistanceSensor ( " ds_front " ) ;
DistanceSensor ∗ dsL = robot−>getDistanceSensor ( " d s _ l e f t " ) ;
i f ( motorR && motorL && dsL && dsF )
{
10
while ( 1 ) {
i f ( ! simulation . step (200) )
break ;
f l o a t distanceF ;
dsF−>getDistance ( distanceF ) ;
15
f l o a t distanceL ;
dsL−>getDistance ( distanceL ) ;
//przy s c i a n i e − obrot w miejscu
i f ( distanceF < 1 . 0 ) {
motorR−>s e t V e l o c i t y ( −4.0) ;
20
motorL−>s e t V e l o c i t y ( 4 . 0 ) ;
}
//przeszkoda za b l i s k o − skrec w prawo
else i f ( distanceL < 0 . 4 ) {
25
motorR−>s e t V e l o c i t y ( 2 . 0 ) ;
motorL−>s e t V e l o c i t y ( 4 . 0 ) ;
}
//przeszkoda za daleko − skrec w lewo
else i f ( distanceL > 1 . 6 ) {
27
4.4. Sterowanie
motorR−>s e t V e l o c i t y ( 4 . 0 ) ;
30
motorL−>s e t V e l o c i t y ( 2 . 0 ) ;
}
//jedz prosto
else {
motorR−>s e t V e l o c i t y ( 4 . 0 ) ;
35
motorL−>s e t V e l o c i t y ( 4 . 0 ) ;
}
}
}
Wydruk 4.2: Przykład zastosowania API
5. Testowanie oraz przykłady użycia
5.1. Wydajność systemu
Na scenie umieszczony został model robota posiadajacy
˛ dwa poruszajace
˛ si˛e niezależnie od siebie koła na wspólnej osi oraz koło Kastora dla
utrzymania stabilności. W celu przybliżonego odwzorowania ruchu rzeczywistego robota tego typu, wartość współczynnika tarcia koła Kastora ustawiona została na 0. Robot został wyposażony w trzy czujniki odległości jeden umieszczony na przedzie i dwa rozmieszczone symetrycznie po obu
stronach robota pod katem
˛
30 stopni wzgl˛edem jego osi. Plik opisujacy
˛
scene˛ przedstawiony został w załaczniku
˛
A.
Rysunek 5.1: Scena wallAvoiders.x3d
Do symulatora podłaczony
˛
został prosty program sterujacy,
˛
który na
podstawie wskazań czujników odległości tak aktualizuje pre˛ dkości kół, aby
uniknać
˛ zderzenia z przeszkoda.
˛ Kod programu zawarty jest w załaczniku
˛
B.
29
5.1. Wydajność systemu
Tablica 5.1: Wyniki testu dla sterowników działajacych
˛
asynchronicznie
Liczba robotów
1
2
3
5
10
Średnia liczba klatek/s
62
54
49
38
26
Tablica 5.2: Wyniki testu dla sterowników działajacych
˛
synchronicznie
Liczba robotów
1
2
3
5
10
Średnia liczba klatek/s
42
40
33
27
18
Nast˛epnie symulator uruchamiano kolejno dla rosnacej
˛
liczby robotów i
notowano przybliżona˛ średnia˛ osiagni˛
˛ etych klatek na sekund˛e. Symulacj˛e
uruchomiono w trybie czasu rzeczywistego - jej szybkość wynosiła wi˛ec
1. Krok symulacji wynosił 5 ms. Eksperyment zrealizowano zarówno dla
programów sterujacych
˛
podłaczonych
˛
asynchronicznie jak i synchronicznie.
Wyniki zebrano w tabelach 5.1 i 5.2.
Osiagni˛
˛ ete wyniki pokazuja,
˛ że dla prostych modeli system nadaje si˛e do
symulacji środowisk wieloagentowych w czasie rzeczywistym. Pozwala on
przy tym na płynna˛ animacj˛e eksperymentu. Wyraźna różnica mi˛edzy wynikami działania systemu dla obu typów połacze
˛ ń programów sterujacych
˛
wskazuje na znaczne opóźnienia wprowadzane przez komunikacj˛e z serwerem.
W kolejnym teście sprawdzono maksymalna˛ szybkość symulacji możliwa˛ do osiagni˛
˛ ecia przy zachowaniu płynności animacji - za jej granic˛e
przyj˛eto 25 klatek na sekund˛e. Eksperyment uruchomiono z jednym robotem obecnym na scenie i krokiem symulacji wynoszacym
˛
1 ms. Gdy
program sterujacy
˛ połaczony
˛
był w trybie asynchronicznym udało si˛e uzyskać szybkość 7,5-krotnie wyższa˛ od rzeczywistej. W przypadku połaczenia
˛
synchronicznego uzyskana szybkość była wyższa od rzeczywistej około 1,6
razy. Również i w tym teście widoczny jest wyraźny wpływ czasu komunikacji klient-serwer na wyniki. Należy zauważyć, że wpływ ten wzrasta
wraz z szybkościa˛ symulacji, gdyż zwi˛eksza si˛e także odpowiednio liczba
wymienianych komunikatów w jednostce czasu.
30
5.2. Wiarygodność symulacji
5.2. Wiarygodność symulacji
Na scenie umieszczony został robot posiadajacy
˛ dwa poruszajace
˛ si˛e niezależnie od siebie koła na wspólnej osi oraz jedno koło Kastora. Robot został
wyposażony w dwa czujniki odległości - jeden centralnie z przodu, drugi
umieszczony po lewej stronie pod katem
˛
60 stopni wzgl˛edem pierwszego,
a także moduł GPS umożliwiajacy
˛ sprawdzenie globalnych współrz˛ednych
robota. Plik opisujacy
˛ scen˛e przedstawiony został w załaczniku
˛
C.
Rysunek 5.2: Scena wallFollower.x3d
Algorytm sterujacy
˛ robotem na podstawie wskazań czujników odległości szacuje położenie robota wzgl˛edem ściany i tak aktualizuje pre˛ dkości
obu kół, aby utrzymać odległość w zadanym przedziale. Wynikiem takiego
układu sterowania jest robot poda˛żajacy
˛ prawa˛ strona˛ ściany. Program
sterujacy
˛ w zadanych odst˛epach czasu wyświetla uzyskane dane na temat
lokalizacjii robota w symulowanym świecie. Kod programu zawarty jest w
załaczniku
˛
D.
Program sterujacy
˛ podłaczono
˛
do symulatora w trybie synchronicznym,
a nast˛epnie kilkukrotnie uruchomiono symulacj˛e startujac
˛ każdorazowo
z tego samego stanu świata.
Za każdym razem uzyskiwano identyczne
wyniki odczytu pozycji robota co można uznać za potwierdzenie stabilności
oraz powtarzalności symulacji.
6. Podsumowanie
Efektem pracy jest symulator umożliwiajacy
˛ łatwe testowanie algorytmów sterowania, jak również modelowanie prostych obiektów z uwzgl˛ednieniem ich właściwości fizycznych. System oferuje także wizualizacj˛e trójwymiarowego świata, której jakość regulowana jest do pewnego stopnia przez
użytkownika. Dzi˛eki temu użytkownik może dostosować sposób działania
symulatora do przeprowadzanego eksperymentu. Obecnie niemożliwe jest
zupełne wyłaczenie
˛
wizualizacji, co w niektórych zastosowaniach mogłoby
okazać si˛e bardzo przydatne. Warto wi˛ec zastanowić si˛e nad implementacja˛
tej funkcji w przyszłości.
Testy wykazały pewna˛ wad˛e systemu, jaka˛ jest wpływajacy
˛ na efektywność symulacji czas komunikacji programów sterujacych
˛
z serwerem. Zjawisko to jest efektem wyboru architektury zapewniajacej
˛
użytkownikowi jak
najwi˛eksza˛ elastyczność w zakresie testowania algorytmów sterowania. Niestety z tego wzgl˛edu wprowadzane opóźnienie jest niemożliwe do wyeliminowania. Próba˛ złagodzenia tego efektu jest udost˛epnienie trybu połaczenia
˛
asynchronicznego, gdzie opóźnienie w komunikacji nie przekłada si˛e na
sama˛ symulacj˛e lecz na sterownik, podobnie jak to ma miejsce w rzeczywistości.
Autor dołożył wszelkich starań, aby zapewnić otwartość oraz przenośność systemu. Użyte biblioteki wybierane były ze szczególnym naciskiem
na ich wieloplatformowość oraz zgodność z idea˛ wolnego i otwartego oprogramowania. Dzi˛eki temu istnieje możliwość zapewnienia działania symulatora dodatkowo na systemach z rodziny Unix oraz Mac OS X.
Dalszy rozwój systemu możliwy jest zarówno poprzez implementacje˛ dodatkowych sensorów i efektorów, jak np. kamery czy czujników dotyku,
jak i rozszerzenie zakresu stosowania symulatora poprzez udost˛epnienie
6. Podsumowanie
32
użytkownikowi możliwości stosowania mapy wysokości. Dzi˛eki temu możliwe stałoby si˛e symulowanie nierówności podłoża, co obecnie jest znacznie
utrudnione. Dodatkowo prawdopodobne jest zwi˛ekszenie grupy potencjalnych użytkowników systemu poprzez stworzenie API implementujacego
˛
protokół komunikacji w innych j˛ezykach niż obecnie wspomagany C++.
Bibliografia
[1] Bar-Zeev,
Avi.
Ścenegraphs:
Past,
Present,
and
Future",
http://www.realityprime.com/articles/scenegraphs-past-present-and-future
[2] Boeing A., Braunl T.: Evaluation of real-time physics simulation systems. In:
Proceedings of the 5th International Conference on Computer Graphics and
Interactive Techniques in Australia and Southeast Asia - GRAPHITE 2007, vol.
1(212), p. 281, 2007
[3] Cyberbotics Webots, http://www.cyberbotics.com/documentation
[4] Drumwright E., Hsu J., Koenig N., and Shell D., Extending
˛
Open Dynamics
Engine for Robotics Simulation"in Proceedings of SIMPAR 2010 Workshops International Conference on Simulation, Modeling, and Programming for Autonomous Robots, (Darmstadt), p. 38-50, Springer-Verlag, 2010.
[5] Juhasz T., Vajta L.: New challenges in mobile robot simulation systems, Proceedings of 1st CLAWAR/EURON Workshop on Robots in Entertainment, Leisure
and Hobby, 2-4. December 2004, Vienna, Austria.
[6] Reckhaus M., Hochgeschwender N., Paulus J., Shakihimardanov A., and Kraetzschmar G. K., An
˛ Overview about Simulation and Emulation in Robotics"in
Proceedings of SIMPAR 2010 Workshops International Conference on Simulation, Modeling, and Programming for Autonomous Robots, (Darmstadt), pp.
365-374, Springer-Verlag, 2010.
[7] Reckhaus M., Hochgeschwender N., Paulus J., Shakihimardanov A., and Kraetzschmar G. K., Ón the role of simulation in the robot development process"in
Proceedings of SIMPAR 2010 Workshops International Conference on Simulation, Modeling, and Programming for Autonomous Robots, (Darmstadt), pp.
375-384, Springer-Verlag, 2010.
[8] OpenGL API Documentation Overview, http://www.opengl.org/documentation
[9] Player Project, http://playerstage.sourceforge.net
[10] Simbad Project Home, http://www.simbad.sourceforge.net
[11] SimRobot http://www.informatik.uni-bremen.de/simrobot
[12] Web3D consortium: „What is X3D?”, http://www.web3d.org/about/overview/
A. Plik wallAvoiders.x3d
1
<?xml version= " 1.0 " encoding= "UTF−8" ?>
<X3D>
<head>
</head>
5
<Scene>
<World runRealTime= "TRUE" >
<PointLight l o c a t i o n = " 0 10 0 " />
<Group>
<Transform t r a n s l a t i o n = " 0 0.25 −10" >
10
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 20.2 0.5 0.2 " />
15
</Shape>
<Solid>
<Box s i z e = "20 0.5 0.2 " />
</Solid>
</Transform>
20
<Transform t r a n s l a t i o n = " 0 0.25 10" >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
25
<Box s i z e = " 20.2 0.5 0.2 " />
</Shape>
<Solid>
<Box s i z e = "20 0.5 0.2 " />
</Solid>
30
</Transform>
<Transform r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = "10 0.25 0 " >
<Shape>
<Appearance>
A. Plik wallAvoiders.x3d
35
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
35
</Appearance>
<Box s i z e = " 20.2 0.5 0.2 " />
</Shape>
<Solid>
<Box s i z e = "20 0.5 0.2 " />
40
</Solid>
</Transform>
<Transform r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = "−10 0.25 0 " >
<Shape>
<Appearance>
45
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 20.2 0.5 0.2 " />
</Shape>
<Solid>
50
<Box s i z e = "20 0.5 0.2 " />
</Solid>
</Transform>
<Transform t r a n s l a t i o n = "−2 0.25 4 " >
<Shape>
55
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 6 0.5 0.2 " />
</Shape>
60
<Solid>
<Box s i z e = " 6 0.5 0.2 " />
</Solid>
</Transform>
<Transform t r a n s l a t i o n = " 7 0.25 4 " >
65
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 6 0.5 0.2 " />
70
</Shape>
<Solid>
<Box s i z e = " 6 0.5 0.2 " />
A. Plik wallAvoiders.x3d
36
</Solid>
</Transform>
75
<Transform r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = "−5 0.25 4 " >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
80
<Box s i z e = " 6 0.5 0.2 " />
</Shape>
<Solid>
<Box s i z e = " 6 0.5 0.2 " />
</Solid>
85
</Transform>
<Transform r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = " 3 0.25 −8" >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
90
</Appearance>
<Box s i z e = " 4 0.5 0.2 " />
</Shape>
<Solid>
<Box s i z e = " 4 0.5 0.2 " />
95
</Solid>
</Transform>
<Transform t r a n s l a t i o n = " 0 −0.005 0 " >
<Shape>
<Appearance>
100
<Material ambientIntensity= " 1 " d i f f u s e C o l o r = " 0.67 1 0.5 " />
</Appearance>
<Box s i z e = "20 0.01 20" />
</Shape>
</Transform>
105
<Transform r o t a t i o n = " 0 1 0 0 " t r a n s l a t i o n = "−8 0.25 −4" >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
110
<Box s i z e = " 4 0.5 0.2 " />
</Shape>
A. Plik wallAvoiders.x3d
<Solid>
<Box s i z e = " 4 0.5 0.2 " />
</Solid>
115
</Transform>
</Group>
<Robot objectName= " robot1 " r o t a t i o n = " 0 −1 0 0 "
t r a n s l a t i o n = " 0 0.22 0 " >
<Solid>
120
<Box s i z e = " 0.4 0.35 0.4 " />
</Solid>
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 0.5 0.5 0.75 " />
125
</Appearance>
<Box s i z e = " 0.4 0.35 0.4 " />
</Shape>
<Transform t r a n s l a t i o n = " 0 0.2 0 " >
<Solid>
130
<Cylinder height= " 0.05 " radius= " 0.3 " />
</Solid>
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 0 0.5 0.25 " />
135
</Appearance>
<Cylinder height= " 0.05 " radius= " 0.3 " />
</Shape>
</Transform>
<Motor maxForce= "10" maxStop= " 4 " minStop= "−4"
140
objectName= " m o t o r _ l e f t " r o t a t i o n = "−1 0 0 0 "
t r a n s l a t i o n = " 0.25 −0.02 0 " >
<Transform r o t a t i o n = " 0 0 1 1.5708 " >
<Solid>
<Cylinder height= " 0.02 " radius= " 0.2 " />
145
</Solid>
<Shape>
<Appearance>
<Material ambientIntensity= " 0.8 "
d i f f u s e C o l o r = " 0.87 0.87 0.87 " />
150
</Appearance>
37
A. Plik wallAvoiders.x3d
<Cylinder height= " 0.02 " radius= " 0.2 " side= "FALSE" />
</Shape>
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 0 0.5 0.25 " />
155
</Appearance>
<Cylinder bottom= "FALSE" height= " 0.02 " radius= " 0.2 "
top= "FALSE" />
</Shape>
160
</Transform>
</Motor>
<Motor maxForce= "10" maxStop= " 4 " minStop= "−4"
objectName= " motor_right " r o t a t i o n = " 1 0 0 0 "
t r a n s l a t i o n = " −0.25 −0.02 0 " >
165
<Transform r o t a t i o n = " 0 0 1 1.5708 " >
<Solid>
<Cylinder height= " 0.02 " radius= " 0.2 " />
</Solid>
<Shape>
<Appearance>
170
<Material ambientIntensity= " 0.8 "
d i f f u s e C o l o r = " 0.87 0.87 0.87 " />
</Appearance>
<Cylinder height= " 0.02 " radius= " 0.2 " side= "FALSE" />
175
</Shape>
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 0 0.5 0.25 " />
</Appearance>
<Cylinder bottom= "FALSE" height= " 0.02 " radius= " 0.2 "
180
top= "FALSE" />
</Shape>
</Transform>
</Motor>
185
<DistanceSensor objectName= " d s _ l e f t " r o t a t i o n = " 0 1 0 0.5236 "
t r a n s l a t i o n = " 0.21 0.2 0.21 " >
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 1 0 0 " />
38
A. Plik wallAvoiders.x3d
190
39
</Appearance>
<Sphere radius= " 0.01 " />
</Shape>
</DistanceSensor>
<DistanceSensor DEF= " _x3dtkN0 " objectName= " ds_front "
195
r o t a t i o n = " 0 1 0 0 " t r a n s l a t i o n = " 0 0.2 0.3 " >
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 1 0 0 " />
</Appearance>
200
<Sphere radius= " 0.01 " />
</Shape>
</DistanceSensor>
<DistanceSensor objectName= " ds_right " r o t a t i o n = " 0 −1 0 0.5236 "
t r a n s l a t i o n = " −0.21 0.2 0.21 " >
205
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 1 0 0 " />
</Appearance>
<Sphere radius= " 0.01 " />
210
</Shape>
</DistanceSensor>
<Motor maxForce= " 0 " objectName= " caster " r o t a t i o n = " 0 0 1 1.5708 "
t r a n s l a t i o n = " 0 0 0.2 " >
<Motor maxForce= " 0 " r o t a t i o n = " 0 0 1 1.5708 "
215
t r a n s l a t i o n = " −0.19 0 0 " >
<Solid mu= " 0 " >
<Sphere radius= " 0.03 " />
</Solid>
<Shape>
<Appearance>
220
<Material ambientIntensity= " 0.4 "
d i f f u s e C o l o r = " 0.87 0.87 0.87 " shininess= " 0 " />
</Appearance>
<Sphere radius= " 0.03 " />
225
</Shape>
</Motor>
</Motor>
</Robot>
A. Plik wallAvoiders.x3d
</World>
230
</Scene>
</X3D>
Wydruk A.1: Plik wallAvoiders.x3d
40
B. Plik WallAvoiders.cpp
1
#include "MoRS_API . h"
#include <iostream >
5
int main ( int argc , char ∗∗ argv )
{
i f ( argc ! = 3) {
std : : cout << " Sposob wywolania programu:\n WallAvoider . exe arg1 arg2\n" ;
std : : cout << " gdzie dla wartosci arg1 \" true \" polaczenie
realizowane j e s t w t r y b i e synchronicznym " ;
10
std : : cout << " a arg2 j e s t nazwa robota\n" ;
system ( " pause " ) ;
return 0;
}
15
using namespace MORS_API;
Simulation simulation = Simulation ( ) ;
bool synch = f a l s e ;
i f ( strcmp ( argv [ 1 ] , " true " ) == 0) {
synch = true ;
std : : cout << " Komunikacja synchroniczna\n" ;
20
}
else
std : : cout << " Komunikacja asynchroniczna\n" ;
std : : cout << " Laczenie z symulatorem . . . \ n" ;
25
try {
bool r = simulation . connect ( " 127.0.0.1 " , synch ) ;
i f ( r==true ) {
std : : cout << " Nawiazano polaczenie\n" ;
Robot∗ robot = simulation . getRobot ( argv [ 2 ] ) ;
30
i f ( robot ) {
std : : cout << " Sterowanie robotem " << argv [ 2 ] << std : : endl ;
Motor∗ motorR = robot−>getMotor ( " motor_right " ) ;
Motor∗ motorL = robot−>getMotor ( " m o t o r _ l e f t " ) ;
B. Plik WallAvoiders.cpp
DistanceSensor ∗ dsR = robot−>getDistanceSensor ( " ds_right " ) ;
35
DistanceSensor ∗ dsL = robot−>getDistanceSensor ( " d s _ l e f t " ) ;
DistanceSensor ∗ dsF = robot−>getDistanceSensor ( " ds_front " ) ;
i f ( motorR && motorL && dsR && dsL && dsF )
{
while ( 1 ) {
i f ( ! simulation . step (200) )
40
break ;
f l o a t distanceL ;
dsL−>getDistance ( distanceL ) ;
f l o a t distanceR ;
dsR−>getDistance ( distanceR ) ;
45
f l o a t distanceF ;
dsF−>getDistance ( distanceF ) ;
//przeszkoda przed robotem − skrec w prawo
i f ( distanceF <= 0.95) {
50
motorR−>s e t V e l o c i t y ( −2.0) ;
motorL−>s e t V e l o c i t y ( 2 . 0 ) ;
}
//przeszkoda po lewej s t r o n i e − skrec w prawo
else i f ( distanceL < distanceR && distanceL < 0 . 5 ) {
55
motorR−>s e t V e l o c i t y ( −2.0) ;
motorL−>s e t V e l o c i t y ( 2 . 0 ) ;
}
//przeszkoda po prawej s t r o n i e − skrec w lewo
else i f ( distanceR < distanceL && distanceR < 0 . 5 ) {
60
motorR−>s e t V e l o c i t y ( 2 . 0 ) ;
motorL−>s e t V e l o c i t y ( −2.0) ;
}
//jedz prosto
else {
65
motorR−>s e t V e l o c i t y ( 5 . 0 ) ;
motorL−>s e t V e l o c i t y ( 5 . 0 ) ;
}
}
70
}
else
std : : cout << " Nie znaleziono urzadzenia
42
B. Plik WallAvoiders.cpp
43
o podanej nazwie " << std : : endl ;
}
else
75
std : : cout << " Nie znaleziono robota o podanej nazwie " << std : : endl ;
}
else {
std : : cout << " Nie udalo s i e nawiazac polaczenia " << std : : endl ;
}
80
}
catch ( std : : exception& e )
{
std : : cout << e . what ( ) << std : : endl ;
}
85
system ( " pause " ) ;
return 0;
}
Wydruk B.1: plik WallAvoiders.cpp
C. Plik wallFollower.x3d
1
<?xml version= " 1.0 " encoding= "UTF−8" ?>
<X3D>
<head>
</head>
5
<Scene>
<World runRealTime= "TRUE" >
<PointLight l o c a t i o n = " 0 10 0 " />
<Transform t r a n s l a t i o n = "−5 0.25 −10" >
<Shape>
10
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 10.2 0.5 0.2 " />
</Shape>
15
<Solid>
<Box s i z e = " 10.2 0.5 0.2 " />
</Solid>
</Transform>
<Transform t r a n s l a t i o n = " 0 0.25 10" >
20
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 20.2 0.5 0.2 " />
25
</Shape>
<Solid>
<Box s i z e = "20 0.5 0.2 " />
</Solid>
</Transform>
30
<Transform r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = "10 0.25 5 " >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
C. Plik wallFollower.x3d
45
</Appearance>
35
<Box s i z e = " 10.2 0.5 0.2 " />
</Shape>
<Solid>
<Box s i z e = " 10.2 0.5 0.2 " />
</Solid>
40
</Transform>
<Transform r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = "−10 0.25 0 " >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
45
</Appearance>
<Box s i z e = " 20.2 0.5 0.2 " />
</Shape>
<Solid>
<Box s i z e = "20 0.5 0.2 " />
50
</Solid>
</Transform>
<Transform r o t a t i o n = " 0 1 0 −0.7854 " t r a n s l a t i o n = " 2 0.25 −2" >
<Shape>
<Appearance>
55
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 5.75 0.5 0.2 " />
</Shape>
<Solid>
60
<Box s i z e = " 5.75 0.5 0.2 " />
</Solid>
</Transform>
<Transform t r a n s l a t i o n = " 7 0.25 0 " >
<Shape>
65
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 6 0.5 0.2 " />
</Shape>
70
<Solid>
<Box s i z e = " 6 0.5 0.2 " />
</Solid>
C. Plik wallFollower.x3d
46
</Transform>
<Transform " r o t a t i o n = " 0 1 0 1.5708 " t r a n s l a t i o n = " 0 0.25 −7" >
75
<Shape>
<Appearance>
<Material ambientIntensity= " 0.5 " d i f f u s e C o l o r = " 0.5 0 0 " />
</Appearance>
<Box s i z e = " 6 0.5 0.2 " />
80
</Shape>
<Solid >
<Box s i z e = " 6 0.5 0.2 " />
</Solid >
</Transform>
85
<Transform t r a n s l a t i o n = " 0 −0.005 0 " >
<Shape>
<Appearance>
<Material ambientIntensity= " 1 " d i f f u s e C o l o r = " 0.5 0.5 1 " />
</Appearance>
90
<Box s i z e = "20 0.01 20" />
</Shape>
</Transform>
<Robot objectName= " robot2 " r o t a t i o n = " 0 1 0 3.1416 "
t r a n s l a t i o n = "−5 0.22 0 " >
95
<Solid >
<Cylinder height= " 0.35 " radius= " 0.4 " />
</Solid >
<Shape>
<Appearance>
100
<Material d i f f u s e C o l o r = " 0.752941 0.752941 0.752941 "
shininess= "24" specularColor= " 1 1 1 " />
</Appearance>
<Cylinder height= " 0.35 " radius= " 0.4 " />
</Shape>
105
<Motor maxForce= "10" maxStop= " 4 " minStop= "−4" p o s i t i o n = " 0 "
objectName= " m o t o r _ l e f t " r o t a t i o n = " 1 0 0 2.87247 "
t r a n s l a t i o n = " 0.4 −0.02 0 " >
<Transform r o t a t i o n = " 0 0 1 1.5708 " >
<Solid mu= "10" >
110
<Cylinder height= " 0.02 " radius= " 0.2 " />
</Solid >
C. Plik wallFollower.x3d
<Shape>
<Appearance>
<Material ambientIntensity= " 0.4 "
115
d i f f u s e C o l o r = " 0.88 0.88 0.88 " shininess= "24" specularColor= " 1 1 1 " />
</Appearance>
<Cylinder height= " 0.02 " radius= " 0.2 " />
</Shape>
</Transform>
120
</Motor>
<Motor maxForce= "10" maxStop= " 4 " minStop= "−4" p o s i t i o n = " 0 "
objectName= " motor_right " r o t a t i o n = "−1 0 0 1.45873 "
t r a n s l a t i o n = " −0.4 −0.02 0 " >
<Transform r o t a t i o n = " 0 0 1 1.5708 " >
125
<Solid mu= "10" >
<Cylinder height= " 0.02 " radius= " 0.2 " />
</Solid >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.8 "
130
d i f f u s e C o l o r = " 0.88 0.88 0.88 " shininess= "24" specularColor= " 1 1 1 " />
</Appearance>
<Cylinder height= " 0.02 " radius= " 0.2 " />
</Shape>
135
</Transform>
</Motor>
<DistanceSensor length= " 2 " objectName= " d s _ l e f t "
r o t a t i o n = " 0 1 0 1.047 " t r a n s l a t i o n = " 0.28 0 0.28 " >
<Shape>
140
<Appearance>
<Material d i f f u s e C o l o r = " 1 0 0 " />
</Appearance>
<Sphere radius= " 0.01 " />
</Shape>
145
</DistanceSensor>
<DistanceSensor length= " 2 " objectName= " ds_front "
r o t a t i o n = " 0 1 0 0 " t r a n s l a t i o n = " 0 0 0.4 " >
<Shape>
<Appearance>
150
<Material d i f f u s e C o l o r = " 1 0 0 " />
47
C. Plik wallFollower.x3d
</Appearance>
<Sphere radius= " 0.01 " />
</Shape>
</DistanceSensor>
155
<Motor maxForce= " 0 " p o s i t i o n = " 0 " objectName= " caster "
r o t a t i o n = " 0 1 0 0 " t r a n s l a t i o n = " 0 −0.1975 0.4 " >
<Motor maxForce= " 0 " p o s i t i o n = " 0 " r o t a t i o n = " 0 1 0 1.5708 "
t r a n s l a t i o n = " 0 0 −0" >
<Solid mu= " 0.1 " >
<Sphere radius= " 0.0225 " />
160
</Solid >
<Shape>
<Appearance>
<Material ambientIntensity= " 0.4 "
165
d i f f u s e C o l o r = " 0.88 0.88 0.88 " shininess= " 0 " />
</Appearance>
<Sphere radius= " 0.0225 " />
</Shape>
</Motor>
170
<Solid mu= " 0.1 " >
<Sphere radius= " 0.01 " />
</Solid >
</Motor>
<GPS objectName= " gps " />
175
</Robot>
<Transform t r a n s l a t i o n = " 0 0.25 9 " >
<Shape>
<Appearance>
<Material d i f f u s e C o l o r = " 0 0.25 0.5 " />
180
</Appearance>
<Cylinder height= " 0.5 " />
</Shape>
<Solid >
<Cylinder height= " 0.5 " />
185
</Solid >
</Transform>
<Transform t r a n s l a t i o n = "−8 0.25 0 " >
<Shape>
<Appearance>
48
C. Plik wallFollower.x3d
<Material ambientIntensity= " 0.5 "
190
d i f f u s e C o l o r = " 0 0.25 0.5 " />
</Appearance>
<Box s i z e = " 4 0.5 6 " />
</Shape>
<Solid >
195
<Box s i z e = " 4 0.5 6 " />
</Solid >
</Transform>
</World>
200
</Scene>
</X3D>
Wydruk C.1: Plik wallFollower.x3d
49
D. Plik WallFollower.cpp
1
#include "MoRS_API . h"
#include <iostream >
int main ( int argc , char ∗∗ argv )
5
{
i f ( argc ! = 3) {
std : : cout << " Sposob wywolania programu:\n
WallFollower . exe arg1 arg2\n" ;
std : : cout << " gdzie dla wartosci arg1 \" true \" polaczenie
realizowane j e s t w t r y b i e synchronicznym " ;
10
std : : cout << " a arg2 j e s t nazwa robota\n" ;
system ( " pause " ) ;
return 0;
}
15
using namespace MORS_API;
Simulation simulation = Simulation ( ) ;
bool synch = f a l s e ;
i f ( strcmp ( argv [ 1 ] , " true " ) == 0) {
synch = true ;
std : : cout << " Komunikacja synchroniczna\n" ;
20
}
else
std : : cout << " Komunikacja asynchroniczna\n" ;
std : : cout << " Laczenie z symulatorem . . . \ n" ;
25
try {
bool r = simulation . connect ( " 127.0.0.1 " , synch ) ;
i f ( r==true ) {
std : : cout << " Nawiazano polaczenie\n" ;
Robot∗ robot = simulation . getRobot ( argv [ 2 ] ) ;
30
i f ( robot ) {
std : : cout << " Sterowanie robotem " << argv [ 2 ] << std : : endl ;
Motor∗ motorR = robot−>getMotor ( " motor_right " ) ;
Motor∗ motorL = robot−>getMotor ( " m o t o r _ l e f t " ) ;
D. Plik WallFollower.cpp
DistanceSensor ∗ dsF = robot−>getDistanceSensor ( " ds_front " ) ;
35
DistanceSensor ∗ dsL = robot−>getDistanceSensor ( " d s _ l e f t " ) ;
GPS∗ gps = robot−>getGPS ( " gps " ) ;
int count = 0;
i f ( motorR && motorL && dsL && dsF && gps )
{
40
while ( 1 ) {
i f ( ! simulation . step (200) )
break ;
i f ( count % 100 == 0) {
float x , y , z ;
gps−>g e t P o s i t i o n ( x , y , z ) ;
45
std : : cout << " x : " << x << " \ny : " <<
y << " \nz : " << z << " \n" ;
}
count ++;
50
f l o a t distanceF ;
dsF−>getDistance ( distanceF ) ;
f l o a t distanceL ;
55
dsL−>getDistance ( distanceL ) ;
//przy s c i a n i e − obrot w miejscu
i f ( distanceF < 1 . 0 ) {
motorR−>s e t V e l o c i t y ( −4.0) ;
motorL−>s e t V e l o c i t y ( 4 . 0 ) ;
60
}
//przeszkoda za b l i s k o − skrec w prawo
else i f ( distanceL < 0 . 4 ) {
motorR−>s e t V e l o c i t y ( 2 . 0 ) ;
motorL−>s e t V e l o c i t y ( 4 . 0 ) ;
65
}
//przeszkoda za daleko − skrec w lewo
else i f ( distanceL > 1 . 6 ) {
motorR−>s e t V e l o c i t y ( 4 . 0 ) ;
motorL−>s e t V e l o c i t y ( 2 . 0 ) ;
70
}
//jedz prosto
51
52
D. Plik WallFollower.cpp
else {
motorR−>s e t V e l o c i t y ( 4 . 0 ) ;
motorL−>s e t V e l o c i t y ( 4 . 0 ) ;
75
}
}
}
else
std : : cout << " Nie znaleziono urzadzenia
80
o podanej nazwie " << std : : endl ;
}
else
std : : cout << " Nie znaleziono robota o podanej nazwie " << std : : endl ;
}
85
else {
std : : cout << " Nie udalo s i e nawiazac polaczenia " << std : : endl ;
}
}
catch ( std : : exception& e )
90
{
std : : cout << e . what ( ) << std : : endl ;
}
system ( " pause " ) ;
return 0;
95
}
Wydruk D.1: plik WallFollower.cpp
E. Instrukcja obsługi programu
E.1. Okna programu
Program posiada dwa okna: główne okno programu oraz okno wizualizacji 3D. W głównym oknie możemy wyróżnić: menu programu (1), pasek
narzedzi
˛
(2), drzewo sceny (3), panel edycji (4). W oknie wizualizacji: licznik klatek na sekund˛e (5), aktualna pre˛ dkość symulacji (6), osie globalnego
układu współrz˛ednych (7), wizualizacja sceny (8).
Rysunek E.1: główne okno programu
E.2. Interfejs programu
54
Rysunek E.2: okno wizualizacji 3D
E.2. Interfejs programu
E.2.1. File menu
New - tworzy nowy dokument
Open... - pozwala użytkownikowi na otworzenie pliku x3d
Close - zamyka aktualny dokument
Save - zapisuje aktualny dokument
Save as... - pozwala zapisać użytkownikowi aktualny dokument pod
inna˛ nazwa˛
Exit - zamyka program
E.2.2. View menu
Low quality - ustawia niska˛ jakość renderowania
Medium quality - ustawia średnia˛ jakość renderowania
High quality - ustawia wysoka˛ jakość rednerowania
E.2. Interfejs programu
55
E.2.3. Help menu
About... - wyświetla okno z informacja˛ o programie
E.2.4. Pasek narzedzi
˛
New: jak polecenie File->New
Open: jak polecenie File->Open
Save: jak polecenie File->Save
Add node: pozwala użytkownikowi na dodanie w˛ezła do drzewa sceny
Delete node:
usuwa zaznaczony w˛ezeł oraz wszystkie jego w˛ezły
potomne
Import node: importuje w˛ezeł lub drzewo z pliku i wstawia w aktualnym
miejscu w drzewie sceny
E.3. Drzewo sceny
56
Export node: eksportuje zaznaczony w˛ezeł oraz jego w˛ezły potomne do
pliku
Start simulation: rozpoczyna symulacj˛e
Pause simulation: pauzuje symulacj˛e
Stop simulation: zatrzymuje symulacj˛e
E.3. Drzewo sceny
Dodawanie wezła
˛
Aby dodać do drzewa sceny nowy w˛ezeł należy zaznaczyć w˛ezeł, który
bedzie
˛
jego rodzicem, a nast˛epnie wybrać z paska narz˛edzi polecenie Add
˛
node". Pojawi si˛e okno z lista˛ typów w˛ezłów, które moga˛ zostać dodane w
danym miejscu drzewa. Wybór typu w˛ezła powoduje dodanie nowego w˛ezła
do drzewa sceny.
Usuwanie wezła
˛
Aby usunać
˛ w˛ezeł z drzewa należy zaznaczyć wybrany w˛ezeł, a nast˛epnie
wybrać z paska narz˛edzi polecenie "Delete node". Usuni˛ety zostanie zarówno
zaznaczony w˛ezeł, jak i wszystkie jego w˛ezły potomne.
E.4. Okno wizualizacji 3D
57
Edycja wezła
˛
Aby edytować parametry w˛ezła należy zaznaczyć wybrany w˛ezeł.
W
panelu edycji pojawia˛ si˛e nazwy oraz wartości parametrów w˛ezła. Klikni˛ecie
pola z wartościa˛ umożliwia jego edycj˛e. Zatwierdzenie edycji nast˛epuje po
przyciśni˛eciu klawisza ENTER, badź
˛ też poprzez opuszczenie edytowanego
pola np. na skutek klikni˛ecia innego pola.
E.4. Okno wizualizacji 3D
Nawigacja
Nawigacja po scenie możliwa jest za pomoca˛ myszki. Możliwe jest obracanie, przesuwanie oraz przybliżanie sceny.
Obracanie sceny możliwe jest poprzez przyciśni˛ecie LPM i przesuni˛ecie
myszki.
Obrót dokonywany jest wokół poczatku
˛
układu współrz˛ednych
zaznaczonego w˛ezła.
Przesuwanie sceny możliwe jest poprzez przyciśni˛ecie PPM i przesuni˛ecie myszki.
Przybliżanie i oddalanie sceny możliwe jest poprzez wciśni˛ecie LPM i
PPM jednocześnie (lub środkowego przycisku myszy), a nast˛epnie przesuniecie
˛
myszki odpowiednio w góre˛ lub w dół.

Podobne dokumenty