Planowanie scie˙zki – metoda potencjałowa

Transkrypt

Planowanie scie˙zki – metoda potencjałowa
Planowanie ścieżki – metoda potencjałowa
1
Cel zadania
Nabycie umiej˛etności korzystania z szablonów std::vector<> i std::list<>.
2
Opis zadania
Należy napisać program, który umożliwi przemieszczenie punktowego robota z pozycji startowej do pozycji docelowej. Ścieżka, wzdłuż której ma przemieszczać si˛e robot, ma umożliwić
mu omini˛ecie przeszkód. Zakłada si˛e, że przeszkody reprezentowane sa˛ przez koła, które moga˛
mieć różne promienie.
Program powinien umożliwić zmian˛e rozmieszczenia przeszkód, ich ilość oraz wielkość.
Powinien również pozwalać na zmian˛e współrz˛ednych punktu docelowego oraz punktu startowego, jak też parametrów zastosowanego algorytmu. Pełna lista elementów, które powinny
podlegać zmiane znajduje si˛e w przykładzie działania programu (patrz rozdz. 4).
3
Metoda rozwiazania
˛
Do rozwiazania
˛
problemu należy zastosować podejście potencjałowe. Bazuje ono na analogii zachowania si˛e ładunków elektrycznych. Rozważajac
˛ tylko oddziaływania elektrostatyczne
można przyjać,
˛ że przeszkody maja˛ ten sam ładunek jaki ma przemieszczajacy
˛ si˛e obiekt punktowy (robot). Natomiast punkt docelowy ma ładunek przeciwny. Dobierajac
˛ odpowiednio wielkość ładunków punkt docelowy w naturalny sposób b˛edzie przyciagał
˛ robota, zaś przeszkody
b˛eda˛ go odpychały.
Wykorzystuja˛ opisana˛ ide˛e, zadanie sterowania ruchem robota należy rozwiazać
˛ iteracyjnie.
Przyjmujemy, że robot w każdym kroku iteracji przemieszcza si˛e o stała odległość dR . Przyjmujemy również jako warunek zakończenia działania algorytmu pewna˛ odległość do celu dε .
Jeżeli odległość robota od celu b˛edzie poniżej dε , to uważamy zadanie za rozwiazane.
˛
Rysunek 1: Idea sterowania ruchem robota w oparciu o model pól elektrostatycznych.
Najdogodniej jest przyjać,
˛ że
dε = 0.55dR .
Rozwiazanie
˛
sterowanie ruchem robota można wykonać w kilku podstawowych krokach:
1. Sprawdź czy odległość robota od celu jest mniejsza niż dε . Jeżeli tak, to cel został osia˛
gni˛ety i zakończ działanie. W przypadku przeciwnym przejdź do nast˛epnego kroku.
2. Wyznacz kierunek siły działajacej
˛ na robota.
3. Przesuń robota wzdłuż wyznaczonego kierunku o dR .
4. Przejdź do punktu 1.
Opisana metoda nie gwarantuje znalezienia rozwiazania
˛
dla każdej konfiguracji przeszkód.
Spowodowane jest to wyst˛epowaniem lokalnych minimów potencjału. Dlatego też, aby nie
doprowadzić do zap˛etlenie programu w opisanej powyżej procedurze należy wprowadzić dodatkowy warunek stopu. B˛edzie nim ilość wykonanych kroków.
4
Przykład działania programu
jkowalsk@noxon: zad>./sterow_robotem
Menu glowne:
s - start algorytmu
p - przywroc pozycje wyjsciowa
z - zmiana wspolrzednych startu
c - zmiana wspolrzednych celu
u - usun przeszkode
w - wstaw nowa przeszkode
e - edytuj przeszkode
d - zmiana dlugosci pojedynczego przemieszczenia
i - zmiana jednorazowej ilosci krokow
l - zmiana ladunku celu
a - wyswietl aktualny stan sceny i robota
? - wyswietlenie menu
k - wyjscie z programu
(Wyswietl menu: ?) > a
Aktualny stan:
Dlugosc pojedynczego przemieszczenia: 2
Jednorazowa ilosc krokow: 10
Ilosc wykonanych krokow: 0
Start: (20.0, 10.0)
====> Robot: (20.0, 10.0)
Cel: (70.0, 70.0)
Ladunek celu: -100.0
Polozenie przeszkod:
1: (10.0,
2: (30.0,
3: (14.0,
4: (25.0,
20.0)
40.0)
25.0)
30.0)
Rozmiar:
Rozmiar:
Rozmiar:
Rozmiar:
3
6
2
3
(Wyswietl menu: ?) > s
Laczna ilosc krokow: 10
Aktualna pozycja robota: (38.6, 6.7)
:-\ Cel nie jest jeszcze osiagniety.
(Wyswietl menu: ?) > s
Laczna ilosc krokow: 20
Aktualna pozycja robota: (54.1, 19.0)
:-\ Cel nie jest jeszcze osiagniety.
(Wyswietl menu: ?) > a
Aktualny stan:
Dlugosc pojedynczego przemieszczenia: 2.0
Jednorazowa ilosc krokow: 10
Ilosc wykonanych krokow: 20
Start: (20.0, 10.0)
====> Robot: (54.1, 19.0)
Cel: (70.0, 70.0)
Ladunek celu: -100.0
Polozenie przeszkod:
1: (10.0,
2: (30.0,
3: (14.0,
4: (25.0,
(Wyswietl menu: ?) >_
20.0)
40.0)
25.0)
30.0)
Rozmiar:
Rozmiar:
Rozmiar:
Rozmiar:
3
6
2
3
Rysunek 2: Zrzut okienka obrazujacej
˛ aktualny stan sceny.
5
Materiały pomocnicze
Dodatkowe pomocnicze elementy ułatwiajace
˛ rozpocz˛ecie realizacj˛e zadania znaleźć można na
serwerze diablo lub panamint w katalogu ˜bk/edu/po/zad/z6. W katalogu tym znajduja˛
si˛e nast˛epujace
˛ podkatalogi i pliki:
˜bk/edu/po/zad/z6/.
bin.diablo/sterow_robotem
bin.panamint/sterow_robotem
przyklad1/Makefile
przyklad1/src/start.cpp
przyklad1/src/lacze_do_gnuplota.cpp
przyklad1/inc/lacze_do_gnuplota.hh
przyklad2/Makefile
przyklad2/src/start.cpp
przyklad2/src/lacze_do_gnuplota.cpp
przyklad2/inc/lacze_do_gnuplota.hh
bin.diablo/sterow_robotem, bin.panamint/sterow_robotem Sa˛ to programy binarne. Stanowia˛ one przykład realizacji programu, w wersji podstawowej, który został skompilowany
odpowiednio na serwerze diablo i na serwerze panamint.
przyklad1 Katalog zawiera przykład użycia modułu lacze_do_gnuplota pozwalajacego
˛
uruchomić program gnuplot z poziomu własnego programu i nawiazać
˛
z nim komunikacj˛e.
W przykładzie pokazane jest rysowanie z wykorzystaniem grafiki 2D.
przyklad2 Katalog zawiera rozszerzenie przykładu znajdujacego
˛
si˛e w podkatalogu przyklad1.
W rozszerzeniu tym zostało pokazane użycie szablonu listy std::list<>.
5.1
Sposób wykorzystania przykładów
Zastosowana w dostarczonych przykładach technika wykorzystania programu gnuplot do wyświetlenia stanu sceny polega na przygotowaniu w plikach odpowiednich danych, a nast˛ep-
nie wymuszeniu wyświetlenia ich przez program gnuplot. We wspomnianych przykładach
plikami tymi sa:
˛ dat/robot.xyr, dat/start.xyr, dat/cel.xyr, dat/przeszkody.xyr,
dat/sciezka.xy.
Wszystkie pliki maja˛ postać tekstowa.˛ W plikach z rozszerzeniem xyr w pojedynczej linii zapisywane sa˛ współrz˛edne punktu x i y oraz rozmiar kółka, którym oznaczany jest dany punkt.
Przykładowa zawartość pliku dat/robot.xyr to:
20.7 10.5 5
Uwaga: rozmiar zawsze musi być liczba˛ całkowita˛ wi˛eksza˛ niż 0. Zaleca si˛e, aby nie był
wi˛ekszy niż 20.
W plikach dat/robot.xyr, dat/start.xyr, dat/cel.xyr znajduja˛ si˛e współrz˛edne i rozmiar tylko pojedynczego punktu. W pliku dat/przeszkody.xyr liczba punktów odpowiada
ilości przeszkód, które sa˛ symbolizowane przez te punkty.
Nieco odmienna˛ budow˛e ma plik dat/sciezka.xy. znajduja˛ si˛e w nim tylko i wyłacznie
˛
współrz˛edne kolejnych punktów ścieżki robota. Na tej podstawie rysowana jest łamana odzwierciedlajaca
˛ kształt ścieżki.
Przekazaniem danych z pliku do programu gnuplot (tak jest w przypadku plików z rozszerzeniem xyr) lub też wskazaniem mu z jakich plików maja˛ być bezpośrednio pobierane dane
(tak jest w przypadku plików z rozszerzeniem xy) zajmuje si˛e obiekt klasy PzG::LaczeDoGNUPlota
(w dostarczonych przykładach wyst˛epuje on pod nazwa˛ Lacze). Programista musi jedynie podać nazwy plików, z których b˛eda˛ pobierane dane. Można to zrobić za pomoca˛ odpowiednich
metod z klasy PzG::LaczeDoGNUPlota:
• dla plików *.xyr jest to metoda DodajNazwePliku_PunktyRoznejWielkosci,
• dla plików *.xy jest to metoda DodajNazwePliku_Lamana.
Ogólny schemat działania programu, który wymusi właściwe narysowanie aktualnego stanu
sceny roboczej, powinien wygladać
˛
nast˛epujaco:
˛
1. Wykonaj zadana˛ sekwencj˛e kroków i przemieść robota. Zapami˛etaj współrz˛edne kolejnych punktów, do których dotarł robot.
2. Zapisz do pliku dat/robot.xyr aktualna˛ pozycj˛e robota i jego rozmiar. Do pliku dat/sciezka.xy
zapisz punkty, do których dotarł robot w poszczególnych krokach.
3. Wywołaj metod˛e Rysuj() obiektu stanowiacego
˛
łacze
˛ z programem gnuplot.
Edycja położenia przeszkód, czy też punktu startu lub punktu docelowego wia˛że si˛e z odpowiednia˛ aktualizacja˛ zapisów odpowiednio w plikach dat/przeszkody.xyr, dat/start.xyr,
dat/cel.xyr.
Kasowanie ścieżki powinno być zrealizowane w ten sposób, że zapis w pliku dat/sciezka.xy
redukowany jest do aktualnej pozycji robota.
Uwaga: Przed wywołaniem metody Rysuj() wszystkie pliki, z których maja˛ być pobierane
dane musza˛ istnieć i mieć prawidłowa˛ struktur˛e.
5.2
Dla użytkowników MS Windows – Uruchomienie rysowania w trybie
interaktywnym
Dołaczony
˛
moduł łacza
˛
do programu gnuplot umożliwia z nim współprac˛e tylko w systemie
UNIX i systemach UNIXopodobnych (np. Linux). Pracujac
˛ pod kontrola˛ innych systemów
operacyjnych (np. MS Windows) niestety nie można skorzystać z ułatwień, które dostarcza ten
moduł.
Można jednak uruchomić program gnuplot w trybie interaktywnym (program można pobrać
ze strony http://www.gnuplot.info). Jest to bardziej ucia˛żliwe niemniej realizacja zadania
jest wcia˛ż możliwa. Uruchamiamy go poleceniem gnuplot, a nast˛epnie wydajemy polecenie
ustawiajace
˛ zakres współrz˛ednych, np.:
gnuplot> set xrange [0:100]
gnuplot> set yrange [0:80]
Nast˛epnie można uruchomić rysowanie zawartości plików z danymi. Przykładowe polecenie
prezentowane jest poniżej:
gnuplot> plot ’dat/sciezka.xy’ w l, ’dat/robot.xyr’ w errorbars,\
’dat/cel.xyr’ w errorbars, ’dat/start.xyr’ w errorbars,\
’dat/przeszkody.xyr’ w errorbars
Polecenie to trzeba b˛edzie powtarzać po każdorazowej zmianie zawartości plików. Jego efekt
nie jest imponujacy.
˛ Niemniej pozwala zorientować si˛e w położeniu poszczególnych elementów
na scenie. Przykład zrzutu okienka przedstawiony jest poniżej.
Rysunek 3: Zrzut okienka obrazujacego
˛
aktualny stan sceny. Rysunek został utworzony z wykorzystaniem polecenia przedstawionego powyżej.
6
Rozszerzenie zadania – cz˛eść nieobowiazkowa
˛
W ramach wersji rozszerzonej należy zrealizować obraz sceny robota w postaci przestrzennego
wykresu rozkładu potencjału. Wartości potencjału można wyliczyć modelujac
˛ przeszkody jako
punkty, tak jak w wersji podstawowej. Jako dalsze rozrzerzenie proponuje si˛e rozważyć repezentacj˛e przeszkód w postaci wieloboków.
Wszystkie niezb˛edne materiały, zarówno od strony teoretycznej jak też przykładów użycia łacza
˛
do programu gnuplot, można znaleźć w sekcji Dodatki .