Laboratorium 2
środa 9.30
22 IV 2009
Team w składzie:
Jarosław Luks
Wojciech Kubik
Jakub Kościółek
Wstęp do laboratorium
W trakcie laboratorium nr 2 staraliśmy się wykorzystać wiedzę nabytą na poprzednich zajęciach, jak i również uniknąć/rozwiązać problemy napotkane poprzednich zajęciach (zrywanie połączenia z zestawem).
Celem laboratorium było także stworzenie algorytmów w Prologu, które w tym przypadku wykorzystywały działanie wątków.
Podczas pracy z zestawem, pomimo iż było to nasze 2 spotkanie, nie udało nam się uniknąć problemów. Jednak tym razem udało nam się zidentyfikować ich przyczynę, co opiszemy w dalszej części sprawozdania.
Opracowane algorytmy
Panikarz
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(200),
sleep(1), % Chwila przerwy, aby jedno klaśniecie nie było rozpoznane jako dwa
trigger_create(_,clap,run_buddy).
run_buddy :-
nxt_stop,
nxt_rotate(300, 100 + random(100)),
sleep(1),
nxt_go_sec(400,2),
sleep(2),
go_on_buddy.
% Sprawdzenie, czy dźwięk przekracza wartość progową
clap :-
nxt_sound(Value,force),
Value > 60.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Omijanie przeszkód
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(200),
sleep(1), % Chwila przerwy, aby jedno klaśniecie nie było rozpoznane jako dwa
trigger_create(6,clap,stop),
trigger_create(_,odleglosc,[nxt_stop, run_buddy]).
odleglosc :-
nxt_ultrasonic(Distance,force),
Distance < 15.
run_buddy :-
nxt_stop,
trigger_kill(6),
nxt_rotate(300, 100 + random(100)),
sleep(1),
nxt_go_sec(400,2),
sleep(2),
go_on_buddy.
% Sprawdzenie, czy dźwięk przekracza wartość progową
clap :-
nxt_sound(Value,force),
Value > 60.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Podczas implementacji tego algorytmu nie udało nam się stworzyć założonej funkcjonalności. Co prawda starał on się omijać przeszkody podczas jazdy, jednak nie reagował w zamierzony sposób na efekt klaśnięcia i podczas jego zajścia zachowywał się w dziwny sposób. Brak czasu uniemożliwił nam dalszą analizę algorytmu i ewentualne usunięcie bug'a.
Problemy
Problem z wątkami
Podczas pracy w interfejsie PL NXT parokrotnie zmuszeni byliśmy do zamknięcia SWI-Prologu, jednak gdy program nie reaguje należy unikać kombinacji kalwiszy CTRL + Z gdyż powoduje to jedynie uśpienie procesu kontrolującego program, a nie jego zabicie. Powoduje to iż po ponownym uruchomieniu interfejsu PL NXT nie możemy połączyć się z robotem, gdyż połączenie blokuje nam uśpiony proces i w konsoli pojawiają się następujące błędy.
Problem z wątkami pojawiał się także podczas uruchamiania predykatu stop. Gdy zatrzymywaliśmy robota predykatem stop, a potem chcieliśmy go ponownie uruchomić predykatem start prowadziło to do unieruchomienia programu i zmuszeni byliśmy do jego zamknięcia ( haniebny CTRL + Z :) ). Skutkowało to pojawianiem się w konsoli błedu:
1 threads wouldn't die
Co oczywiście zmuszało nas do zabicia odpowiedniego procesu i ponownego łączenia się z zestawem.
Rozwiązanie
Jeśli coś takiego już nam się przydarzy należy w konsoli wpisać polecenie ps -aux | grep pl, które wylistuje nam procesy SWI-Prolog'a, a następnie używając polecenia kill -9 PID zabić uporczywy proces. Pozwoli nam to na ponowne połączenie się z zestawem bez problemów.
Pliki z laboratorium