Zad. 1: Sterowanie mimik ˛a twarzy 1 Cel cwiczenia 2 Ogólny opis
Transkrypt
Zad. 1: Sterowanie mimik ˛a twarzy 1 Cel cwiczenia 2 Ogólny opis
Zad. 1: Sterowanie mimika˛ twarzy 1 Cel ćwiczenia Wykształcenie umiej˛etności posługiwania si˛e złożonymi makrami preprocesora j˛ezyka C. Stworzenie podstawowej struktury wizualizacji twarzy robota, która b˛edzie wykorzystywana w nast˛epnych zadaniach. 2 Ogólny opis zadania Należy napisać program, który b˛edzie w stanie przeczytać z pliku tekstowego sekwencj˛e poleceń sterujacych ˛ mimika˛ twarzy robota. Program b˛edzie musiał zasymulować działanie głowy robot. Powinien on również udost˛epniać proste tekstowe menu, które ma umożliwiać: • wczytanie z pliku tekstowego sekwencji instrukcji i jednoczesne ich wykonanie, • wyświetlenie dost˛epnych instrukcji, • zakończenie działania programu. Ponadto zakładamy, że w pliku z sekwencja˛ poleceń możemy zastosować wszystkie udogodnienia, które dostarcza preprocesor j˛ezyka C. W trakcie wczytywania i wykonywania sekwencji poleceń tuż przed jego realizacja˛ powinna wyświetlić si˛e pełna postać polecenia wraz z wartościami jego parametrów (patrz podrozdział 5). Jako test działania programu należy opracować sekwencj˛e poleceń, które umożliwia˛ ekspresj˛e radości oraz smutku. 3 Składnia poleceń w pliku Przyjmuje si˛e, że każde z poleceń zapisywane jest w jednej linii. Na poczatku ˛ wyst˛epuje nazwa plecenia. Może być ona poprzedzona dowolna˛ ilościa˛ znaków białych. Po niej nast˛epuje lista parametrów oddzielonych przecinkami. Znakiem kończacym ˛ list˛e jest znak średnika. Zakłada si˛e, że program powinien obsługiwać dwa polecenia: Pauza – wstrzymanie działania programu na określona˛ ilość czasu, Oko – określa stopień otwarcia oka i szybkość przejścia do nowej konfiguracji. Usta – określa wzajemne położenie dolnej i górnej wargi ust oraz oddalenie kacików ˛ ust, określa również pr˛edkość przejścia do nowego ułożenia ust, W dalszej cz˛eści jest przedstawiona składnia poszczególnych poleceń oraz przykłady ich użycia. 3.1 Polecenie Pauza Polecenie to wstrzymuje działanie programu na zadany czas. Jest on wyrażony w mikrosekundach. Składnia polecenia: Pauza ilość_mikrosekund; Podana ilość mikrosekund może być wyłacznie ˛ liczba˛ nieujemna˛ (a wi˛ec może być zerem). Górnym ograniczniem jest zakres wartości typu int dla kompilatora j˛ezyków C/C++. Przykład użycia polecenia: 1 Pauza 100000; Powoduje ono wstrzymanie działania programu na okres 0, 1 sekundy. 3.2 Polecenie Oko Określenia stan oka, tzn. zarys jego dolnej i górnej powieki. Definiuje również szybkość przejścia ze stanu poprzedniego do aktualnego. Składnia polecenia: Oko id_oka, położenie_dolnej_powieki, położenie_górnej_powieki, szybkość_zmiany; Pierwsza wartość, tzn. id_oka, jest identyfikatorem oka określajacym, ˛ czy polecenie odnosi si˛e do prawego lub lewego oka. Jednak nie ogranicza ona ilość oczu. Położenie zarysu powiek jest wyrażone w jednostkach niemianowanych. Przyjmuje si˛e, że mieści si˛e ono w przedziale [−100, 100]. Interpretacja tych wartości zależy od przyj˛etej koncepcji reprezentacji graficznej oka. Jednym z możliwych podejść jest założenie, że wartość ta odpowiada za stopień i rodzaj wypukłości kształtu powieki. Tak wi˛ec wartości ujemne moga˛ odpowiadać, za stopień wypukłości „w dół”, zaś wartości ujemne za stopień wypukłości „w gór˛e”. Szybkość zmiany położenia powiek zakładamy, że wyraża procentowa˛ szybkość zmiany położenia powieki mi˛edzy jej dotychczasowym położeniem, a docelowym, w ciagu ˛ jednej sekundy. Zakładamy ponadto, że wartość ta jest zawsze liczba˛ dodatnia.˛ Tak wi˛ec, jeśli chcemy, aby powieki osiagn˛ ˛ eły swoje położenie docelowe w ciagu ˛ 1s, to należy zadać szybkość 100. Jeśli natomiast chcemy, aby położenie docelowe zostało osiagni˛ ˛ ete w ciagu ˛ 0, 5s, to powinniśmy zadać wartość 200. Przykład użycia polecenia: Oko 1, -20, 60, 150; 3.3 Polecenie Usta Determinuje stan kształtu ust, tzn. zarys ich dolnej i górnej wargi. Definiuje również szybkość przejścia ze stanu poprzedniego do aktualnego. Składnia polecenia: Usta położenie_dolnej_wargi, położenie_górnej_wargi, oddalenie_kacików_ust, ˛ szybkość_zmiany; Położenie zarysu ust jest wyrażone w jednostkach niemianowanych. Przyjmuje si˛e, że mieści si˛e ono w przedziale [−100, 100]. Interpretacja tych wartości, podobnie jak w przypadku oka, zależy od przyj˛etej koncepcji reprezentacji graficznej. Analogicznie jak w przypadku oka można założyć, że wartość ta odpowiada za stopień i rodzaj wypukłości kształtu wargi. Tak wi˛ec wartości ujemne moga˛ odpowiadać, za stopień wypukłości „w dół”, zaś wartości ujemne za stopień wypukłości „w gór˛e”. Oddalenie kacików ˛ usta wyrażone jest w jednostkach niemianowanych zawierajacych ˛ si˛e w przedziale [−100, 100]. Zakładamy, że wartość 0 odpowiada pozycji neutralnej. Natomiast wartości dodatnie odpowiadaja˛ za zwi˛ekszenie odległości mi˛edzy kacikami ˛ ust. Pozwala to stworzyć szeroki uśmiech. Wartości ujemne maja˛ umożliwiać zmniejszenie tej odległości, co daje możliwość stworzenia wrażenia np. zdziwienia. Szybkość zmiany położenia wargi zakładamy, że wyraża procentowa˛ szybkość zmiany położenia mi˛edzy jej dotychczasowym położeniem, a docelowym, w ciagu ˛ jednej sekundy. Zakładamy również, że wartość ta jest zawsze liczba˛ dodatnia.˛ Interpretacja pr˛edkości zmian jest taka sama jak w przypadku oka. Przykład użycia polecenia: 2 Usta -60, -10, 20, 180; Intencja˛ tego polecenia jest ukształtowanie ust w formie uśmiechu. Spowodowane to jest tym, że dolna warga b˛edzie bardziej wypukła w dół niż górna. Nast˛epuje też zwi˛ekszenie odległości mi˛edzy kacikami ˛ usta. 3.4 Przykład użycia poleceń Poniżej przedstawiona jest przykładowa zawartość pliku z sekwencja˛ wcześniej opisywanych poleceń. Zawiera ona również polecenia dla preprocesora, które powinny być wcześniej przetworzone przed przystapnieniem ˛ do wczytywania właściwych poleceń. /* * Zakładamy, że startujemy od neutralnego wygladu ˛ twarzy. */ #define SZYB_ZMIAN_DLA_USMIECHU 300 #define TRANZYCJA_OKA_USMIECH 20, 80, SZYB_ZMIAN_DLA_USMIECHU /* * Przejscie do fazy usmiechu */ Oko 0, TRANZYCJA_OKA_USMIECH; Oko 1, TRANZYCJA_OKA_USMIECH; Usta -60, -40, 30, SZYB_ZMIAN_DLA_USMIECHU; /* * Przez 1s utrzymujemy ekspresj˛ e twarzy niezmieniona. ˛ */ Pauza 1000000; /* * Puszczenie "oczka" */ Oko 1, 30, 30, 300; Pauza 100000; Oko 1, TRANZYCJA_OKA_USMIECH; Pauza 4 // Zmrużenie oka // Krótka przerwa // Powrót do stanu poprzedniego 1000000; Wymagania co do konstrukcji programu Program powinien być napisany w j˛ezyku ISO C++11. W programie należy w odpowiedni sposób wywołać preprocesor, aby przetworzyć wczytywany plik poleceń. Ponadto w kodzie programu należy stworzyć makra, które wykorzystaja˛ konstrukcj˛e tworzenia napisu (konstrukcje typu #x) oraz łaczenia ˛ napisów (konstrukcje typu napis##x). W wersji podstawowej zadania w trakcie wczytywania pliku z instrukcjami jeżeli zostanie napotkania instrukcja, której parametry sa˛ spoza dopuszczalnego przedziału lub zostanie napotkany bład ˛ składni, to powinna zostać wyświetlona informacja o bł˛edzie. W tym pierwszym przypadku należy wyświetlić nazw˛e polecenia, którego dotyczy bład ˛ oraz nazw˛e parametru i jego wczytana˛ wartość. Natomiast operacja egzekucji poleceń powinna zostać przerwana i program powinien wrócić na poziom obsługi swojego menu. 3 Kod programu powinien być zdokumentowany oraz zawierać diagram czynności w j˛ezyku UML dla operacji czytania pliku i jego interpretacji. 5 Przykład uruchomienia i interakcji z programem Niniejszy przykład demonstruje postać menu i przykładowe komunikaty w trakcie działania programu. Zakłada si˛e, że wyst˛epujacy ˛ w tym przykładzie plik ekspresja_twarzy.cmd ma identyczna˛ zawartość z ta,˛ która została przedstawiona w podrozdziale 3.4. SunOS 21> ./interp4robface w - wczytanie z pliku sekwencji instrukcji i ich wykonanie i - pokaz dostepne instrukcje ? - wyswietl ponownie menu k - koniec dzialania programu Twoj wybor (? - menu): i Pauza Oko Usta czas_uS; id_oka, polozenie_dolnej_powieki, polozenie_gornej_powieki, szybkosc_zmian; pol_dolnej_wargi, pol_gornej_wargi, oddalenie_kacikow_ust, szybkosc_zmian; Twoj wybor (? - menu): w Podaj nazwe pliku: ekspresja_twarzy.cmd Wczytywanie i poczatek wykonywania pliku: Oko 0, 20, 80, 300; Oko 1, 20, 80, 300; Usta -60, -40, 30, 300; Pauza 1000000; Oko 1, 30, 30, 300; Pauza 100000; Oko 1, 20, 80, 300; Pauza 1000000; Koniec wykonywania pliku. Twoj wybor (? - menu): k Koniec dzialania programu. SunOS 21> _ 6 Materiały pomocnicze W podkatalogu ∼bk/edu/zamp/zad1 jest umieszczony podstawowy zala˛żek programu. Zawiera on przykład użycia programu gnuplot do wygenerowania wizualizacji twarzy w wersji cyklopa. Jest tam również wst˛epna konfiguracja dla systemu generacji dokumentacji doxygen. 4 7 Rozszerzenia Realizacja dodatkowych poleceń odpowiadajacych ˛ za wizualizacj˛e brwi i ich odpowiednie sterowanie. Należy opracować sekwencj˛e ekspresji, która pozwoli płynnie przejść mi˛edzy wyrazem radości, zdziwienia i smutku. Można również rozszerzyć obsług˛e bł˛edów wczytywania plików z poleceniami. Należy to zrobić, tak aby w trakcie wczytywania pliku z instrukcjami jeżeli zostanie napotkania instrukcja, której parametry sa˛ spoza dopuszczalnego przedziału, to należy zgłosić informacj˛e o bł˛edzie. Jednak program nie powinien przerywać procesu egzekucji poleceń. Powinno nastapić ˛ przejście do nast˛epnej instrukcji. Podobnie w przypadku napotkania bł˛edu składni w danej linii. Po jego zgłoszeniu powinna ona zostać pomini˛eta i program powinien rozpoczać ˛ czytanie i interpretacj˛e nast˛epnej linii. Informacja o bł˛edzie powinna objemować wyświetlenie tego co zostało wczytane w danym momencie i co było w tym miejscu oczekiwane. 5