Kody plików

Pliki na laboratorium przygotowaliśmy przed zajęciami. Z powodu ograniczeń czasowych na zajęciach udało nam się uruchomić trzy z nich (Sprzątacz, Co przybyło i Więzień), z czego jeden (Sprzątacz) działał bezproblemowo.

Sprzątacz

Wymagane sensory: odległość. Robot ma za zadanie oczyścić teren w promieniu np. 40 cm od swojej początkowej pozycji. Jeżeli w tym obszarze znajdują się jakieś przeszkody, próbuje je wypchnąć poza niego. Po oczyszczeniu całego terenu, wraca do pozycji wyjściowej i kończy pracę.

sprzatacz.pl:

start :-
	nxt_open,
	thread_create(patrol,_,[detached(true)]).
 
patrol :-
	trigger_create(_,garbage,clean),
	nxt_rotate(300,360),
	stop.
 
clean :-
	nxt_stop,
	nxt_go_cm(360, 25),
%	 nxt_go_cm(360, -25),
	nxt_rotate(300, 180),
	nxt_go_cm(360, 25),
	nxt_rotate(300,180),
	patrol.
 
garbage :-
	nxt_ultrasonic(Value,force),
	Value < 25.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Więzień

Z użyciem planszy testowej. Wymagane sensory: światło. Robot zaczyna działanie wewnątrz obszaru zaznaczonego grubą czarną linią na planszy testowej. Chce się z tego obszaru wydostać, ale nie może zrobić tego (nie wolno mu przekroczyć czarnej linii), dopóki nie znajdzie „klucza” - czerwonego obszaru symbolizującego piłkę. Po najechaniu na „klucz” sygnalizuje to dźwiękiem i ucieka z obszaru wewnątrz czarnej linii. Po wydostaniu się sygnalizuje ten fakt dźwiękiem i kończy pracę.

wiezien.pl:

start :-
	nxt_open,
	nxt_light_LED(activate),
	thread_create(search,_,[detached(true)]).
 
search :-
	nxt_go(300),
	trigger_create(_,find_key,run_away),
	trigger_create(_,border,try_again).
 
try_again :-
	Value is 140 + random(80),
	nxt_stop,
        nxt_rotate(300, Value),
	search.
 
run_away :-
	nxt_stop,
	nxt_play_tone(440,100),
	sleep(0.1),
	nxt_play_tone(440,700),
	nxt_go_cm(250, 8),  %wyjechanie poza czerwony obszar
	trigger_create(_,border,leave),
	nxt_go(300).
 
leave :-
        nxt_go_cm(300, 20), %wyjechanie poza granicę 'więzienia'
        stop.
 
border :- 
	nxt_light(Value,force),
	Value < 45.
 
find_key :-
	nxt_light(Value,force),
	Value < 66,
	Value > 61.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Śledzenie linii

Z użyciem planszy testowej. Wymagane sensory: światło, dotyk. Robot umieszczony na planszy testowej dojeżdża do grubej czarnej linii i od tego momentu stara się poruszać wzdłuż tej linii. Po wciśnięciu sensora dotyku kończy pracę.

dorsz.pl (nieprzetestowany):

start :-
	nxt_open,
	trigger_create(_,pat,stop),
	thread_create(search,_,[detached(true)]).
 
search :-
	nxt_go(250),
	trigger_create(_,find_the_way,follow_the_path).
 
follow_the_path :-
	trigger_create(_,stray,straighten_up),
	nxt_go(200).
 
straighten_up :-
	trigger_create(_,find_the_way,[nxt_stop,follow_the_path]),
	nxt_rotate(280, 360).
 
stray :-
	nxt_light(Value,force),
	Value >15.
 
find_the_way :-
	nxt_light(Value,force),
	Value < 15.
 
pat:- 
	nxt_touch(Value, force),
	Value =:= 1.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Co przybyło?

Wymagane sensory: odległość, dźwięk. Robot obraca się i bada rozmieszczenie przedmiotów wokół siebie. Po pierwszym obrocie zatrzymuje się. Należy mu dołożyć w tym obszarze jakiś przedmiot. Po klaśnięciu wykonuje drugi obrót. Po wykryciu dostawionego przedmiotu podjeżdża do niego i kończy pracę.

conowego.pl:

start :-
	nxt_open,
	thread_create(reconnaissance([],0),_,[detached(true)]).
 
reconnaissance(List, Angle) :-
	Angle <360,
	nxt_ultrasonic(Value),
	nxt_rotate(300, 30),
	NewAngle is Angle + 30,
	reconnaissance([Value|List],NewAngle).
 
reconnaissance(List, 360) :-
	trigger_create(_,clap,whatsnew(List,360)).
%	sleep(1).
%	write(List),
%	whatsnew(List,360).	
 
whatsnew([],_):- stop.
whatsnew(_,Angle):- Angle < 0, stop.
 
whatsnew([Element|List],Angle):-
	Angle >= 0,
	nxt_rotate(300, -30),
	nxt_ultrasonic(Value),
	compare2(Value, Element),
	NewAngle is Angle - 30,
	whatsnew(List, NewAngle).
 
clap :-
	nxt_sound(Value, force),
	Value >50.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.
 
compare(Element, Element).
compare(Element, Reading):-
	Element =\= Reading,
	nxt_stop,
	Distance is Reading - 1,
	nxt_go_cm(360, Distance),
	stop.
 
%funckja porownywawcza, z uwzglednieniem mozliwosci bledu pomiaru
compare2(Element, Reading):-
	StdVar is Element - Reading,
	abs(StdVar, StVa),
	StVa =< 5.
 
compare2(Element, Reading):-
	StdVar is Element - Reading,
	abs(StdVar, StVa),
	StVa > 5,
	compare(Element, Reading).

Pliki

Spakowane pliki .pl

Zdjęcia

Czesław sprzątający swoją okolicę:

Spostrzeżenia i napotkane problemy

  • Uruchomienie robota. Problemy z nawiązaniem połączenia z robotem pod xpce (po wpisaniu nxt_open. program zawieszał się). Problem ten nie występował pod pl.
  • Wyłączanie się robota. W czasie zajęć robot kilkukrotnie wyłączył się samoistnie. Po sprawdzeniu ustawień robota okazało się, że miał on ustawione automatyczne wyłączanie się po 10 minutach. Wyłączenie tej opcji rozwiązało problem.
  • Wyrzucanie wyjątków. Podobnie jak poprzednio, program dość często wyrzucał wyjątki, co uniemożliwiało dalszą jego pracę. Jedynym wyjściem był tu restart pl.
  • Program Więzień - problem z kolorami. Dużym problemem przy tworzeniu programu Więzień okazał się dobór wartości nxt_light. Najpierw sprawdzaliśmy wartości natężenia światła w różnych miejscach planszy przy wyłączonej diodzie LED. Otrzymaliśmy wartości: ok. 10 dla koloru czarnego, 7 - 14 dla czerwonego i ok. 28 dla białego. Po włączeniu diody LED: 26-41 dla koloru czarnego, 61-67 dla czerwonego i 62-70 dla białego. Jak więc widać, rozpoznanie koloru czerwonego przez robota jest bardzo trudne, gdyż przy wyłączonej diodzie LED zlewa się on z czarnym, a po jej włączeniu jest niemal nieodróżnialny od białego.
  • Program Co przybyło? - problemy. Po wykonaniu pełnego obrotu i zapamiętaniu odległości w kolejnych położeniach (co zostało sprawdzone przez wyświetlenie listy) robot zaczynał obracać się w drugą stronę. Podczas obrotu zgodnie z założeniami wczytywał kolejne wartości odległości do najbliższego przedmiotu i porównywał je z zapamiętanymi. Niestety, kiedy pomiarów dokonywał w okolicach krańca biurka, uznawał, że znalazł już nowy element i kończył pracę. Podejrzewamy, że działo się tak z powodu nieprecyzyjnego kąta obrotu robota (w okolicach granic ścian różnica kilku stopni przy obrocie może mieć duże znaczenie przy pomiarze odległości).
  • Program Sprzątacz - ustawienie robotowi promienia sprzątania na 40cm powodowało, że próbował on „posprzątać” ściany biurka.
  • Wszystkie powyższe napisane przez nas programy (również te nieprzetestowane) kompilują się bezbłędnie.
  • PLNXT - symulator. Przetestowanie w domu programów, dla których brakło czasu na zajęciach za pomocą symulatora okazało się niemożliwe z powodu braku zdefiniowanych pewnych procedur w pliku nxt_actions_simulator.pl.

Wnioski i uwagi

Celem laboratorium było stworzenie nieco bardziej skomplikowanych algorytmów do uruchomienia na LEGO Mindstorms. Do tego potrzeba jednak znacznie więcej czasu niż dostępne było na zajęciach. Przydatne byłoby tu rozwinięcie symulatora Mindstorms w środowisku plnxt.

Ciekawym zastosowaniem Mindstorms mogłoby być również stworzenie robotów działających inaczej niż tylko jako pojazdy, jak na przykład stacjonarno-obrotowy podajnik z ruchomym ramieniem (maszyna typu żuraw czy koparka).

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