Przygotowanie

Mieliśmy gotowego robota Jasia, lekko zmodyfikowanego Tribota. Posiadał czujnik światła skierowany na podłogę, czujnik dźwięku i czujnik dotyku. Nie ingerowaliśmy w konstrukcję.

Więzień

Algorytm

Postanowiliśmy przygotować „Więźnia” do ucieczki z więzienia. Po krótce, Jasio miał jeździć po ograniczonym czarną linią terenie, aż nie znajdzie „czerwonego klucza”. Po jego znalezieniu, miał za zadanie zwiewać, gdzie pieprz rośnie. Problemem okazał się fakt, że nie mieliśmy na planszy bezpośredniego dostępu do koloru czerwonego i nie mogliśmy przetestować ostatecznie algorytmu.

Dodatkowo postanowiliśmy jako urozmaicenie dołożyć, „kręciołę”, czyli kręcenie się wokół siebie Jasia, ze szczęścia po ucieczce. Jasio zaczynał tańczyć na klaśnięcie.

Kod programu

:-consult('plnxt.pl').
 
start:-
	nxt_open,
	nxt_light_LED(activate,force),
	jazda,
	trigger_create(_,pushed,[nxt_stop,nxt_light_LED(passivate,force),nxt_close]).
 
jazda:-
	nxt_go(150),
	trigger_create(_,light,[nxt_stop,cofnij]),
	trigger_create(_,red,[nxt_stop,uciekaj]).
 
cofnij:-
	nxt_go_cm(-150,5),
	nxt_rotate(200,105),
	jazda.
 
uciekaj:-
	nxt_go(600),
	trigger_create(_,klask,[nxt_stop,kreciola]).
 
kreciola:-
	nxt_rotate(500,360),
	uciekaj.
 
pushed:-
	nxt_touch(Value,force),
	Value=1.
 
light:-	
	nxt_light(Value,force),
	Value<35.
 
red:-
	nxt_light(Value,force),
	Value>50,
	Value<70.
 
klask:-
	nxt_sound(Value,force),
	Value>90.

Jak widać powyżej, kod nie był złożony. Należy tutaj podkreślić ewidentną zaletę środowiska jakim jest prolog. Zbudowanie takiego algorytmu w tradycyjnym języku programowania mogłoby zdecydowanie przekroczyć ograniczenia czasowe laboratoriów i pewnie wielokrotnie przewyższyć długością i nieczytelnością kod w prologu.

Problemy

Niestety po dopisaniu „kręcioły” natkneliśmy się na dziwne i trudne do przewidzenia zachowanie Jasia. Po przeładowaniu „xpce” i ponownemu włączeniu „Więźnia”, Jasio od początku reagował na klaśnięcia, powodujące „kręciołę”. Przy kolejnych wyłączeniach „xpce” pojawiały się podobne komunikaty:

?- start.
Yes
?- halWarning: [Thread 4] Thread running "trigger_start(pushed, [nxt_stop, nxt_light_LED(passivate, force), nxt_close], 1)" died on exception: source_sink `nxt_close' does not exist
Warning: [Thread 3] Thread running "trigger_start(klask, [nxt_stop, kreciola], 1)" died due to failure
?- halt.
3 threads wouldn't die

Najwyraźniej wątki, stworzone dla konkretnych czujników, nie były kończone, po skorzystaniu z wyłącznika dotykowego, który też działał na osobnym wątku. Po ponownym włączeniu „xpce” nie zakończone wątki ciągle działały i powodowały nieprzewidziane rezultaty.

Ponadto, jak widać powyżej, musieliśmy się zmagać z niesfornością robotów.. i ich operatorów ;-)

Usprawnienia

Dość dużą trudność sprawiło nam ustalenie wartości czerni i czerwieni, dla sensora świetlnego. Można by zaszyć w bibliotece plnxt stałe odpowiadające za te kolory, bądź wprost triggery odpowiadające za ich detekcje. Ostatecznie dopisanie w dokumentacji zakresów dla poszczególnych kolorów.

pl/mindstorms/studenci/przedmioty/jsi/jsi2008/jsi20090121-11b.txt · ostatnio zmienione: 2017/07/17 08:08 (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