====== 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.
{{:pl:dydaktyka:piw2009:sprawozdania:robocik1.jpg|}}
* Powyżej zdjęcie naszego robocika z którym pracowaliśmy podczas zajęć.
====== 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.
* Efekt działa algorytmu można obejrzeć, pobierając krótki filmik: [[http://student.agh.edu.pl/~jluks/Lego/panikarz.MPG|run_forrest :)]]
* A tutaj nasz Forrest podczas ucieczki.
{{:pl:dydaktyka:piw2009:sprawozdania:panikarz.jpg|}}
===== 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.
{{:pl:dydaktyka:piw2009:sprawozdania:zrzutekranu.png|}}
* 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 ======
{{:pl:dydaktyka:piw2009:sprawozdania:lab2_dream_team.zip|}}