Sprawozdanie z laboratorium - zapoznanie z PLNXT

Celem laboratorium było zapoznanie się z PLNXT. Ponieważ zastaliśmy złożonego robota mogliśmy przystąpić to prac programistycznych.

Zapoznanie z API PLNXT

Przez pierwszą część laboratorium zapoznawaliśmy się z możliwościami API, wykonaliśmy uruchomiliśmy na naszym robocie przykładowe, zamieszczone na wiki fragmenty programów. Sprawdziliśmy jak robot reaguje na dane polecenia. Z taką wiedzą rozpoczęliśmy implementowanie zdanych algorytmów

Algorytm 1

Robot porusza się dowolnie wewnątrz obszaru na planszy testowej ograniczonego czarną linią. Nie może poza niego wyjechać! Gdy najedzie na czarną linię, powinien zawrócić. Niekoniecznie o 180 stopni. Np. Angle is 120 + random(120) zunifikuje Angle z liczbą z przedziału od 120 do 240. Można jej użyć jako kąt obrotu robota.

Oto nasze rozwiązanie:

:- consult('plnxt.pl').
 
start:-
	nxt_open,
	nxt_light_LED(activate),
	go_on_buddy,
	trigger_create(_,pushed,[nxt_stop,nxt_close]).
 
go_on_buddy :-
	nxt_go(200),	
	trigger_create(_,check_light,[nxt_stop, rotate, go_on_buddy]).
 
 
rotate :-
	Angle is 20 + random(120),
	nxt_rotate(-200, Angle, force).
 
 
 
% Sprawdzenie, czy sensor dotyku jest wcisniety.
pushed :-
	nxt_touch(Value,force),
	Value=1.
 
% sprawdza dystans 
check_light :-
	nxt_light(LightValue,force),
	LightValue < 30.
 
:- start.

Problemy i uwagi: Po nauczeniu się jak sterować i skręcać robotem problemem było odnalezienie właściwej wartości granicznej dla sensora. Na początku mieliśmy z tym pewnie problemy, ale po uruchomieniu diody w sensorze wyniki poprawiły się. Po kilku testach doszliśmy do wniosku, że odpowiednią wartością będzie 30.

Algorytm 2

Robot przemieszcza się po pomieszczeniu i zmienia kierunek poruszania się, gdy przed sobą napotka przeszkodę.

Oto nasze rozwiązanie:

:- consult('plnxt.pl').
 
start:-
	nxt_open,
	go_on_buddy,
	trigger_create(_,pushed,[nxt_stop,nxt_close]).
 
go_on_buddy :-
	nxt_go(200),
	trigger_create(_,check_distance,[nxt_stop, rotate, go_on_buddy]).
 
 
rotate :-
	Angle is 60 + random(120),
	% nxt_go_cm(-200,20),
	nxt_rotate(-600, Angle, force).
 
% sprawdza dystans 
check_distance :-
	nxt_ultrasonic(Distance,force),
	Distance < 15.
 
 
% Sprawdzenie, czy sensor dotyku jest wcisniety.
pushed :-
	nxt_touch(Value,force),
	Value=1.
 
:- start.

Link do filmu prezentującego Henia w akcji: http://student.agh.edu.pl/~kacper/robot.mp4 Algorytm działa na prawie takiej samej zasadzie jak w wersji pierwszej, z tą różnicą że wykorzystywany jest sensor ultradźwiękowy. Ustawiliśmy wartość po przekroczeniu której zaczyna obrót na 15.

Ogólne uwagi do laboratorium

Po zakończeniu każdego programu pojawiały się warningi: Warning: [Thread 4] Thread running „trigger_start(pushed, [nxt_stop, nxt_close], 1)” died on exception: source_sink `nxt_close' does not exist Warning: [Thread 2] Thread running „trigger_start(check_distance, change_direction, 1)” died due to failure Pomocne tutaj były restarty zarówno samego SwiPL, a także czasami Brixa.

Zauważyliśmy także pewien problem z wątkami, które niejednokrotnie zapętlały się gdzieś w Brix'ie i mimo wydania polecenia nxt_stop i ogólnego zakończenia skryptu, sprawiały że robot „sam” jeździł.

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