Laboratorium - Proste algorytmy w PLNXT
22.04.2009, godz. 14.00
grupa: Cheibinger,Czapko,Wnuk
robot: Agatka
version: 1.0
Spostrzeżenia, napotkane problemy, wnioski
1. Nadal każda zmiana w kodzie musiała być poprzedzana sekwencją:
stop.
halt.
i tak dla pewności:
killall pl
Bez tego robot nie reagował na zmiany w konfiguracji.
Implementacja algorytmu
Przykład 1
Przykład kodu z wykorzystaniem pojedynczego wątku. Na uwagę zasługuje fakt, że w zależności od zadanego kąta obrotu manewr ten wymaga więcej lub mniej przestrzeni - patrz 45, 90 oraz 180 stopni, niby oczywiste a jednak byliśmy zaskoczeni.
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
rectangle_loop.
rectangle_loop :-
nxt_go_cm(350,40),
nxt_rotate(350,90),
rectangle_loop.
Przykład 2
Zgodnie z instrukcją
stop.
(prawie) natychmiast zatrzymuje robota.
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(rectangle_loop,_,[detached(true)]).
rectangle_loop :-
nxt_go_cm(350,20),
nxt_rotate(350,90),
rectangle_loop.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Przykład 3
Zgodnie z instrukcją:
Robot jedzie do przodu. Zatrzymuje się po klaśnięciu. Wznawia ruch po ponownym klaśnięciu.
co widać na załączonym filmie: Klaśnięcie
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
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 > 80.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Algorytm 1 - Piłka
Niestety nasz robot nie posiadał wbudowanych szczypiec. Zadanie zostało pominiętę.
Algorytm 2 - Omijanie przeszkód
W naszym przypadku robot reagował na czarną linię i natychmiast dokonywał pełnego obrotu Przeszkoda
Trochę odbiega to od specyfikacji zadania… ale ktoś popełnił błąd w trakcie translacji wymagań projektowych.
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(400),
sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
trigger_create(_,clap,wait_a_second),
trigger_create(_,light,move).
wait_a_second :-
nxt_stop,
sleep(1),
trigger_create(_,clap,wait_a_second).
move :-
nxt_stop,
nxt_rotate(400,180),
sleep(1),
nxt_go(400),
trigger_create(_,light,move).
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 80.
light :-
nxt_light(Value,force),
write(Value),
write('\n'),
Value < 45.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Algorytm 3 - Panikarz
Tutaj już pełna zgodność ze specyfikacją ;) Panikarz
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(150),
sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
trigger_create(_,clap,move).
move :-
nxt_stop,
nxt_rotate(600,180),
nxt_go_cm(600,30),
sleep(1),
nxt_go(150),
trigger_create(_,clap,move).
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 70.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Załączniki