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.

  • 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: run_forrest :)
  • A tutaj nasz Forrest podczas ucieczki.

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

pl/dydaktyka/piw/2009/sprawozdania/piw20090422-09b.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0