Kody źródłowe programów

Algorytm 2

„Robot przemieszcza się po pomieszczeniu i zmienia kierunek poruszania się, gdy przed sobą napotka przeszkodę.”

:- consult('plnxt.pl').
 
start:-
	nxt_open,
	go_on_buddy,
	trigger_create(_,pushed,[nxt_stop,nxt_close]).
 
go_on_buddy :-
	nxt_go(200),
        trigger_create(_,check_distance,change_direction).
	
pushed :-
	nxt_touch(Value,force),
	Value=1.
 
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(350,Angle),
	go_on_buddy.

Program realizuje algorytm 2. Robot porusza się prosto, a gdy napotka przeszkodę zatrzymuje się i zmienia pozycję o 90 stopni + wylosowana liczba, czyli z zakresu [90, 180] w lewo lub w prawo. W przypadku gdy robot wjedzie w coś - czujnik dotyku, zatrzymuje się.

Algorytm 1

„Robot porusza się dowolnie wewnątrz obszaru na planszy testowej ograniczonego czarną linią. Nie może poza niego wyjechać! Gdy najedzie na czarną linię, powinien zawrócić. Niekoniecznie o 180 stopni. Np. Angle is 120 + random(120) zunifikuje Angle z liczbą z przedziału od 120 do 240. Można jej użyć jako kąt obrotu robota.”

:- consult('plnxt.pl').
 
start:-
	nxt_open,
	go_on_buddy,
	trigger_create(_,pushed,[nxt_stop,nxt_close]).
 
go_on_buddy :-
	nxt_go(200),
        trigger_create(_,check_distance,change_direction),
	trigger_create(_,check_color,change_direction).
	
pushed :-
	nxt_touch(Value,force),
	Value=1.

check_color :-
	nxt_light(Value,force),
	Value < 25.

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(350,Angle),
	go_on_buddy.

Program realizuje algorytm 1. Wykorzystywany jest czujnik światła, który w zależności od koloru zwraca różne wartości. W przypadku gdy wartość zwrócona przez niego jest mniejsza niż 25 - zakładamy że został wykryty kolor czarny, robot zatrzymuje się i zmienia kierunek jazdy o 90 stopni + wylosowana wartość, czyli z zakresu [90, 180] stopni w lewo lub w prawo, podobnie jak w przypadku realizacji algorytmu 2. Ponadto wykorzystywany jest również czujnik ultrasonic, który zabezpiecza robota przed uderzeniem w przeszkodę. W przypadku gdy robot zbliży się do przeszkody na odległość mniejszą niż 15cm zmieni kierunek jazdy. Wnioski i problemy, które wynikły podczas realizacji zadania, np. dobranie współczynnika wykrycia koloru znajdują się w ostatniej sekcji sprawozdania.

:- consult('plnxt.pl').
 
start:-
	nxt_open,
	nxt_light_LED(activate),	
	go_on_buddy,
	trigger_create(_,pushed,[nxt_stop,nxt_close]).
 
go_on_buddy :-
	nxt_go(160),
        trigger_create(_,check_distance,change_direction),
	trigger_create(_,check_color,change_direction).
	

pushed :-
	nxt_touch(Value,force),
	Value=1.

check_color :-
	nxt_light(Value,force),
	Value < 45.

 
check_distance :-
	nxt_ultrasonic(Distance,force),
	Distance < 15.

change_direction :-
	nxt_stop,{{:pl:dydaktyka:piw2009:sprawozdania:piw20090408-17_franek_sources.rar|}}
	nxt_play_tone(500,2000),
	random(-1,2, X),
	X \= 0,
	write(X),nl,
	Angle is (90 + random(90))*X,
	nxt_rotate(350,Angle),
	go_on_buddy.

Wersja 2 realizacji algorytmu 2 zawiera włączenie oświetlenia nxt_light_LED(activate) oraz dobór innego współczynnika wykrycia koloru czarnego. Wersja ta daje dużo lepsze rezultaty.

Spakowane źródła

Prezentacja wyników

Moment zatrzymania po wykryciu koloru czarnego - realizacja algorytmu 1

Moment zatrzymania po wykryciu przeszkody - realizacja algorytmu 2

Poniżej umieszczone są filmiki prezentujące działanie poszczególnych realizacji algorytmów:

Realizacja algorytmu 2. alg2.mp4

Realizacja algorytmu 1. Poprawne działanie, wolna prędkość poruszania się. alg1_slow.mp4

Realizacja algorytmu 2. Błędne działanie. Dziwne działanie czujnika. Raz poprawnie wykrył czarny kolor, drugi raz prawie w tym samym miejscu nie. alg1_error.mp4

Spostrzeżenia, napotkane problemy, wnioski

Podczas realizacji algorytmu 2 nie napotkaliśmy problemów, z wyjątkiem trywialnego problemu związanego z odpowiednim wyłączeniem programu, tak aby odpalony proces zakończył się, np. ctrl+d, nie należy używać ctrl+z.

Podczas realizacji algorytmu 1, główne problemu spowodowane były oświetleniem. Stanowisko jazdy robota znajdowało się blisko otwartego okna. Powodowało to powstanie cienia, który był interpretowany jako kolor czarny. Problem częściowo rozwiązało włączenie oświetlenia.

nxt_light_LED(activate)

W przypadku gdy oświetlenie było włączone a czujnik ustawiony blisko podłoża można było uzyskać większą różnicę pomiędzy kolorem białym i czarnym, co zwiększało skuteczność wykrywania linii ograniczającej tor jazdy. W tym przypadku przyjęty przez nas współczynnik to 45, natomiast przy wyłączonym oświetleniu 25.

Drugi zauważony problem to wolna reakcja czujnika, (mimo użycia force). Czasem czujnik reagował dobrze w trakcie 3,4 zwrotów po czym jego reakcja spadała i wyjeżdżał poza tor jazdy, zanim zrobił zwrot.

Kolejną sprawą jest ciągłe występowanie warning'u po zakończeniu programu, co powoduje konieczność wyłączania go poprzez ctrl + d.

Warning: [Thread 4] Thread running "trigger_start(pushed, [nxt_stop, nxt_close], 1)" died on exception: source_sink `nxt_close' does not exist
Warning: [Thread 2] Thread running "trigger_start(check_distance, change_direction, 1)" died due to failure
pl/dydaktyka/piw/2009/sprawozdania/piw20090408-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