Laboratorium - Zapoznanie z PLNXT
08.04.2009, godz. 14.00
grupa: Bielak,Czapko,Wnuk
robot: Agatka
version: 1.0
Spostrzeżenia, napotkane problemy, wnioski
1. Napotkaliśmy problem z odpaleniem przykładów testowych:
:- consult('sciezka_do_plnxt.pl').
start :-
nxt_open,
nxt_go_cm(400,80), % Jazda 200 cm do przodu z prędkością 400 stopni/sekundę.
nxt_go_cm(-400,80), % Jazda 200 cm do tyłu z prędkością 400 stopni/sekundę.
nxt_close.
:- start.
:- consult('sciezka_do_plnxt.pl').
start :-
nxt_open,
trigger_create(_,check_distance,[nxt_stop,nxt_close]),
nxt_go(300).
check_distance :-
nxt_ultrasonic(Distance,force),
Distance < 15.
Powyższy kod generował Warning:
Warning: [Thread 2] Thread running "trigger_start(check_distance, [nxt_stop, nxt_close], 1)" died on exception: source_sink `nxt_close' does not exist
Zasadniczo powodowało to konieczność restartu zarówno powłoki SWIPL oraz samego robota. Podejrzewając próbę sabotażu na plikach biblioteki sprawdziliśmy czy predykat nxt_close rzeczywiście nie istnieje. Odnaleźliśmy go jednak w pliku nxt_movement.pl
%% nxt_close.
%
% Closes connection.
nxt_close :-
trigger_killall,
timer_killall,
nxt_connection_close.
Powyższy błąd doprowadził do niemożności uruchomienia żadnego ze stworzonych przez nas programów (opartych o zasadę wielokrotnego tworzenia i zamykania polaczenia w ramach trigera). Będąc precyzyjnym program wykonywał się prawidłowo, aż do napotkania tej klauzuli. Jej usunięcie generowało jeszcze bardziej opłakany stan, gdzie po krótkiej chwili (co tylko podejrzewamy) liczba aktywnych wątków była już tak duża, sam restart SWIPL oraz robota już nie pomagał.
Przyczyna błędu nie jest nam znana.
2. Nasz robot był niekompletnie złożony (brak stabilnego połączenia pomiędzy korpusem i układem napędowym). Częsciowa niepełnosporawność fizyczna pogłębiona zaburzeniami umysłowymi doprowadziła do znaczego utrudnienia w wykonaniu zadań na labarotarium.
3. Nie wiem(y) jak dodać nasze sprawozdanei na tej stronie 01-agatka (chyba nie mamy do tego uprawnień)
Implementacja algorytmu
Algorytm 1
Po doświadczeniach z przykładami zdecydowaliśmy się użyć
trigger_create(-ID, +Event, +Action, +Count)
co usuneło konieczność wielokrotnego tworzenia i zamykania połączenia z robotem (i przynajmniej częściowo rozwiązało problem).
:- consult('plnxt/plnxt.pl').
start :-
nxt_open,
trigger_create(_,check_line,[nxt_stop,obroc],inf),
nxt_go(300, force).
check_line :-
nxt_light(Level, force),
write(Level),
Level < 100.
obroc :-
nxt_rotate(100, 180, force),
nxt_go(300).
:- start.
Algorytm 2
:- consult('plnxt/plnxt.pl').
start :-
nxt_open,
trigger_create(_,check_distance,[nxt_stop,obroc],inf),
nxt_go(300, force).
check_distance :-
nxt_ultrasonic(Level,force),
write(Level),
Level < 50.
obroc :-
nxt_rotate(100, 180, force),
nxt_go(300).
:- start.
Uwagi dotyczące funkcjonalności PLNXT