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 zgodnie z instrukcją.

Dokumentacja

Warstwa behawioralna: nxt_movement.pdf
Tiggery i timery: 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.

Wykaz sprawozdań

pl/mindstorms/lab/lab_plnxt_podstawy.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0