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
Konfiguracja stanowiska do pracy z NXT
Połączenie robota oraz pobranie PLNXT
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 polecenia
trigger_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:
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