====== Laboratorium (zapoznanie z PLNXT) ====== ===== Opis ===== Cel: zapoznanie z interfejsem programistycznym PLNXT i budowa prostych algorytmów. Środki: * zestaw LEGO, * adapter BT, * PLNXT. ===== Przygotowanie stanowiska ===== __UWAGA!__ Przed rozpoczęciem ćwiczeń należy starannie przygotować swoje stanowisko pracy [[lab215|zgodnie z instrukcją]]. ===== Wstęp ===== PLNXT to API w języku Prolog dla LEGO Mindstorms NXT. Praca nad PLNXT jest wciąż w toku. **Państwa uwagi w sprawozdaniach (także krytyczne) będą dla nas cenne.** API jest podzielone na następujące wartswy: * najniższa warstwa (nxt_actions), * średnia warstwa (nxt_sensomoto), * najwyższa warstwa (nxt_movement). ==== Warstwa nxt_actions ==== Warstwa odpowiada za komunikację z NXT. Mamy do dyspozycji predykaty poruszające silnikami, odczytującymi dane z sensorów, itp. W tej warstwie można zastosować różne systemy komunikacji. Na zajęciach będziemy używać komunikacji po porcie szeregowym z wykorzystaniem protokołu komunikacji LEGO. ==== Warstwa nxt_sensomoto ==== Warstwa bazuje na nxt_actions. To, co zostało zaimplementowane w niższej warstwie, w tej jest obudowane w logikę (np. sprawdzanie, czy wartość prędkości jest dopuszczalna). ==== Warstwa nxt_movement ==== **Warstwa, z której Państwo będziecie bezpośrednio korzystać.** Warstwa dostarcza predykaty realizujące złożoną pracę silników: ruch pojazdu do przodu, do tyłu, skręcanie, obracanie. Dokumentacja: {{:pl:mindstorms:lab:nxt_movement.pdf|nxt_movement.pdf}} ===== Budowa robota ===== Należy zbudować robota opisanego w instrukcji QuickStart i dołączyć sensory. ===== Praca w powłoce SWIPL ===== Proszę uruchomić powłokę SWIPL (polecenie xpce) i załadować plik plnxt.pl ([plnxt].), a następnie: * Otworzyć połączenie: nxt_open. * Wykonać serię wybranych z dokumentacji poleceń (przemieszczanie, odczyt sensorów). Np.: * nxt_go(300). % Jazda do przodu z prędkością 300 stopni/sekundę. * nxt_stop. * nxt_go_cm(400,80). % Jazda do przodu z prędkościa 400 stopni/sekundę. Zatrzymanie po 80 cm. * nxt_touch(Value). % Odczyt sensora dotyku. * nxt_sound(Value). % Odczyt sensora dźwięku. * nxt_light(Value). % Odczyt sensora światła. * nxt_light_LED(activate). % Włączenie diody sensora światła. * nxt_light(Value). * nxt_light_LED(passivate). * nxt_ultrasonic(Value). * nxt_rotate(350,360). % Obrót w prawo o 360 stopni z prędkością 350 stopni/sekundę. * nxt_play_tone(500,2000). % Wydanie dźwięku o częstotliwości 500 Hz i czasie trwania 2000 ms. * nxt_voltage_millivolt(Voltage). % Odczyt napięcia baterii. * Zamknąć połączenie: nxt_close. ===== Programy w pliku ===== Większość predykatów ma swoją wersję z opcją 'force' (np. nxt_go(400,force).), która wymusza natychmiastowe wykonanie polecenia.\\ Brak tej opcji sprawia, że polecenie oczekuje z wykonaniem do zatrzymania robota.\\ To pozwala na pisanie sekwencyjnych programów, jak przykład niżej. Proszę skopiować poniższy kod do pliku i załadować w SWIPL. :- consult('sciezka_do_plnxt.pl'). start :- nxt_open, nxt_go_cm(400,80), % Jazda 80 cm do przodu z prędkością 400 stopni/sekundę. nxt_go_cm(-400,80), % Jazda 80 cm do tyłu z prędkością 400 stopni/sekundę. nxt_close. :- start. ===== Do czego w takim razie przydaje się 'force'? ===== Proszę przetestować proste przykłady programów z wykorzystaniem mechanizmu trigger (dokumentacja: {{:pl:mindstorms:lab:threads.pdf|threads.pdf}}). ==== Przykład ==== :- consult('sciezka_do_plnxt.pl'). start :- nxt_open, trigger_create(_,check_distance,[nxt_stop,nxt_close]), nxt_go(300). check_distance :- nxt_ultrasonic(Distance,force), Distance < 15. Trigger będzie wyzwolony, gdy check_distance będzie prawdziwe. Wtedy zostanie wykonane zatrzymanie robota i zamknięcie połączenia.\\ Zatem jest to prosty program: robot porusza się do przodu do napotkania przeszkody.\\ Pomiar odległości odbywa się cyklicznie. Bez opcji 'force' odbyłby się po zatrzymaniu silników (w tym przypadku "nigdy").\\ Robota czekałoby bolesne spotkanie z przeszkodą. ===== Implementacja algorytmu ===== Proszę zaimplementować poniższe algorytmy: ==== Algorytm 1 ==== Robot porusza się dowolnie wewnątrz obszaru ograniczonego czarną linią (można wykorzystać planszę testową). Nie może poza niego wyjechać! Gdy najedzie na czarną linię, powinien zawrócić -- niekoniecznie o 180 stopni, żeby było ciekawiej. Podpowiedź: można użyć formuły typu "//Angle is 120 + random(120)//". ==== Algorytm 2 ==== Robot podąża wzdłuż czarnej linii (można wykorzystać planszę testową). Nie może jej zgubić! Gdy napotka przeszkodę, powinien się zatrzymać i poinformować o problemie sygnałem dźwiękowym. Po usunięciu przeszkody robot powinien kontynuować jazdę. ===== Zakończenie ===== __UWAGA__! Prosze nie rozmontowywać robota! **__UWAGA__**! Jeżeli należycie Państwo do ostatniej tego dnia grupy ćwiczeniowej, należy //wyciągnąć baterie z robota// i przekazać je prowadzącemu do naładowania! ===== Sprawozdanie ===== W przypisanej grupie przestrzeni nazw stworzyć stronę, na której umieścić: * kod Państwa programów, * spostrzeżenia, napotkane problemy, wnioski, * uwagi dotyczące funkcjonalności PLNXT. [[pl:dydaktyka:piw:2010:wykaz_sprawozdan|Wykaz sprawozdań]]