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

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 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

pl/dydaktyka/piw/2009/sprawozdania/piw20090422-09a.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