Laboratorium - PLNXT zapoznanie
Data: 22 kwietnia 2009
Godzina: 15.30
Grupa: Artur Kosztyła, Marcin Krzych
Robot: Gienek
Wstęp
Celem laboratorium było testowanie PLNXT w algorytmach o małej złożoności.
W czasie zajęć korzystaliśmy z zestawu Lego NXT łączącego się z komputerem za pomocą interfejsu BT oraz interfejsu programistycznego PLNXT.
Zadania
Wszystkie przedstawione w opisie laboratorium na wiki przykłady zostały przeanalizowane i sprawdzone na robocie.
W tej fazie laboratorium nie napotkaliśmy żadnych problemów z funkcjonowaniem programów, jedynie, jak na załączonym zrzucie ekranu pojawił się problem z niezabitymi wątkami po wykonaniu programu reagującego na klaśnięcia.
W przykładzie z zatrzymywaniem i ruszaniem robota na klaśnięcie ustaliliśmy próg dźwięku na 50. Dopiero ta wartość pozwoliła nam wyeliminować hazardy pochodzące z otoczenia pracowni.
Co ciekawe robot rozpoznawał lekkie uderzenie dłonią w stół jako klaśnięcie i również wtedy reagował.
Jak widać, 2 wątki nie umarły po wykonaniu programu. Nastąpiło to po próbie wyjścia z konsoli po zakończeniu wykonania programu przez predykat stop
.
Przygotowanie do zajęć
Przy stanowisku zastaliśmy robota skonstruowanego zgodnie z instrukcją znajdującą się w QuickStart, wraz z dołączonymi sensorami wyglądającego tak:
Panikarz - Kod
:- consult('./plnxt.pl').
start :-
nxt_open,
thread_create(touch,_,[detached(true)]),
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(200),
sleep(1),
trigger_create(_,clap,run_away).
touch :-
nxt_touch(X),
write(X),
X > 0,
stop.
run_away :-
nxt_stop,
nxt_rotate(600,120),
nxt_go_cm(900, 30),
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza wartość progową
clap :-
nxt_sound(Value,force),
Value > 50.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Opis
Zadaniem robota było przemieszczanie się do przodu aż do momentu klaśnięcia. Wtedy robot obracał się o losowy kąt i szybko uciekał. Po pewnym czasie uspokajał się i kontynuował podróż normalnym wolnym tempem.
Zachowanie taki zostało opisane powyższym kodem, przy którego użyciu robot wykonywał zadanie i zachowywał się poprawnie.
Napotkaliśmy jednak na problemy z wątkami, opisane poniżej.
Film pokazujący działanie robota
Napotkane problemy
W czasie pracy nad ostatecznym kształtem algorytmu Panikarz, dla poniższego kodu:
:- consult('./plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(200),
sleep(1),
trigger_create(_,clap,run_away),
trigger_create(_,touch,stop).
touch :-
nxt_touch(X),
X = 1.
run_away :-
nxt_stop,
nxt_rotate(600,120),
nxt_go_cm(900, 30),
go_on_buddy.
% Sprawdzenie, czy natężenie dźwięku przekracza wartość progową
clap :-
nxt_sound(Value,force),
Value > 50.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
pojawiały się następujące WARNINGi:
Podsumowanie
Problemy z niszczeniem triggerów wydają się być mniejsze, niż tydzień temu, jednak pojawiły się problemy z niszczeniem wątków. Przy dłuższym wykonywaniu programu ich ilość rośnie, a środowisko zdaje się nie radzić sobie z ich zabijaniem/usuwaniem/kończeniem. Skutkowało to zrywaniem komunikacji z robotem, co wymuszało restart środowiska SWIPL.