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

Podobne dokumenty