Paweł Konas, Paweł Płazieński, zestaw IREK

Konstrukcja:
Korzystaliśmy ze skonstruowanego już robota Tribot (zestaw IREK). Z tego też względu nie zamieszczamy jego zdjęć.

Program:
Początkowo postanowiliśmy zaimplementować program „Co przybyło?”. Był on realizowany w ten sposób: robot obracał się o 360 stopni i co 45 stopni badał odległość czujnikiem ultradźwiękowym, którą nasŧępnie dodawał na listę. W kolejnej części - po dodaniu przedmiotu - miał przeprowadzać tą czynność ponownie, by ostatecznie porównać obie listy. Pojawił się jednak problem (opisany w kolejnej części), który zmusił nas do porzucenia tego programu i zajęcia się innym - „Śledzenie linii”. Program „Śledzenie linii” udało się nam zrealizować (choć nie bez komplikacji, patrz → Problemy). Działał on następująco: Robot ustawiony na planszy dostarczanej przez Lego (w jej wnętrzu) jedzie przed siebie dopóki nie natrafi na czarne podłoże (użyta funkcja wait_till). Wówczas kontynuuje jazdę przed siebie ale tym razem dopóki podłoże jest czarne. Gdy przestanie być to skręca o 20 stopni w prawo i kontynuuje jazdę dopóki znów nie będzie białe podłoże (w przeciwnym wypadku znów obróci się o 20 stopni itd.). Program kończył się po naciśnięciu czujnika dotyku. Poniżej zamieszczamy listing programu:

:- consult('plnxt/plnxt.pl').
 
is_touched :-
	nxt_touch(Value),
	Value = 1.
 
is_loud :-
	nxt_sound(Value),
	Value > 50.
 
is_white :- 
	nxt_light(Value,force),
	write('Light: '), write(Value), nl,
	Value > 45.
 
follow_the_white_rabbit :-
	nxt_stop,
	nxt_go(100),
	wait_till(not(is_white)),
	follow_line.
 
follow_line :-
	nxt_stop,
	nxt_go(100),
	wait_till(is_white),
	turn_right.
 
turn_right :-
	nxt_stop,
	nxt_rotate(200,20,force),
	follow_line.
 
start :-
	nxt_light_LED(activate),
	trigger_create(_,is_touched,[quit]),
	follow_the_white_rabbit.
 
quit :-
	trigger_killall,
	nxt_stop.

Problemy:
- Pierwszy problem pojawił się przy próbie stworzenia programu „Co przybyło?”. Dla poniższego kodu:

bug_1(A) :-
	A >= 45,
	NewA is A - 45,
	nxt_rotate(400,45),
	nxt_ultrasonic(Value),
	bug_1(NewA).
 
start :-
	bug_1(360).

Pojawiał się błąd:

?- nxt_open.

Yes
?- start.
ERROR: Arithmetic: `angle/1' is not a function
   Exception: (27) _L19345 is angle(89)//256 ? creep
   Exception: (23) nxt_actions_serial:nxt_actions_motor_move('C', 400, [motoron, brake, regulated], sync, 100, running, angle(89)) ? creep
   Exception: (21) nxt_sensomoto:nxt_motor_sync('C', 'B', 400, 100, angle(angle(89))) ? creep
   Exception: (18) nxt_movement:nxt_turn(400, 89, force) ? creep


- Zbliżony błąd wystąpił w przypadku drugiego programu (udało się go pozbyć modyfikując kod po postaci załączonej do sprawozdania). Pojawiał się on prawdopodobnie przy próbach korzystania z czujnika światła. Był on postaci:

ERROR: Arithmetic: `force/0' is not a function
   Exception: (20) _L6877 is force//256 ? creep
   Exception: (16) nxt_actions_serial:nxt_actions_motor_move('C', 100, [motoron, brake, regulated], sync, 0, running, force) ? creep
   Exception: (14) nxt_sensomoto:nxt_motor_sync('C', 'B', 100, 0, angle(force)) ? creep
?


- Oprócz tego problem pojawiał się przy próbie nawiązywania (kończenia) połączenia z robotem przy pomocy nxt_open, nxt_close. Dokładniej mówiąc gdy aktualnie działający program wyrzucał wyjątek trzeba było restartować powłokę SWIPL by móc wgrać nowy program.
- Parę razy musieliśmy też restartować robota by wgrać nowy program bo poprzednia wersja uporczywie rezydowała w jego pamięci.

Propozycje zmian w Wiki/laboratoriach:
- Można by stworzyć jakieś dodatkowe plansze dla NXT oprócz tej dostarczanej przez Lego (np. labirynt etc.)
- Przydałby się predykat do ciągłego obracania się robota (aż do wyzwolenia trigera)

Plik z programem:
Plik pl z programem

pl/mindstorms/studenci/przedmioty/jsi/jsi2008/jsi20090121-09e.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