Kod programów

Po przetestowaniu działania przykładów zamieszczonych na stronie laboratorium, udało nam się zaimplementować na zajęciach trzy algorytmy:

Piłka

Z użyciem planszy testowej. Robot umieszczony na planszy testowej w obszarze start łapie piłkę znajdującą się w czerwonym obszarze przed nim i przemieszcza ją poza obszar zamknięty wewnątrz czarnej linii.

Kod pilka.pl:

:- consult('plnxt.pl').
 
start :-
	nxt_open,
	thread_create(stroll,_,[detached(true)]).
 
stroll :-
	nxt_go(200),
%	trigger_create(_,find_ball,go_with_ball).
	trigger_create(_,border,stop).
 
go_with_ball :-
	Value is 90 + random(180),
	nxt_stop,
        nxt_rotate(300, Value),
	nxt_go(300),
	trigger_create(_,border,stop).
 
border :- 
	nxt_light(Value,force),
	Value < 15.
 
find_ball :-
	nxt_light(Value,force),
	Value < 23.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

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.

Kod omijanie.pl:

:- consult('plnxt.pl').
 
start :-
	nxt_open,
	thread_create(stroll,_,[detached(true)]).
 
stroll :-
	nxt_go(200),
        sleep(1),
	trigger_create(_,obstacle,go_round).
	trigger_create(_,clap,stop).
 
go_round :- 
	Length is 20,
	Length2 is Length * 2,
	nxt_stop,
	nxt_rotate(300, -90),
	nxt_go_cm(250,Length),
	nxt_rotate(300, 90),
	nxt_go_cm(250,Length2),
	nxt_rotate(300, 90),
	nxt_go_cm(250,Length),
	nxt_rotate(300, -90),
	stroll.	
 
obstacle :-
	nxt_ultrasonic(Distance,force),
	Distance < 20.
 
clap :-
	nxt_sound(Value,force),
	Value > 40.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

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.

Kod panikarz.pl:

:- consult(plnxt.pl).
 
start :-
	nxt_open,
	thread_create(stroll,_,[detached(true)]),
	trigger_create(_,pat,stop).
 
stroll :-
	nxt_go(200),
        sleep(1),
	trigger_create(_,clap,run_away).
 
run_away :-
	Value is 90 + random(180),
	nxt_stop,
        nxt_rotate(400, Value),
	nxt_go_cm(500,20),
	stroll.
 
clap :-
	nxt_sound(Value,force),
	Value > 40.
 
pat :-
	nxt_touch(Value, force),
	Value=:=1.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Pliki

Zdjęcia

Henio w stanie początkowym, wykonujący algorytm panikarz:

Henio po „tuningu” - dodany przedni zderzak i „zęby” - przygotowujący się do ominięcia przeszkody:

Henio z dodanymi szczypcami, przechwytujący piłkę podczas wykonywania algorytmu piłka.

Spakowane pliki '*.pl'

Filmiki

Filmiki w formacie .mp4 ukazujące Henia wykonującego kolejne algorytmy:

pilka

omijanie przeszkod

panikarz

Napotkane problemy

  • Na samym początku mieliśmy problem z uruchomieniem Henia. Po skonfigurowaniu połączenia między robotem a komputerem udało nam się sprawić, aby komputer otwierał połączenie i sprawdzał baterię w robocie, ale niestety Henio nie chciał reagować na żadne polecenia ruchu (np nxt_go, nxt_rotate etc.). Problem ten zniknął po restarcie robota.
  • Problem z doborem progu dźwięku. Empirycznie ustaliliśmy ten próg na wartość >40. Przy zbyt niskiej wartości robot reaguje na „szum”, czyli hałas w sali. Zbyt wysoka wartość powoduje, że robot nie reaguje na nic.
  • Problem z doborem progu natężenia światła. W wyniku doświadczeń, polegających na stawianiu robota w różnych miejscach na planszy i wpisywaniu w konsoli celu nxt_light(Value). udało nam się ustalić, że na białym polu wartość natężenia światła wynosiła 24, na czerwonym 22, a na czarnym 10. Niestety, robot nie zawsze „zauważał”, że znalazł się już na polu czerwonym (czyli w praktyce przechwycił już piłkę).
  • Problem z doborem kąta obrotu. Podczas realizowania algorytmu omijanie przeszkody zauważyliśmy, że pomimo wpisania „na sztywno” wartości obrotu o 90 stopni, w praktyce robot ślizgał się po stole, co skutkowało nieprawidłowym torem jazdy i wjeżdżaniem w przeszkodę. Po niewielkim zmniejszeniu prędkości obrotu problem ten zniknął i robot zaczął poruszać się dokładnie po wyznaczonym mu torze.
  • Podobnie jak poprzednio, zaistniał problem wyrzucania wyjątków podczas kończenia wątków. W praktyce skutkowało to koniecznością restartu xpce po każdym wykonaniu programu.

Wnioski i spostrzeżenia

Pomimo pewnych problemów, programowanie w środowisku plnxt jest łatwe i dość przyjemne. Pozwala na komunikację użytkownika z robotem jak i również projektowanie nieco bardziej skomplikowanych zachowań robota przy użyciu prostych poleceń.

Algorytm omijanie przeszkód mógłby być bardzo efektywny, gdyby robot posiadał dwa sensory odległości: jeden z przodu i jeden z boku. Wtedy przy zastosowaniu pewnej synchronizacji danych wejściowych możnaby zmusić robota, aby omijał przeszkody, poruszając się wzdłuż ich krawędzi. Efekt ten można osiągnąć również przy użyciu jednego sensora odległości, zmuszałoby to jednak robota do ciągłego obracania się i sprawdzania, czy przeszkoda nadal znajduje się przed nim.

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