Laboratorium (zaawansowane algorytmy w PLNXT)
Tym razem, robotem, z którym nam przyszło współpracować, był Henio. W odróżnieniu od Franka, na którym ostatnio przeprowadzaliśmy nasze ćwiczenia, Henio nie stawiał oporu przy próbach połączenia się z komputerem przez Bluetooth, dzięki czemu mogliśmy niezwłocznie przystąpić do opracowywania algorytmów.
Algorytm 1 - Więzień
Z użyciem planszy testowej.
Wymagane sensory: światło.
Robot zaczyna działanie wewnątrz obszaru zaznaczonego grubą czarną linią na planszy testowej. Chce się z tego obszaru wydostać, ale nie może zrobić tego (nie wolno mu przekroczyć czarnej linii), dopóki nie znajdzie „klucza” - czerwonego obszaru symbolizującego piłkę. Po najechaniu na „klucz” sygnalizuje to dźwiękiem i ucieka z obszaru wewnątrz czarnej linii. Po wydostaniu się sygnalizuje ten fakt dźwiękiem i kończy pracę.
:- consult('plnxt.pl').
start :-
nxt_open,
nxt_light_LED(activate),
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_go(300), % jazda do przodu
trigger_create(_,border,check_border_buddy),
trigger_create(_,key,check_key).
check_border_buddy :-
nxt_stop,
nxt_go_cm(-300,10,force),
nxt_rotate(360,90),
go_on_buddy.
check_key :-
nxt_stop,
trigger_killall,
nxt_play_tone(1000,500), % dzwiek - znalazl klucz
nxt_go(300), % jazda do przodu
trigger_create(_,border,finish).
% Sprawdzenie, czy swiatlo jest ok
border :-
nxt_light(Value,force),
Value < 50.
% Sprawdzenie, czy klucz
key :-
nxt_light(Value,force),
Value > 60,
Value < 62.
finish :-
nxt_go_cm(300,20,force), % wyjazd poza linie
nxt_play_tone(1000,500), % dzwiek poza bariera
stop.
stop :-
trigger_killall,
nxt_light_LED(passivate),
nxt_stop,
nxt_close.
alg1_wiezien.pl
Algorytm 2 - Sprzątacz
Wymagane sensory: odległość.
Robot ma za zadanie oczyścić teren w promieniu np. 40 cm od swojej początkowej pozycji. Jeżeli w tym obszarze znajdują się jakieś przeszkody, próbuje je wypchnąć poza niego. Po oczyszczeniu całego terenu, wraca do pozycji wyjściowej i kończy pracę.
:- consult('plnxt.pl').
start :-
nxt_open,
nxt_light_LED(activate),
thread_create(go_on_buddy,_,[detached(true)]).
go_on_buddy :-
nxt_rotate(200,720),
trigger_create(_,place,check_place).
check_place :-
nxt_stop,
nxt_go_cm(300,15),
nxt_go_cm(-300,15),
go_on_buddy.
% Sprawdzenie, czy jest element
place :-
nxt_ultrasonic(Value,force),
Value < 19.
stop :-
trigger_killall,
nxt_light_LED(passivate),
nxt_stop,
nxt_close.
alg2_sprzatacz.pl
Spostrzeżenia, napotkane problemy, wnioski
Podstawowym problemem w pierwszym algorytmie było takie dobranie parametrów granicznych dla sensora światła, aby białe pole, czarna granica i czerwony klucz zostały odpowiednio rozpoznane. Przeprowadzone próby pokazały, że lepsze wyniki daje odczyt z włączoną lapmką LED, jednak nawet to nie jest w stanie zapewnić stuprocentowej pewności rozpoznania. O ile granica między czarnym i białym była wyraźna, o tyle kolor czerwony sprawił nam niewielkie problemy. Często kwestia rozpoznania zależała od tego, czy badane pole było w cieniu robota. Niemniej udało nam się uzyskać pożądany efekt.
Algorytm sprzątacza nie sprawił takich trudności. Na jego potrzeby zmodyfikowaliśmy nieco naszego robota, dodając z przodu poprzeczną belkę, która wypychała napotkane przeszkody.