Wstęp

Na laboratorium pracowaliśmy z robotem Lego Mindstorm:

Zrealizowaliśmy dwa zadania.

Kody źródłowe programów

Zadanie "Panikarz"

Robot przemieszcza się powoli. Po klaśnięciu zmienia kierunek i szybko ucieka przez jakiś czas (wtedy nie jest podatny na klaśnięcie), po czym uspokaja się i znowu jedzie powoli. Zatrzymuje się i zamyka połączenie po wciśnięciu sensora dotyku.

%% panikarz
:- consult('plnxt.pl').
 
start:-
	nxt_open,
	trigger_create(_,pushed,stop),
	thread_create(go_on_buddy,_,[detached(true)]).
 
go_on_buddy :-
	write('go_onbuddy'),
	nxt_go(200),
    trigger_create(_,check_sound,change_direction).
 
pushed :-
	nxt_touch(Value,force),
	Value=1.
 
check_sound :-
	nxt_sound(Value,force),
	Value>40,
	write('bummm!!!'),write(Value),nl. 
 
check_distance :-
	nxt_ultrasonic(Distance,force),
	Distance < 15.
 
change_direction :-
	nxt_stop,
	random(-1,2, X),
	X \= 0,
	write(X),nl,
	Angle is (90 + random(90))*X,
	nxt_rotate(600,Angle),
	nxt_go_cm(400,30),
	write('change_direction'),
	%sleep(3),		
	go_on_buddy.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Robot porusza się prosto ze stałą niewielką prędkością, a gdy pojawi się sygnał na czujniku dźwięku powyżej wartości 40 zatrzymuje się i szybko obraca o kąt 90 stopni + wylosowana liczba, czyli z zakresu [90, 180] w lewo lub w prawo. Następnie zaczyna szybko uciekać w wybranym kierunku, aż przejedzie 30cm. Po czym kontynuuje spacer.

Gdy pojawi się sygnał na czujniku dotyku robot zatrzymuje się i „kończy swój żywot”.

Reportaż wideo

Zadanie "Omijanie przeszkód"

Robot przemieszcza się do przodu. Po napotkaniu przeszkody zatrzymuje się i próbuje ją ominąć. W fazie przemieszczania do przodu (tylko w tej fazie) robot zatrzymuje się i zamyka połączenie po klaśnięciu.

%% ominiecie przeszkody
:- consult('plnxt.pl').
 
start:-
	nxt_open,
	trigger_create(_,pushed,stop),
	thread_create(go_on_buddy,_,[detached(true)]).
 
go_on_buddy :-
	write('go_onbuddy'),
	nxt_go(200),
    trigger_create(_,check_distance,change_direction),
	trigger_create(_,check_sound,stop).
 
pushed :-
	nxt_touch(Value,force),
	Value=1.
 
check_sound :-
	nxt_sound(Value,force),
	Value>60,
	write('bummm!!!'),write(Value),nl.
 
check_distance :-
	nxt_ultrasonic(Distance,force),
	Distance < 15.
 
change_direction :-
	trigger_killall,
	nxt_stop,
	write('obrot 1'),
	nxt_rotate(200,45),
	nxt_go_cm(300,15),
	write('obrot 2'),
	nxt_rotate(200,-45),
	nxt_go_cm(300,20),
	write('obrot 3'),
	nxt_rotate(200,-45),
	nxt_go_cm(300,15),
	write('obrot 4'),
	nxt_rotate(200,45),
	write('change_direction'),
	go_on_buddy.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Robot zaczyna poruszać się ze stałą niewielką prędkością. W przypadku, gdy napotka przeszkodę w odległości 15cm rozpoczyna manewr wymijania, który zrealizowaliśmy tak, że przeszkoda zostaje wyminięta prawą stroną przez robota. Po zakończeniu manewru robot kontynuuje swój „spacer”.

Gdy pojawi się sygnał dźwiękowy powyżej wartości 60 (tylko podczas jazdy prosto) lub sygnał na czujniku dotyku robot zatrzymuje się i „kończy swój żywot”.

Reportaż video

Spostrzeżenia, napotkane problemy, wnioski

W zadaniu omijania przeszkody pomocnym byłby mechanizm selektywnego wyłączania trigerów. Musieliśmy „ubijać” wszystkie trigery w fazie omijania przeszkody, po czym w fazie jazdy wprzód tworzyliśmy je od nowa - aby spełnić wymagania zadania.

Próbowaliśmy użyć trigger_kill zamiast trigger_killall, gdyż zależało nam na wyłączeniu tylko jednego trigera. Niestety nie udało się nam użyć trigger_kill selektywnie do „ubicia” trigger-a odpowiedzialnego za sensor odległości - z uwagi na niemożność otrzymania uchwytu do takiego trigger-a.

W trakcie pracy musieliśmy wymienić baterie.

Dosyć wolna reakcja (być może wynikająca z wolnego próbkowania) sygnału z czujnika dźwięku - niekiedy klaśnięcie (trwające bardzo szybko) nie było rejestrowane przez robota.

Podczas (najprawdopodobniej) zamykania połączenia pojawiały się tajemnicze ostrzeżenia:

Warning: [Thread 3] Thread running "trigger_start(pushed, stop, 1)" died due to failure
Warning: [Thread 2] Thread running "trigger_start(pushed, stop, 1)" died due to failure
Warning: [Thread 6] Thread running "trigger_start(check_sound, stop, 1)" died due to failure
Warning: [Thread 3] Thread running "trigger_start(check_sound, stop, 1)" died due to failure

Pliki źródłowe

pl/dydaktyka/piw/2009/sprawozdania/piw20090422-17d.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