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:

Sukienka

Implementacja algorytmu

Algorytm 1 - Więzień

Sensor_swiatla1 Sensor_swiatla2

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

Sprzatacz

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

Kody źródłowe: Archiwum

pl/dydaktyka/piw/2009/sprawozdania/piw20090429-14b.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