Laboratorium - zaawansowane algorytmy w PLNXT
29.04.2009, godz. 9.30
grupa w składzie: Joanna Koza, Tomasz Michalski, Kamil Mucha
Informatyka Stosowana IV 2008/2009
KA, WEAIiE, AGH
robot IREK
Robot
załączone sensory światła (koloru), dźwięku (mikrofon), dotyku i odległości
Konfiguracja stanowiska do pracy z NXT
Połączenie robota oraz pobranie PLNXT
Ustawienie parametrów portu i sparowanie
./bin/plnxt_stty irek - brak konieczności parowania
Konfiguracja PLNXT
plnxt.pl
% Specify the device files.
nxt_serial_device(write,'/dev/rfcomm9').
nxt_serial_device(read,'/dev/rfcomm9').
Sprawdzenie konfiguracji
Konfiguracja działa poprawnie.
Implementacja algorytmu
Uwaga! Wątki PLNXT nie działały u nas prawidłowo - dotyczy to najprawdopodobniej polecenia
trigger_killall
Po pierwszym jego wywołaniu (np. używając predykat „stop”), kolejne stworzenie wątku poleceniem
thread_create
(np. używając predykat „start”) sprawia, że wątku nie można już „zabić”. Chcąc więc przerwać działanie programu, należy opuścić powłokę PL i uruchomić ją ponownie - jest to niewygodne i czasochłonne. Opisana sytuacja została uchwycona na poniższym zrzucie ekranu:
Problem ten pojawił się już podczas poprzedniego laboratorium.
Więzień
start :-
nxt_open,
thread_create(search,_,[detached(true)]),
trigger_create(_,touch,stop).
:-
consult('plnxt.pl'),
start.
%poszukiwanie czerwonego obszaru
search :-
nxt_stop,
trigger_create(_,red,escape),
nxt_go(140).
%obrót po znalezieniu czarnej linii
rotate :-
nxt_stop,
nxt_rotate(350, 90 + random(90)),
sleep(2),
search.
%ucieczka po znalezieniu czerwonego klucza
escape :-
nxt_play_tone(440,100),
nxt_stop,
nxt_go(500), sleep(3), nxt_stop.
%rozpoznanie czarnego koloru
black :-
nxt_light(Value,force),
write(Value),nl,
Value < 28.
%rozpoznanie czerwonego koloru
red :-
nxt_light(Value,force),
write(Value),nl,
Value < 33,
Value > 26,
sleep(0.1),
nxt_light(Value2,force),
write('2: '),write(Value2),nl,
Value2 < 33,
Value2 > 26.
touch :-
nxt_touch(V, force),
V = 1.
stop :-
trigger_killall,
nxt_stop,
nxt_close, halt.
filmiki:
poszukiwanie
ucieczka
Sprzątacz
start :-
nxt_open,
thread_create(search,_,[detached(true)]),
trigger_create(_, found, clean),
trigger_create(_, touch, stop).
:-
consult('plnxt.pl'),
start.
%poszukiwanie przedmiotu - obrót wokół własnej osi
search :-
write('search'), nl,
nxt_stop,
nxt_rotate(150, 36000),
sleep(5).
%sprzątanie - ruch do przodu (popchnięcie przedmiotu) i powrót
clean :-
write('clean'), nl,
nxt_stop,
nxt_go(300),
sleep(3),
write('back'),nl,
nxt_stop,
nxt_go(-300),
sleep(3),
trigger_create(_, found, clean),
search.
%sprawdzanie, czy jest przedmiot w promieniu 15 cm
found :-
nxt_ultrasonic(V, force),
write(V), nl,
V < 15.
%wąłączenie robota
touch :-
nxt_touch(V, force),
V = 1.
stop :-
nxt_play_tone(220,500),
trigger_killall,
nxt_stop,
nxt_close.
filmik:
sprzątanie
Uwagi i wnioski
zrealizowanie zadań „więzień” czy „śledzenie linii” w warunkach naszego laboratorium jest niezwykle trudne. Sensor światła odczytuje wartości w zakresie 0 - 100, jest to więc znormalizowana skala szarości. Różnice między kolorami (zwłaszcza ciemnymi, np. czerwonym i czarnym) są nieduże (biały - ok. 40, czarny - ok. 25, czerwony ok. 30), a sytuację dodatkowo pogarsza kierunkowe oświetlenie sali laboratoryjnej (brak jednakowego oświetlenia planszy testowej, światło pochodzące od okna sprawia, że inne obiekty oraz sam robot rzucają cienie na planszę), rozróżnianie kolorów jest więc trudne. Kontrastu nie poprawia niestety światło diody LED sensora, ponieważ kolor światła jest czerwony, co jeszcze pogarsza sytuację.
Załączniki