Interpreter opisu dziaªa«quadrokoptera wtyczki 1 Ogólny opis zadania Bazuj c na wcze±niej napisanym programie nale»y go przerobi w ten sposób, aby ka»dy rodzaj z wczytywanych polece«byª obsªugiwany przez odpowiedni moduª w postaci osobnej wspóªdzielonej biblioteki (ang. shared library). Program powinien dopuszcza mo»liwo± rozszerzenia skªadni opisu ruchu zrobotyzowanego quadrokoptera poprzez dopuszczenie istnienia nowych polece«, które b d mogªy by dodawane w trakcie dziaªania programu. Mechanizm ma bazowa na wtyczkach, które b d dynamicznie konsolidowanymi bibliotekami. Wª czenie jednej wtyczki ma umo»liwia interpretacj pojedynczego nowego polecenia. Nale»y przyj,»e dotychczasowe polecenia b d tak»e dodawane do programu na starcie zgodnie z opisanym mechanizmem. Utworzone wtyczki maj dostarcza mechanizmów sterowania robotem. W oparciu o stworzony j zyk polece«nale»y napisa skrypt, który pozwoli przemie±ci si robotowi wzdªu» ±cie»ki opisanej w podrozdziale 4 i dokona prostej manipulacji obiektami na scenie roboczej. Stan sceny ma by opisany w zewn trznym pliku bazuj cym na skªadni XML. Gramatyka pliku jest przedstawiona na przykªadzie opisu zawartego w rodziale 4. W obecnym zadaniu zakªadamy,»e quadrokopter ma chwytak podwieszony po spodem. Pozwala on chwyci dany przedmiot i przenie± w inne miejsce. W podstawowej wersji zadania traktujemy, b dziemy traktowa przenoszone obiekty jako niewa»kie. Oprócz wymienionych cech program ma udost pnia u»ytkownikowi histori polece«na tej samej zasadziej, jak to jest zrobione np. w powªoce bash (naci±ni cie strzaªki w gór poprzednie polecenie). Do implementacji historii polece«i odpowiedniego zaproszenia nale»y wykorzysta bibliotek funkcje z pakietu readline. 2 Skªadnia nowych polece«nale»y oprogramowa jedno nowe polecenia w postaci wcze±niej wspomnianej wtyczki. S nimi: Grasper chwycenie przedmiotu (zamkni cie chwytaka) lub jego zwolnienie (otwarcie chwytaka). Zakªadamy,»e robot mo»e chwyci obiekt, gdy ustawiony bezpo- ±rednio nad nim. W wersji podstawowej mo»na traktowa,»e quadrokopter jest obiektem punktowym (podobnie jak sam przedmiot). W dalszej cz ±ci przedstawiona jest skªadnia polecenia oraz przykªad jego u»ycia. Przykªad konstrukcji quadrokoptera wyposa»onego w chwytak jest przedstawiony na rys. 1. 2.1 Polecenie Grasper Powoduje zaci±niecie chwytaka lub jego zwolnienie. Skªadnia polecenia: Grasper stan_chwytaka; Parametr stan_chwytaka mo»e przyjmowa dwie warto±ci 0 lub 1. Odzwierciedlaj one fakt,»e chwytak zostaª opuszczony i zwolniony lub zaci±ni ty i podniesiony. Chwytak mo»e uchwyci obiekt punktowy, o ile wspomniany obiekt znajduje si wzgl dem efektora w odlegªo±ci nie wi kszej ni» 0, 1mm. Zakªadamy,»e chwytak umieszczony pod spodem quadrokoptera w jego centralnej cz ±ci. Zakªada si ponadto,»e operacja chwycenia lub te» zwolnienia obiektu trwa 1s. 1
Rysunek 1: Przykªad realizacji quadrokoptera z chwytakiem oraz implementacji chwytu charakterystycznego dla ptaków drapie»nych (¹ródªo: http://www.youtube.com/watch?v=ol8c9bdp7yi) 2
3 Interfejs polece«i wtyczek W tym przypadku przez interfejs rozumiana jest specykacja funkcji, które musz by dostarczone przez bibliotek wspóªdzielon. Tak wi c ka»da wtyczka musi zawiera implementacje wspomnianych funkcji. Funkcje te to: void PrintSyntax() wy±wietla nazw i skªadni danego polecenia, np.: Rotate angle_speed[deg/s], angle_change[deg]; Command* CreateCmd() tworzy obiekt klasy dziedzicz cej klas Command. Funkcja zwraca wska¹nik na podobiekt klasy Command zawarty w obiekcie klasy pochodnej. const char* GetCmdName() zwraca wska¹nik do napisu b d cego nazw danego polecenia. W przypadku polecenia Rotate b dzie to wska¹nik na napis Rotate. 4 Organizacja sceny Zakªadamy,»e w chwili pocz tkowej poza robota to (0mm, 0mm, 0mm, 0 ). Na scenie znajduj si trzy obiekty punktowe A, B i C. Ich poªo»enie to A = (5, 5, 0), B = (10, 5, 0) i C = (15, 5, 0). Opis sceny zakªadamy,»e jest zwarty w zewn trznym pliku scena.xml Plik powinien mie posta <Scene xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:nonamespaceschemalocation='grammar/scene.xsd' > <Object Name="A"> <Parameter Name="Coordinate_x" Value="5"/> <Parameter Name="Coordinate_y" Value="5"/> <Parameter Name="Coordinate_z" Value="0"/> </Object> <Object Name="B"> <Parameter Name="Coordinate_x" Value="10"/> <Parameter Name="Coordinate_y" Value="5"/> <Parameter Name="Coordinate_z" Value="0"/> </Object> <Object Name="A"> <Parameter Name="Coordinate_x" Value="15"/> <Parameter Name="Coordinate_y" Value="5"/> <Parameter Name="Coordinate_z" Value="0"/> </Object> </Scene> Zadanie: Dla opisanej sceny nale»y napisa skrypt steruj cy prac robota, tak aby dokonaª on odpowiedniego przemieszczenia obiektów (i mo»e kªa± jeden obiekt na drugim). Po zako«czeniu swoich dziaªa«robot powinien mie poz (0, 0, 0, 0 ) za± poªo»enia obiektów, to A = (15, 5, 0), B = (5, 5, 0) i C = (10, 5, 0). Uwaga: Test poprawno±ci dziaªania b dzie objemowaª zmian pozycji obiektów. Je±li obiekt b dzie w innej pozycji, to robot nie powinien go chwyci. Jednak nadal powinien porusza si wzdªu» zadanej ±cie»ki i wykona reszt polece«. 3
5 Wymagania co do programu Podobnie jak w przypadku poprzedniego zadania program ma dostarcza proste menu tekstowe. Menu programu powinno zawiera wszystkie elementy, który byªy dost pne we wcze±niejszym zadaniu. Oprócz tego nale»y rozszerzy pozycj menu pokazuj c stan robota o wy±wietlanie stanu sceny, tzn. poªo»enia obiektów A, B i C. W menu musi si równie» znale¹ opcja umo»liwiaj ca zaªadowanie nowej wtyczki. Jak te» zwolnienie jednej z ju» zaªadowanych wtyczek. W momencie startu program powinien ªadowa wtyczki odpowiadaj ce za interpretacj i wykonanie polece«fly i Rotate. Wtyczki odpowiedzialne za polecenie Grasper powinna by ªadowana na» danie poprzez wykorzystanie nowej opcji z menu. Ksztaªt ±cie»ki wzdªu» której przemie±ci si robot powinien zosta zapisany w pliku tekstowym, jako zbiór wspóªrz dnych kolejnych punktów. Wspóªrz dne pojedynczego punktu powinny by zapisane w jednej linii. Orientacja quadrokoptera powinna by zapisana po znaku '#'. Mi dzy liniami nie powinno by»adnych odst pów, np. 1.0 0.0 1.0 # 0 2.3 0.0 2.5 # 0 2.3 0.0 2.5 # 90 2.3 4.8 2.0 # 90 Plik z zapisan ±cie»k ruchu powinien mie nazw sciezka.dat. Moment chwycenia i trzymania obiektu powinien by równie» zapisany po znaku '#', np. 2.3 0.0 2.5 # 0 2.3 0.0 0.0 # 0 2.3 0.0 0.0 # 0 Chwycil obiekt A 2.3 0.0 2.5 # 0 Trzyma obiekt A 2.3 0.0 2.5 # 90 Trzyma obiekt A 2.3 2.0 2.5 # 90 Trzyma obiekt A 2.3 2.8 0.0 # 90 Trzyma obiekt A 2.3 2.8 0.0 # 90 Puscil obiekt A 2.3 2.8 2.0 # 90 6 Przykªad uruchomienia i interakcji z programem Niniejszy przykªad demonstruje posta menu i przykªadowe komunikaty w trakcie dziaªania programu. Dotyczy on wersji podstawowej, w której zakªada si,»e robot jest punktem materialnym. SunOS 21>./interp4qk w - wczytanie z pliku sekwencji instrukcji dla robota p - pokaz wczytana sekwencje instrukcji i - pokaz dostepne instrukcje s - start wykonywania sekwencji instrukcji q - stan robota i sceny d - dodanie nowej wtyczki (instrukcji) u - usuni cie wtyczki (instrukcji)? - wyswietl ponownie menu 4
k - koniec dzialania programu Twoj wybor (? - menu): i Fly Rotate speed_hor[m/s], speed_ver[m/s], dist[m]; ang_speed[deg/s], ang[deg]; Twoj wybor (? - menu): d Podaj nazwe polecenia, dla ktorego ma zostac dodana wtyczka. Nazwa polecenia: Grasper :) Polecenie zostalo poprawnie dodane. Twoj wybor (? - menu): i Grasper state; Fly speed_hor[m/s], speed_ver[m/s], dist[m]; Rotate ang_speed[deg/s] ang[deg]; Twoj wybor (? - menu): w Podaj nazwe pliku: przelot_robota.cmd Plik 'przelot_robota.cmd' zostal wczytany poprawnie. Twoj wybor (? - menu): p Grasper 0; Fly 0, 0.5, 1; Fly 2, 0, 5; Rotate 60, 90; Fly 2, 0, 5; Fly 0, -0.25, 1; Grasper 1; Fly 0, 0.4, 1; Twoj wybor (? - menu): q Robot: ( 5.0, 5.0, 1.0, 90 ); A: ( 5.0, 5.0, 1.0 ) B: ( 10.0, 5.0, 0.0 ) C: ( 15.0, 5.0, 0.0 ) Twoj wybor (? - menu): s 5
Wykonaje polecenie: Grasper 0 t= 1.00; Chwytak otwarty. Brak obiektu. Wykonuje polecenie: Fly 0, 0.5, 1; t= 2.00; Robot = ( 0, 0, 1, 0 ); Wykonuje polecenie: t = 2.00; Robot = ( 0, 0, 1, 0 ); Wykonuje polecenie: Fly 2, 0, 5; t = 4.50; Robot = ( 5, 0, 1, 0 ); Wykonuje polecenie: Rotate 60, 90; t = 6.00; Robot = ( 5, 0, 1, 90 ); Wykonuje polecenie: Fly 2, 0, 5; t = 8.50; Robot = ( 5, 5, 1, 90 ); Wykonuje polecenie: t = 8.50; Robot = ( 5, 5, 1, 90 ); Wykonuje polecenie: Fly 0, -0.25, 1; t = 12.50; Robot = ( 5, 5, 0, 90 ); Wykonuje polecenie: Grasper 1; t = 12.50; Robot = ( 5, 5, 0, 90 ); Chwycony obiekt A Wykonuje polecenie: Fly 0, 0.4, 1; t = 15.00; Robot = ( 5, 5, 0, 90 ); Trzyma obiekt A 6
Wykonuje polecenie: t = 15.00; Robot = ( 5, 5, 0, 90 ); Trzyma obiekt A Koniec ciagu polecen Twoj wybor (? - menu): q Robot: ( 5.0, 5.0, 1.0, 90.0); A: ( 5.0, 0.0, 1.0) -> Obiekt jest w chwytaku robota B: ( 10.0, 5.0, 0.0) C: ( 15.0, 5.0, 0.0) Twoj wybor (? - menu): k Koniec dzialania programu. SunOS 22> _ 7 Rozszerzenia 7.1 Wersja 2D najprostsza Zakªadaj c,»e robot ma rozmiary punktowe proponuje wykorzysta si moduª lacze_do_gnuplota dla wizualizacji ±cie»ki robota 2D i animacji jego ruchu. Zaznaczenie poªo»enia punktów trzeba zrealizowa wykorzystuj c tryb rysowania punktowy A, B i C. Sposób ten pokazany jest z zaª czonym przykªadzie. 7.2 Wersja 2D ciekawsza Nale»y przyj,»e robot ma pewne rozmiary. Proponuje si wizualizowa go jako prostok t z zaznaczeniem frontu robota. Do wizualizacji proponuje si wykorzysta moduª lacze_do_gnuplota zarówno do animacji samego robota jak te» wizualizacji ±cie»ki jego ruchu i poªo»enia punktów A, B i C. Zaznaczenie poªo»enia punktów trzeba zrealizowa wykorzystuj c tryb rysowania punktowy. Sposób ten pokazany jest z zaª czonym przykªadzie. 7.3 Wersja bardziej rozszerzona 3D Analogicznie jak w przypadku powy»ej proponuje wykorzysta si moduª lacze_do_gnuplota dla wizualizacji ±cie»ki robota 3D i animacji jego ruchu. Zaznaczenie poªo»enia punktów trzeba zrealizowa wykorzystuj c tryb rysowania punktowy. Sposób ten pokazany jest w zaª czonym przykªadzie. 7