Zad. 10: Sterowanie manipulatorem cz. 2 i 3 1 Cel ćwiczenia Zapoznanie się dziedziczeniem klas oraz mechanizmami niejawnego rzutowania w górę. Przyswojenie pojęcia klasy abstrakcyjnej i praktyczne jej wykorzystanie w programie. Wykształcenie umiejętności posługiwania się metodami wirtualnymi i metodami abstrakcyjnymi. 2 Program zajęć Ocena realizacji zadania z poprzedniego laboratorium ocenie podlega poprawność realizacji zadania, styl pisania programu oraz dokumentacja wygenerowana za pomocą systemu doxygen. Ocena przygotowania do zajęć ocenie podlega diagram klas i diagram czynności (patrz rozdział 4.1). Modyfikacja programu wg wskazań osoby prowadzacej ocenie będzie podlegała poprawność realizacji modyfikacji. Pracę nad modyfikacją programu (wszystkie operacje należy wykonywać na kopii) należy rozpocząć już w trakcie pierwszej fazy laboratorium, gdyż prowadzący nie będzie w stanie ocenić wcześniejszego programu wszystkim jednocześnie. Realizacja wstępnej fazy prac nad nowym zadaniem należy stworzyć uproszczoną wersję programu, która będzie rysowała dwa manipulatory. Ocena realizacji wstępnej fazy zadania 3 Opis zadania programowego Niniejsze zadanie jest rozszerzeniem wcześniejszego zadania. Należy napisać program, który w otoczeniu manipulatora (tzn. na scenie roboczej) uwzględni obecność przeszkód dwojakiego typu. Są nimi przeszkody modelowane poprzez wieloboki oraz przeszkody, którymi są inne manipulatory. Teraz przy zmianie postury manipulatora należy sprawdzić czy w trakcie zmiany postury występuje kolizja, czy też nie. Jeśli wystąpi kolizja, to należy przerwać działanie programu i wyświetlić typ przeszkody (manipulator lub wielobok) oraz jej nazwę przeszkody. Następnie należy zakończyć działanie programu. Uwaga: W trakcie zmiany postury należy również sprawdzić, czy manipulator sam ze sobą nie koliduje. Tak więc manipulator sam dla siebie jest też przeszkodą. 4 Przygotowanie do zajęć 4.1 Tydzień 0 Przed zajęciami należy stworzyć diagram klas dla całego programu uwzględniającego tylko manipulatory jako przeszkody. Należy też stworzyć odpowiedni diagram czynności dla operacji sprawdzania kolizji danego manipulatora z innym manipulatorem. 1
4.2 Tydzień 1 Rysunek 1: Przykład wizualizacji sceny roboczej manipulatora Należy stworzyć diagram klas dla całego programu z uwzględnieniem wieloboków jako przeszkód. Tak więc teraz do zbioru przeszkód należą manipulatory, jak też wieloboki. Ponadto należy napisać diagram czynności sprawdzania kolizyjności dla manipulatora z wielobokiem oraz drugi czynności obrazujący sprawdzanie kolizyjności manipulatora ze wszystkimi przeszkodami na scenie roboczej. 5 Działanie programu Tak jak we wcześniejszej wersji programu, tak i w tej, program ma nie mieć żadnego menu. Wszystkie dane wczytywane są z plików, których nazwy podane są w linii wywołania programu. Składnia wywołania programu:./a.out plik_konfiguracji.dat plik_sceny.dat plik_postury1.dat [ plik_postury2.dat... ] Plik zawierający opis konfiguracji manipulatora oraz pliki postury manipulatora mają identyczną postać jak we wcześniejszej części zadania. Plik plik_sceny.dat zawiera opis sceny roboczej, tzn. rodzaj przeszkód i dane określające ich położenie. Ogólny schemat działania programu jest analogiczny jak w części pierwszej zadania. Program czyta konfigurację manipulatora oraz opis sceny roboczej. Wyświetlony zostaje manipulator oraz pozostałe elementy sceny, tzn. inne manipulatory oraz wieloboki. Następnie po 2s wczytuje pierwszą posturę i sprawdza czy koliduje ona z jakąś przeszkodą na scenie (tzn. wielobokiem, innym manipulatorem lub ze samym sobą). Następnie wyświetla aktualny stan sceny (niezależnie od tego czy jest kolizja czy też nie). Jeśli została stwierdzona kolizja, to program wyświetla informację z jaką przeszkodą nastąpiła kolizja (tzn. rodzaj przeszkody i jej nazwę, dla pierwszego manipulatora, który jest sterowany można przyjąć dowolną własną nazwę). Następnie przerywa czytanie nowych postur i przechodzi w stan oczekiwania na naciśnięcie klawisza ENTER, aby zakończyć działanie. Jeżeli w nowej konfiguracji manipulator nie koliduje z żadną przeszkodą, to program rysuje ją, odczekuje 1s i przechodzi do czytania następnej postury. 5.1 Składnia pliku opisu scen W pliku z opisem sceny w każdej linii umieszczone są dane dotyczące przeszkody znajdującej się na scenie roboczej. W pierwszym tygodniu zawartość pliku jest ograniczona tylko 2
do innych manipulatorów. W drugim tygodniu plik opisu sceny będzie uzupełniony o opisy przeszkód w postaci wieloboków. 5.1.1 Składnia pliku dla pierwszego tygodnia zadania Format pliku ma postać: M: nazwa_manipulatora1 (x0_1 y0_1) plik_konfiguracji.dat plik_postury.dat M: nazwa_manipulatora2 (x0_2 y0_2) plik_konfiguracji.dat plik_postury.dat... Pierwsze dwa znaki (tzn. M:) określają typ przeszkody. W tym przypadku odnoszą się one do manipulatora. Następnym elementem jest nazwa manipulatora. Stanowi ją ciąg znaków, który nie jest rozdzielony żadnym znakiem białym (spacja, znak tabulacji itd.). Kolejnym elementem są współrzędne podstawy manipulatora, a następnie plik konfiguracji i postury manipulatora. Pliki te mają identyczną postać i znacznie jak w pierwszej części zadania. Należy więc zastosować ten sam schemat do stworzenia nowego manipulatora. Różnica polega jedynie na tym, że do wyznaczonych współrzędnych wszystkich przegubów należy dodać współrzędne podstawy, które odpowiadają w tym przypadku wektorowi translacji. Plik może mieć dowolną ilość pustych linii. Przykład zawartości pliku: M: Manipulator_Maly (-50 0) scena1/konf_manip_m.dat scena1/postura_manip_m.dat M: Manipulator_3 (100 0) scena1/konf_manip_3.dat scena1/postura_manip_3.dat M: Manipulator_4 (55 0) scena1/konf_manip_4.dat scena1/postura_manip_4.dat 5.1.2 Składnia pliku dla drugiego tygodnia zadania W drugim tygodniu program powinien być w stanie przeczytać plik, który oprócz opisów manipulatorów będzie zawierał opisy wieloboków. Tak więc ogólny format pliku ma postać: W: nazwa_wieloboku1 (x1 y1) (x2 y2)... (xn yn) W: nazwa_wieloboku2 (x1 y1) (x2 y2)... (xm ym) M: nazwa_manipulatora1 (x0_1 y0_1) plik_konfiguracji.dat plik_postury.dat W: nazwa_wieloboku3 (x1 y1) (x2 y2)... (xl yl) M: nazwa_manipulatora2 (x0_2 y0_2) plik_konfiguracji.dat plik_postury.dat... W linii opisującej wielobok oprócz oznaczenia typu przeszkody znajduje się jej nazwa i współrzędne poszczególnych wierzchołków. Przykład zawartości pliku: W: Przeszkoda_A (20 0) (20 20) (40 20) (40 0) M: Manipulator_Maly (-50 0) scena1/konf_manip_m.dat scena1/postura_manip_m.dat W: Przeszkoda_B (20 40) (20 80) (40 80) (40 40) M: Manipulator_3 (100 0) scena1/konf_manip_3.dat scena1/postura_manip_3.dat M: Manipulator_4 (55 0) scena1/konf_manip_4.dat scena1/postura_manip_4.dat 5.2 Reakcja na błędy Reakcja na błędy w plikach konfiguracji, czy też postury manipulatorów powinna być analogiczna jak w części pierwszej niniejszego zadania. Ponadto jeżeli w trakcie przetwarzania pliku 3
opisu sceny wystąpią błędy fatalne prowadzące do przerwania działania aplikacji, to należy wyświetlić numer linii, której przetwarzanie doprowadziło do wystąpienia tego typu błędu. Błędy w opisie wieloboku (np. błąd czytania liczby) traktujemy jako błędy fatalne. Należy wówczas wyświetlić odpowiedni komunikat i przerwać działanie aplikacji. 6 Przykład działania programu Niniejszy przykład nie obejmuje widoku okienka z rysunkiem wygenerowanym przez program gnuplot. Przedstawioną formę interakcji z użytkownikiem należy traktować jako obowiązującą. jkowalsk@panamint: rozwiazanie>./manipulator konfig.dat scenax.dat post1.dat post2.dat post3.dat Konfiguracja: Dlugosc ogniwa_0: 40 Dlugosc ogniwa_1: 45.5 Dlugosc ogniwa_2: 64.5 Dlugosc ogniwa_2: 32 q0 = 90.0 Przegub_0: (0.0, 0,0) q1 = 0.0 Przegub_1: (0.0, 40.0) q2 = 0.0 Przegub_2: (0.0, 85.5) q3 = 0.0 Przegub_3: (0.0, 150.0) Efektor: (0.0, 182.0) Postura wczytana z post1.dat q0 = 75.2 Przegub_0: (0.0, 0,0) q1 = -20.0 Przegub_1: (10.2, 38.7) q2 = -31.0 Przegub_2: (36.2, 76.0) q3 = -15.0 Przegub_3: (95.0, 102.5) Efektor: (126.6, 107.6) Postura wczytana z post2.dat q0 = 100.0 Przegub_0: (0.0, 0,0) q1 = -30.0 Przegub_1: (-6.9, 39.4) q2 = -41.0 Przegub_2: (8.6, 82.1) q3 = -25.0 Przegub_3: (65.0, 113.4) Efektor: (97.0, 115.7) KOLIZJA!!! Wystąpila kolizja z wielobokiem o nazwie: Przeszkoda_X Dzialanie programu zostalo przerwane. Aby zakonczyc nacisnij klawisz ENTER... Przedstawiony przykład należy uznać za obligatoryjny pod względem rodzaju i sposobu wyświetlania informacji. 4
7 Wymagania Oprócz samego programu należy stworzyć i wygenerować za pomocą programu doxygen dokumentację programu. Powinna ona zawierać diagramy wymagane w ramach przygotowania do zajęć. Diagramy powinny zostać odpowiednio zaktualizowane, aby odzwierciedlały stan faktyczny zaimplementowanego rozwiązania. 8 Rozszerzenia dla chętnych Niniejszy rozdział dotyczy tych wszystkich osób, które w pierwszej części wybrały wariant 3D. Implementacja wykrywania przecięć między byłami jest zdecydowanie bardziej złożoną procedurą. 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 rysunku powyżej. Dla osób, które pragną mimo wszystko zmierzyć się z trudniejszym przypadkiem, proponowane jest wykrycie przecięć między bryłami. 5