Laboratorium 3
środa 9.30
29 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. Tym razem radziliśmy już sobie bezbłędnie z problemami z połączeniem.
Celem laboratorium było także stworzenie algorytmów w Prologu, które bazowały na wiedzy zdobytej na poprzednich zajęciach. Głównym zagadnieniem było stworzenie algorytmów wielowątkowych.
Opracowane algorytmy
Panikarz
start :-
nxt_open,
nxt_light_LED(activate),
thread_create(watki,_,[detached(true)]).
run_buddy :-
Value is 100 + random(100),
nxt_stop,
nxt_rotate(200, Value),
watki.
watki :-
nxt_go(200),
trigger_create(_,czerwone,wychodze),
trigger_create(_,otoczenie,run_buddy).
otoczenie :-
nxt_light(Value,force),
Value < 45.
wychodze :-
nxt_stop,
nxt_go_cm(200, 8),
trigger_create(_,otoczenie,wychodze2),
nxt_go(200).
czerwone :-
nxt_light(Value,force),
Value < 66,
Value > 61.
wychodze2 :-
nxt_go(200),
stop.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Śledzenie linii
start :-
nxt_open,
trigger_create(_,klik,stop),
thread_create(watki,_,[detached(true)]).
watki :-
nxt_go(200),
trigger_create(_,linia,jedz).
jedz :-
trigger_create(_,out,powrot),
nxt_go(200).
out :-
nxt_light(Value,force),
Value > 45.
linia :-
nxt_light(Value,force),
Value < 45.
powrot :-
trigger_create(_,linia,[nxt_stop,jedz]),
nxt_rotate(280, 360).
klik:-
nxt_touch(Value, force),
Value =:= 1.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Problemy
Problem z czujnikiem światła
Bardzo ciężko było dobrać parametr dal poszczególnych kolorów. Gdy tylko robił się cień, lub jakies załamania, robot inaczej rozpoznawał nasycenie i z tego powodu występowały problemy (zatrzymywał się przy zagięciach planszy, lub przejezdzal przez linie).
Problem z wątkami
Podobnie jak poprzednio, napotykaliśmy (sporadycznie) na problem wywołania 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.