====== Laboratorium (proste algorytmy w PLNXT) ====== ===== Opis ===== Cel: testowanie możliwości interfeju programistycznego PLNXT z użyciem algorytmów o małej złożoności. Środki: * zestaw LEGO, * plansza testowa (opcjonalnie), * adapter BT, * PLNXT. ===== Przygotowanie stanowiska ===== __UWAGA!__ Przed rozpoczęciem ćwiczeń należy starannie przygotować swoje stanowisko pracy [[lab215|zgodnie z instrukcją]]. ===== Dokumentacja ===== Warstwa behawioralna: {{:pl:mindstorms:lab:nxt_movement.pdf|nxt_movement.pdf}}\\ Tiggery i timery: {{:pl:mindstorms:lab:threads.pdf|threads.pdf}} ===== Budowa robota ===== Prowadzący powinien udostępnić złożonego robota TriBot lub jego uproszczoną wersję (wg. instrukcji QuickStart). Przed implementacją każdego algorytmu proszę zwrócić uwagę czy robot ma odpowiednie sensory. Jeśli nie, proszę dokonać odpowiednich modyfikacji. ===== Podstawy programowania ===== Jeśli nie udało się Państwu wykonać tego w zeszłym tygodniu, proszę rozpocząć zajęcia od zaimplementowania dwóch poniższych zadań. ==== 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ę. ===== Program + komendy z konsoli ===== Uruchamiając program w wątku głównym SWI-Prolog, który realizuję pewną sekwencję ruchów, nie pozostawiamy sobie możliwości ingerencji z konsoli (np. zatrzymania działania programu w wybranym przez nas momencie). ==== Przykład 1 ==== Robot wykonuje ruch po kwadracie. Główny wątek sekwencjonuje ruchy (przemieszczenie, obrót) i nie pozwala na wprowadzenie innego polecenia. Nie ma możliwości zatrzymania NXT. Pozostaje wyłączenie go. Proszę przetestować! Działanie programu rozpoczynamy wpisując start. :- consult('../plnxt.pl'). start :- nxt_open, rectangle_loop. rectangle_loop :- nxt_go_cm(350,40), nxt_rotate(350,90), rectangle_loop. ==== Przykład 2 ==== Jazda po kwadracie jest realizowana w osobnym wątku. To pozwala na wprowadzanie dodatkowych poleceń z konsoli. Proszę przetestować! Działanie programu rozpoczynamy, jak w przykładzie wyżej (start.); zatrzymujemy - przy w dowolnej chwili przy użyciu predykatu stop. :- consult('../plnxt.pl'). start :- nxt_open, nxt_goal(NAZWA_ROBOTA, rectangle_loop). rectangle_loop :- nxt_go_cm(350,40), nxt_rotate(350,90), rectangle_loop. stop :- trigger_killall, nxt_stop, nxt_close. ===== Szablon programu ===== Bazując na przykładzie wyżej, wygodny szablon do używania plnxt może wyglądać następująco: :- consult('../plnxt.pl'). start :- nxt_open, nxt_goal(NAZWA_ROBOTA, my_actions). my_actions :- (...). stop :- trigger_killall, nxt_stop, nxt_close. Nowy wątek tworzy się zadając mu pewien cel (tutaj //my_actions/0//) oraz ustawiając opcje. Opcja detached powoduje automatyczne odzyskiwanie zasobów używanych przez wątek po zakończeniu jego pracy. ===== Przykład algorytmu ===== Wymagane sensory: dotyku, dźwięku. Robot jedzie do przodu. Zatrzymuje się po klaśnięciu. Wznawia ruch po ponownym klaśnięciu.\\ Po wpisaniu //stop.// zatrzymuje się i zamyka połączenie.\\ Proszę odpowiednio dobrać próg natężenia dźwięku. W laboratorium może być głośno.\\ Zbyt niska wartość może spowodować zapętlenie.\\ Zbyt wysoka sprawi, że zamiast klaskać, trzeba będzie solidnie "puknąć" sensor. :- consult('../plnxt.pl'). start :- nxt_open, nxt_goal(NAZWA_ROBOTA, go_on_buddy). go_on_buddy :- nxt_go(200), sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa. trigger_create(_,clap,wait_a_second_buddy). wait_a_second_buddy :- nxt_stop, sleep(1), trigger_create(_,clap,go_on_buddy). % Sprawdzenie, czy natężenie dźwięku przekracza progową wartość. clap :- nxt_sound(Value,force), Value > 15. stop :- trigger_killall, nxt_stop, nxt_close. ===== Implementacja algorytmu ===== Proszę zaimplementować jeden lub więcej z poniższych algorytmów: ==== Piłka ==== Z użyciem planszy testowej.\\ Wymagane sensory: dotyku, światła. Robot umieszczony na planszy testowej w obszarze start łapie piłkę znajdującą się w czerwonym obszarze przed nim i przemieszcza ją poza obszar zamknięty wewnątrz czarnej linii. ==== Omijanie przeszkód ==== Wymagane sensory: odległości, dźwięku. Robot przemieszcza się do przodu. Po napotkaniu przeszkody zatrzymuje się i próbuje ją ominąć. W fazie przemieszczania do przodu (tylko w tej fazie) robot zatrzymuje się i zamyka połączenie po klaśnięciu. ==== Panikarz ==== wymagane sensory: dźwięku, dotyku. Robot przemieszcza się powoli. Po klaśnięciu zmienia kierunek i szybko ucieka przez jakiś czas (wtedy nie jest podatny na klaśnięcie), po czym uspokaja się i znowu jedzie powoli. Zatrzymuje się i zamyka połączenie po wciśnięciu sensora dotyku. ===== 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ń]]