Spis treści

Laboratorium - zaawansowane algorytmy w PLNXT

29.04.2009, godz. 9.30
grupa w składzie: Joanna Koza, Tomasz Michalski, Kamil Mucha
Informatyka Stosowana IV 2008/2009
KA, WEAIiE, AGH

robot IREK

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 irek - brak konieczności parowania

Konfiguracja PLNXT

plnxt.pl

% Specify the device files.
nxt_serial_device(write,'/dev/rfcomm9').
nxt_serial_device(read,'/dev/rfcomm9').

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:

Problem ten pojawił się już podczas poprzedniego laboratorium.

Więzień

start :-
	nxt_open,
	thread_create(search,_,[detached(true)]),
	trigger_create(_,touch,stop).
:- 
	consult('plnxt.pl'), 
	start.
 
%poszukiwanie czerwonego obszaru
search :-
	nxt_stop,
	trigger_create(_,red,escape),
	nxt_go(140).
 
%obrót po znalezieniu czarnej linii
rotate :-
	nxt_stop,
	nxt_rotate(350, 90 + random(90)),
	sleep(2),
	search.	
 
%ucieczka po znalezieniu czerwonego klucza
escape :-
	nxt_play_tone(440,100),
	nxt_stop,
	nxt_go(500), sleep(3), nxt_stop.
 
%rozpoznanie czarnego koloru
black :-
	nxt_light(Value,force),
	write(Value),nl,
	Value < 28.
 
%rozpoznanie czerwonego koloru
red :-
	nxt_light(Value,force),
	write(Value),nl,
	Value < 33,
	Value > 26,
	sleep(0.1),
	nxt_light(Value2,force),
	write('2: '),write(Value2),nl,
	Value2 < 33,
	Value2 > 26.
 
touch :-
	nxt_touch(V, force),
	V = 1.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close, halt. 

filmiki:
poszukiwanie
ucieczka

Sprzątacz

start :-
	nxt_open,
	thread_create(search,_,[detached(true)]),
	trigger_create(_, found, clean),
	trigger_create(_, touch, stop).
:- 
	consult('plnxt.pl'), 
	start.
 
%poszukiwanie przedmiotu - obrót wokół własnej osi
search :-
	write('search'), nl,
	nxt_stop,
	nxt_rotate(150, 36000),
	sleep(5).
 
%sprzątanie - ruch do przodu (popchnięcie przedmiotu) i powrót
clean :-
	write('clean'), nl,
	nxt_stop,
	nxt_go(300),
	sleep(3),
	write('back'),nl,
	nxt_stop,
	nxt_go(-300),
	sleep(3),
	trigger_create(_, found, clean),
	search.
 
%sprawdzanie, czy jest przedmiot w promieniu 15 cm
found :-
	nxt_ultrasonic(V, force),
	write(V), nl,
	V < 15.
 
%wąłączenie robota
touch :-
	nxt_touch(V, force),
	V = 1.
 
stop :-
	nxt_play_tone(220,500),
	trigger_killall,
	nxt_stop,
	nxt_close. 

filmik:
sprzątanie

Uwagi i wnioski

Załączniki

Kody źródłowe