Zdecydowaliśmy się zaimplementować algorytm „Sprzątacz”, gdyż przy małych modyfikacjach można go później przekształcić w „Co przybyło?”. Nasza implementacja algorytmu znajduje się poniżej.
:- consult('./plnxt.pl').
start :-
nxt_open,
thread_create(lets_begin_the_party,_,[detached(true)]).
lets_begin_the_party :-
trigger_create(_,detect_obstacle,trash_it),
go_on_buddy.
go_on_buddy :-
write('Buddy going'), nl,
nxt_rotate(200, 360).
detect_obstacle :-
nxt_ultrasonic(X),
write('distance '), write(X), nl,
X < 20.
trash_it :-
write('buddy trashing...'), nl,
nxt_go_cm(300, 20),
nxt_go_cm(-300, 20),
write('buddy trashing finished...'), nl,
trigger_create(_,detect_obstacle,trash_it).
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Niestety powyższy algorytm nie wykonywał się poprawnie. Robot wykonywał obrót po czym dopiero zaczynał wykonywać triggery. Efekt jego działania znajduje się na poniższym zrzucie ekranu:
Sprawdzaliśmy również inne kombinacje, jednak one również nie działały poprawnie. Oto przykład:
:- consult('./plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy(0),_,[detached(true)]).
go_on_buddy(Deg) :-
write('Buddy going'), write(Deg), nl,
nxt_rotate(200, 10),
sleep(1),
trigger_killall,
trigger_create(_,detect_obstacle,trash_it),
Deg < 360,
NewDeg is Deg+10,
go_on_buddy(NewDeg).
detect_obstacle :-
nxt_ultrasonic(X),
write('distance '), write(X), nl,
X < 20.
trash_it :-
write('buddy trashing...'), nl,
nxt_go_cm(300, 20),
nxt_go_cm(-300, 20),
write('buddy trashing finished...'), nl,
trigger_create(_,detect_obstacle,trash_it).
stop :-
trigger_killall,
nxt_stop,
nxt_close.
oraz zrzut konsoli:
Problemem były, podobnie, jak w czasie poprzednich laboratoriów, wątki, które nie chciały się zakończyć. Działo się tak mimo, iż tworzyliśmy w programie tylko jeden wątek, oraz trigger, a przy kończeniu programu wywoływaliśmy predykat trigger_killall
.
Widać to na powyższych zrzutach ekranów.