====== 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|}}