Sterowanie manipulatorem w obecności przeszkód 1
Cel zadania
Utrwalenie umiejętności korzystania z szablonów std::vector<> i std::list<>.
2
Opis zadania
Niniejsze zadanie jest rozszerzeniem wcześniejszego zadania. Należy napisać program, który uwzględni obecność przeszkód w otoczeniu robota. Jeżeli użytkownik będzie chciał zmienić konfigurację manipulatora i w nowej konfiguracji zostanie wykryta kolizja z jakąś przeszkodą, to program powinien wyświetlić informację o kolizji oraz zaniechać zmiany konfiguracji, tzn.
w okienku wizualizującym manipulator powinien pozostać w poprzedniej konfiguracji przed momentem wykrycia kolizji.
3
Interfejs użytkownika
W wersji podstawowej interfejs użytkownika w stosunku do poprzedniego programu w ogóle nie musi ulec zmianie. Zakładamy, że zbiór przeszkód wczytujemy w momencie startu programu.
W wersji rozszerzonej program powinien umożliwiać wyświetlenie informacji o wybranej przeszkodzie (współrzędne jej wierzchołków), jej usunięcie lub dodanie nowej. Ta ostatnia operacja może polegać na podaniu nazwy pliku z opisem danej przeszkody. Program powinien sygnalizować błąd jeżeli danego pliku nie będzie można otworzyć.
W wersji jeszcze bardziej rozszerzonej operacja dodania przeszkody wymaga wprowadze-nia współrzędnych punktów oraz nazwy pliku, do którego będzie składowany opis przeszkody.
4
Reprezentacja przeszkód
4.1
Wersja 2D - podstawowa
Przeszkody mają być modelowane za pomocą wieloboków. Zakłada się, opisy przeszkód będą składowane w plikach tekstowych. Współrzędne poszczególnych wierzchołków będą poda-wane w osobnych liniach. Współrzędne pierwszego wierzchołka muszą być powtórzone na samym końcu (wynika to z tego, że gnuplot będzie rysował linię łamaną, której wierzchołki początku i końca muszą się połączyć). Przykład zawartości takiego pliku przedstawiony jest poniżej.
40 40
90 40
90 30
40 30
40 40
Jest to opis prostokąta, którego krótszy bok ma długość 10, zaś dłuższy 50. Wykrycie kolizji polega na stwierdzeniu, czy któryś z odcinków brzegu wieloboku przecina się z jakimkolwiek 1
Rysunek 1: Przykład wizualizacji manipulatora wraz z przeszkodami odcinkiem reprezentującym pojedyncze ogniwo (segment) manipulatora. Zetknięcie się manipulatora z przeszkodą jest również uważane za kolizję. Przykład rysunku manipulatora i przeszkód przedstawiony jest na rys. 1.
4.2
Wersja 3D
Niniejszy rozdział dotyczy tych wszystkich osób, które w pierwszej części wybrały wariant 3D.
Wykrywanie przecięć między bryłami jest zdecydowanie bardziej złożoną procedurą do im-plementacji. Ze względu na krótki czas realizacji zadania proponuje się przyjąć, że manipulator nie obraca się wzdłuż osi OZ (osi pionowej). Przeszkody w postaci brył można ulokować w obszarze płaszczyzny manipulatora, np. niech to będzie płaszczyzna YOZ.
W takim przypadku problem problem kolizji można uprościć i sprowadzić do problemu 2D, tzn.
szukać przecięć między szkieletem manipulatora, traktowanym jako linię łamaną, a obrysem rzutu przeszkody na płaszczyznę YOZ, który to rzut będzie wielobokiem. Idea sprowadzenia Rysunek 2: Idea sprowadzenia przypadku 3D do przypadku 2D.
przypadku 3D do 2D przedstawiona jest na rys. 2.
Dla osób, które pragną mimo wszystko zmierzyć się z trudniejszym przypadkiem, propono-wane jest wykrycie przecięć między bryłami.
2
Materiały pomocnicze
5.1
Źródła programów
Dodatkowe pomocnicze elementy ułatwiające rozpoczęcie realizację zadania można znaleźć na serwerze diablo lub panamint w katalogu ˜bk/edu/po/zad/z-manipulator2. W katalogu tym znajdują się następujące podkatalogi i pliki:
˜bk/edu/po/zad/z-manipulator2/.
przyklad_2D/Makefile
przyklad_2D/src/start.cpp
przyklad_2D/src/lacze_do_gnuplota.cpp
przyklad_2D/inc/lacze_do_gnuplota.hh
przyklad_2D
Katalog zawiera przykład odrobinę bardziej rozbudowany niż przykład z poprzedniego zadania. Zawiera on dwa pliki opisujące przeszkody jako wieloboki oraz dwie do-datkowe linie kodu w samym programie, które odpowiedzialne są za dołączenie tych plików do polecenia przekazywanego gnuplotowi. Odpowiedzialne jest ono za wymuszenie rysowania przez gnuplot wieloboków reprezentujących wspomniane wcześniej przeszkody.
5.2
Prezentacja
W sekcji pomoc udostępniona została prezentacja, w której przedstawione jest rozwiązanie problemu detekcji przecięcia odcinak z przeszkodą. W tym zadaniu wystarczy ograniczyć się do wykrycia przecięcia odcinka z odcinkiem lub ich zetknięcia. Nie trzeba rozstrzygać przypadku wnikania odcinka w przeszkodę, który jest dość szczegółowo analizowany w tej prezentacji.
3