1) Kody programów wykonanych na zajęciach:
Algorytm 1
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.
Rozwiązanie
:- consult('../plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]),
trigger_create(_,sensor,stop).
go_on_buddy :-
nxt_go(200),
sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa.
trigger_create(_,clap,run_away_buddy).
run_away_buddy :-
nxt_rotate(350,180),
nxt_play_tone(800, 2000),
nxt_go(800),
sleep(2),
nxt_stop,
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 50.
sensor :-
nxt_touch(Value, force),
Value = 1,
stop.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Algorytm 2
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.
:- consult('../plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]),
trigger_create(_,sensor,stop).
go_on_buddy :-
nxt_go(200),
trigger_create(_, distance, move_around).
move_around :-
nxt_stop,
D = 10,
nxt_rotate(350,90),
nxt_go_cm(350,D),
nxt_rotate(350,-90),
nxt_go_cm(350,D),
nxt_rotate(350,-90),
nxt_go_cm(350,D),
nxt_rotate(350,90),
go_on_buddy.
distance :-
nxt_ultrasonic(D, force),
D < 5.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość.
clap :-
nxt_sound(Value,force),
Value > 50.
sensor :-
nxt_touch(Value, force),
Value = 1,
stop.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
2) Spostrzeżenia, napotkane problemy, wnioski, uwagi na temat PLNXT:
w przykładzie 1. pomimo tego, że nie było możliwości zatrzymania robota, można było to zrobić przy użyciu kombinacji klawiszy Ctrl + C i a
po ponownym włączeniu robota po czynnościach opisanych w poprzednim punkcie, robot zaczął jeździć tylko w kółko
po kolejnym włączeniu robota jego zachowanie było jeszcze bardziej chaotyczne - być może było to spowodowane działającymi w tle starymi wątkami
w przykładzie 2. robot na początku w ogóle nie skręcał, dopiero po ponownym uruchomieniu xpce i załadowaniu pliku działał normalnie
w wykonanych przez nas przykładach zauważyliśmy, że w celu zmiany parametrów ruchu robota przy użyciu triggera potrzebne jest użycie predykatu nxt_stop, bez niego nic się nie zmienia