====== Laboratorium - proste algorytmy w PLNXT ======
22.04.2009, godz. 9.30\\
grupa w składzie: Joanna Koza, Tomasz Michalski, Kamil Mucha\\
Informatyka Stosowana IV 2008/2009\\
KA, WEAIiE, AGH\\
\\
robot GIENEK\\
===== Robot =====
załączone sensory światła (koloru), dźwięku (mikrofon), dotyku i odległości\\
{{:pl:dydaktyka:piw2009:sprawozdania:akt2-gienek1.jpg|}}
===== Konfiguracja stanowiska do pracy z NXT =====
==== Połączenie robota oraz pobranie PLNXT ====
Bez problemów.
==== Ustawienie parametrów portu i sparowanie ====
//./bin/plnxt_stty gienek// - brak konieczności parowania
==== Konfiguracja PLNXT ====
**plnxt.pl**\\
% Specify the device files.
nxt_serial_device(write,'/dev/rfcomm7').
nxt_serial_device(read,'/dev/rfcomm7').
==== Sprawdzenie konfiguracji ====
Konfiguracja działa poprawnie.
===== Implementacja algorytmu =====
Uwaga! Wątki PLNXT nie działały u nas prawidłowo - dotyczy to najprawdopodobniej poleceniatrigger_killall
Po pierwszym jego wywołaniu (np. używając predykat "stop"), kolejne stworzenie wątku poleceniem thread_create
(np. używając predykat "start") sprawia, że wątku nie można już "zabić". Chcąc więc przerwać działanie programu, należy opuścić powłokę PL i uruchomić ją ponownie - jest to niewygodne i czasochłonne. Opisana sytuacja została uchwycona na poniższym zrzucie ekranu:\\
{{:pl:dydaktyka:piw2009:sprawozdania:akt2-error.jpg|}}
==== Piłka ====
Zadanie to chcieliśmy wykonać na końcu, ale robot nie był wyposażony w szczypce i nie wystarczyło czasu na ich podłączenie.
==== Omijanie przeszkód ====
Algorytm nie został przetestowany.
start :-
nxt_open,
thread_create(go_slowly,_,[detached(true)]).
:-
consult('plnxt.pl'),
start.
go_slowly :-
nxt_stop,
nxt_go(150),
trigger_create(10, clap, stop),
trigger_create(_, obstacle, make_turn).
make_turn :-
nxt_stop,
trigger_kill(10),
nxt_go(-200),
sleep(1),
nxt_stop,
nxt_rotate(350, 90 + random(90)),
sleep(2),
go_slowly.
clap :-
nxt_sound(Value,force),
Value > 50.
obstacle :-
nxt_ultrasonic(D,force),
D < 20.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
==== Panikarz ====
start :-
nxt_open,
thread_create(go_slowly,_,[detached(true)]),
trigger_create(_,touch,stop).
:-
consult('plnxt.pl'),
start.
go_slowly :-
nxt_stop,
nxt_go(110),
trigger_create(_,clap,panic).
panic :-
nxt_stop,
nxt_rotate(350,-180 + random(360)),
nxt_go(500),
sleep(2),
go_slowly.
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość
clap :-
nxt_sound(Value,force),
Value > 50.
touch :-
nxt_touch(V, force),
V = 1.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
filmik do pobrania:\\
[[http://student.agh.edu.pl/~kmucha/piw/akt2-TPP.3GP]]
===== Uwagi i wnioski =====
* ruchy robota w odpowiedzi na polecenia NXT_MOVEMENT nie są w 100% dokładne. Przykładowo polecenie nxt_rotate(350,90)
obraca robota o ok. 85 stopni, dlatego nie da się zrealizować idealnego ruchu po kwadracie (jeden z przykładów). Wynikać to może zarówno ze specyfiki samego PLNXT (niedokładne parametry obrotu silników w reakcji na polecenia), jak i z ograniczeń konstrukcyjnych (poślizg opon i/lub zły rozstaw kół).
* API PLNXT jest nieintuicyjne - np. funkcja //nxt_go_sec/2// zdaje się być funkcją blokującą wykonanie programu na zadaną ilość sekund, ale tak nie jest.
===== Załączniki =====
{{:pl:dydaktyka:piw2009:sprawozdania:lab2_koza_michalski_mucha.zip|Kody źródłowe}}