Zaawansowane algorytmy w PLNXT

grupa:

  • Gniadek-Zając Grzegorz
  • Jakubowski Wojciech
  • Michałek Piotr

Data: 29.04.2009 r.
Godzina: 15:30

Cel

Celem laboratorium było zaimplementowanie jednego z czterech algorytmów. Nasza grupa wybrała algorytmu Co przybyło. Robot robi obrót i bada otoczenie. Po zakończeniu obrotu zatrzymuje się i czeka na klaśnięcie, po którym robi kolejny obrót i sprawdza co się zmieniło. Jeżeli wykryje jakieś zmiany udaje się w kierunku, w którym te zmiany zaszły.

Kod programu

:- dynamic(ds1/1).
:- dynamic(ds2/1).
:- dynamic(ds3/1).
:- dynamic(ds4/1).
:- consult('plnxt.pl').
 
start :-
	nxt_open,
	thread_create(first_rotate,_,[detached(true)]).
 
clap :-
        nxt_sound(Value,force),
        Value > 30.
 
first_rotate :-
	nxt_ultrasonic(A),
	assert(ds1(A)),
	nxt_rotate(300,85),
	nxt_ultrasonic(B),
	assert(ds2(B)),
	nxt_rotate(300,85),
	nxt_ultrasonic(C),
	assert(ds3(C)),
	nxt_rotate(300,85),
	nxt_ultrasonic(D),
	assert(ds4(D)),
 	nxt_rotate(300,85),
	trigger_create(_,clap,second_rotate).
 
second_rotate :-
	nxt_ultrasonic(A),
	assert(ds1(A)),
        nxt_rotate(300,85),
	nxt_ultrasonic(B),
	assert(ds2(B)),
	nxt_rotate(300,85),
	nxt_ultrasonic(C),
	assert(ds3(C)),
	nxt_rotate(300,85),
	nxt_ultrasonic(D),
	assert(ds4(D)),
 	nxt_rotate(300,85),
	choose.
 
choose :- ds1(X),ds1(Y),X-Y>20,
	trigger_create(_,check_distance,[stop]),nxt_go_cm(300,40).
 
choose :- ds2(X),ds2(Y),X-Y>20,
	trigger_create(_,check_distance,[stop]),nxt_rotate(300,85),nxt_go_cm(300,40).
 
choose:- ds3(X),ds3(Y),X-Y>20,
	trigger_create(_,check_distance,[stop]),nxt_rotate(300,170),nxt_go_cm(300,40).
 
choose:- ds4(X),ds4(Y),X-Y>20,
	trigger_create(_,check_distance,[stop]),nxt_rotate(300,255),nxt_go_cm(300,40).
 
check_distance :-
        nxt_ultrasonic(Distance,force),
        Distance < 5.
 
stop :-
	trigger_killall,
	nxt_stop,
	nxt_close.

Opis działania programu

Na początku robot wykonuje cztery obroty, każdy o 90 stopni i wykonuje pomiar odległości przy pomocy sensora ultrasonic. Z powodu nieprecyzyjnego obrotu w kodzie wpisujemy obrót o 85 stopni, co w praktyce pozwoliło osiągnąć obrót, który był zamierzony. Każdy pomiar przy pomocy predykatu assert zostaje dynamicznie dodany do bazy wiedzy naszego programu. Po dodaniu wszystkich pomiarów robot zatrzymuje się i oczekuje na klaśnięcie, po którym powtarza serię pomiarów. Kiedy wszystkie pomiary zostaną zakończone następuje porównanie odległości z pierwszego i drugiego obrotu. Z racji niedokładności pomiarów i niedokładności obrotów przyjmujemy pewien próg błędu, który pozwala uniknąć niewłaściwego zachowania robota. Kiedy robot stwierdzi, że różnica odległości między pomiarami jest wystarczająca wykonuje odpowiedni obrót i podjeżdża do miejsca, w którym wykrył zmiany.

Gienek w akcji :-)

Gienek w całej okazałości.

A tu z oddali.

Uwagi

Podczas działania programu od czasu do czasu pojawiał się następujący warnin:
?- Warning: [Thread 3] Thread running „trigger_start(clap, second_rotate, 1)” died on exception: Arithmetic: `angle/1' is not a function
Występował podczas próby wykonania obrotu. Robot chciał zacząć obrót, ale po lekkim poruszeniu przestawał działać. Nie wiemy, co było powodem tekiego zachowania.

pl/dydaktyka/piw/2009/sprawozdania/piw20090429-15b.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