|
|
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09e [2009/01/21 13:56] jsi08 Do dokończenia... |
pl:mindstorms:studenci:przedmioty:jsi:jsi2008:jsi20090121-09e [2019/06/27 15:50] |
**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: | |
<code prolog> | |
:- 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. | |
</code> | |
| |
**Problemy:** \\ | |
- Pierwszy problem pojawił się przy próbie stworzenia programu "Co przybyło?". Dla poniższego kodu: \\ | |
<code prolog> | |
bug_1(A) :- | |
A >= 45, | |
NewA is A - 45, | |
nxt_rotate(400,45), | |
nxt_ultrasonic(Value), | |
bug_1(NewA). | |
| |
start :- | |
bug_1(360). | |
</code> | |
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:** \\ | |
| |
| |
**Plik z programem:**\\ | |
{{indexmenu>.#1|js}} | |