Laboratorium - Zaawansowane algorytmy w PLNXT
29.04.2009, godz. 14.00
grupa: Bielak,Czapko,Wnuk
robot: Gienek
version: 0.1 draft
Spostrzeżenia, napotkane problemy, wnioski
1. Jak zwykle zmiany w kodzie wiązały się z wymuszaniem zamknięcia interpretera:
stop.
halt.
2. Wymiana studentów z Japonii:
Implementacja algorytmu
Algorytm 1 - Więzień
Więzień01
Więzień02
Program realizuje wymagania stawiane w specyfikacji, jednak wymaga aby prędkość przemiszczania robota była relatywnie niska. Ze względu na fakt, że zamontowany czujnik światła bada natężenie monochromatycznie rozpoznanie czerwieni od czerni w warunkach oświetlenia laboratorium jest zadaniem nietrywialnym. Nie pomagają 2 tryby pracy czujnika (activate, passivate). W zasadzie prawie zawsze dochodzi do uśredniania wartości odczytu przy zmianie podłoża z białego na czarne (linia), co skutkuje podaniem wartości pośredniej (koloru czerwonego). Sam kolor czerwony potrafi się róźnić 1-2 jednostkami od koloru czarnego (w skalii 255 stopniowej). Rozwiązaniem przez nas zaprezentowanym jest analiza 5 wartości, która cześciowo wyklucza błędne odczyty w trakcie przejść pomiędzy obszarami bieli i czerni, nie chroni jednak przed utrudnionym odczytem czerwieni (która na naszej planszy była wyjątkowo ciemna). Dla niewielkich prędkości (100) program działa 'dosyć' sprawnie, jednak wartość 150 jest poza jego zasięgiem w tej implementacji.
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(go_on,_,[detached(true)]).
go_on :-
nxt_go(200),
sleep(1),
trigger_create(_,red_line,escape),
trigger_create(_,black_line,move).
red_line :-
nxt_light(Value1, force),
nxt_light(Value2, force),
nxt_light(Value3, force),
nxt_light(Value4, force),
nxt_light(Value5, force),
write('Red: '),
write(Value1), write(' '), write(Value2), write(' '), write(Value3), write(' '), write(Value4), write(' '), write(Value5), write('\n'),
Value1 > 42,
Value1 < 47,
Value2 > 42,
Value2 < 47,
Value3 > 42,
Value3 < 47,
Value4 > 42,
Value4 < 47,
Value5 > 42,
Value5 < 47.
black_line :-
nxt_light(Value1, force),
nxt_light(Value2, force),
nxt_light(Value3, force),
nxt_light(Value4, force),
nxt_light(Value5, force),
write('Black: '),
write(Value1), write(' '), write(Value2), write(' '), write(Value3), write(' '), write(Value4), write(' '), write(Value5), write('\n'),
Value1 < 42,
Value2 < 42,
Value3 < 42,
Value4 < 42,
Value5 < 42.
move :-
nxt_stop,
Angle is 120 + random(120),
nxt_rotate(200,Angle),
nxt_go(200),
trigger_create(_,red_line,escape),
trigger_create(_,black_line,move).
escape :-
trigger_killall,
nxt_stop,
nxt_go_cm(600,10),
nxt_close.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Algorytm 2 - Sprzątacz
Robot obraca się w miejscu, w wypadku napotkania przeszkody zatrzymuje obrót, podąża 40cm do przodu, cofa się 40cm i kontynuje obrót.
Niestety nie ma filmu :(, nie doceniono naszych zdolności artystycznych i wyproszono nas z sali przed rozpoczęciem właściwych zdjęć do sceny finałowej. Tylko fragment baletu z początkowych testów:
Sprzątacz01
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(go_on,_,[detached(true)]).
go_on :-
nxt_rotate(200,720),
trigger_create(_,object,move).
object :-
nxt_ultrasonic(Value, force),
write('Distance: '),
write(Value), write('\n'),
Value < 40.
move :-
nxt_stop,
nxt_go(200, 40),
nxt_go(-200, 40),
go_on.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Algorytm 3 - Śledzenie linii
Brak implementacji. Wydaje się, że umocowanie czujnika światła, dokładność mechanizmu sterowania i napędu uniemożliwiają skuteczne manewrowanie z taką dokładnością. Choć możemy zmienić zdanie zobaczywszy przykładową (działającą) implementację.
Algorytm 4 - Co przybyło?
W zasadzie wariacja na temat zadania 2.
:- consult('../plnxt/plnxt.pl').
start :-
nxt_open,
thread_create(go_on,_,[detached(true)]).
go_on :-
nxt_rotate(200,360),
sleep(1),
trigger_create(_,sound,rotate).
rotate :-
nxt_rotate(200,360),
trigger_create(_,far,move).
sound :-
nxt_sound(Value,force),
write('Volume: '),
write(Value), write('\n'),
Value > 80.
far :-
nxt_ultrasonic(Value, force),
write('Distance: '),
write(Value), write('\n'),
Value < 100,
Value > 5.
close :-
nxt_ultrasonic(Value, force),
write('Distance: '),
write(Value), write('\n'),
Value < 6.
move :-
nxt_stop,
nxt_go(200, 5),
trigger_create(_,far,move),
trigger_create(_,close,stop).
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Załączniki