Wstęp
Celem laboratorium było zapoznanie się z interfejsem programistycznym PLNXT i budowa prostych algorytmów.
Po zapoznaniu się z treścią teoretyczną przeszliśmy do realizacji zadań.
Kod programów
Zadanie 1
%
% Zadanie 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.
%
% PLNXT - API w języku Prolog dla LEGO Mindstorms NXT
:- consult('plnxt.pl').
start :-
nxt_open,
% aktywacja diody sensora światła
nxt_light_LED(activate),
loop.
% główna pętla programu
loop :-
% sensor światła wyzwala trigger z cofnięciem i obrotem Czesia
trigger_create(_,check_line,[nxt_stop, nxt_go_cm(-200,8,force),nxt_rotate(150,190),loop]),
% sensor dotyku zatrzymuje Czesia
trigger_create(_,check_touch,[nxt_stop,nxt_close]),
nxt_go(200).
% sensor dotyku
check_touch :-
nxt_touch(Val,force),
Val>0.
% sensor światła
% ustawiony na małą ilość światła (kolor czarny)
check_line :-
nxt_light(LightValue,force),
LightValue<50.
Zadanie 2
%
% Zadanie 2:
% Robot przemieszcza się po pomieszczeniu i zmienia kierunek poruszania się, gdy przed sobą napotka przeszkodę.
%
% PLNXT - API w języku Prolog dla LEGO Mindstorms NXT
:- consult('plnxt.pl').
start :-
nxt_open,
loop.
% główna pętla programu
loop :-
% sensor odleglosci wyzwala trigger z cofnięciem i obrotem Czesława
trigger_create(_,check_distance,[nxt_stop, nxt_go_cm(-200,8,force),nxt_rotate(150,190),loop]),
% zderzenie - sensor dotyku zatrzymuje Czesława
trigger_create(_,check_touch,[nxt_stop,nxt_close]),
nxt_go(200).
% sensor dotyku
check_touch :-
nxt_touch(Val,force),
Val>0.
% sensor odleglosci
check_distance :-
nxt_ultrasonic(DistanceValue,force),
DistanceValue<15.
Spostrzeżenia, napotkane problemy, wnioski
Realizacja zadań dostarczyła problemów
Blokowane kółko
Budowa i ciężar robota przy mniejszych prędkościach powodowały blokadę kółka tylnego (podpierającego). Podczas większych obrotów blokowało się i zatrzymywało obrót.
Wykorzystane rozwiązanie:
wartość prędkości obrotów została zwiększona
Czarna linia
Po obrocie robota jego sensor nadal znajdował się nad czarną linią
Wykorzystane rozwiązanie:
cofnięcie robota kilka centymetrów do tyłu (do miejsca gdzie nie było linii) i dopiero po tym obrót
dzięki takiemu podejściu można uniknąć problemu z narożnikami (bez cofania Czesław utykał w „kozim rogu”)
Dodatkowe problemy przy zadaniu 1
Odpowiednia jasność
Jasność powierzchni po której kierował się Czesław zmieniała się podczas trwania laboratorium (godziny wieczorne) przez co pole białe było błędnie interpretowane jako ciemne.
Wykorzystane rozwiązanie:
Sensor światła dodatkowo wyposażyliśmy w oświetlenie, które poprawiało jakość odczytów z sensora.
Dodatkowe problemy przy zadaniu 2
Czesław nie patrzy pod nogi
Czesław kierując się po pomieszczeniu laboratorium nie patrzył „pod nogi” przez co przeszkody napotykane pod nim (przepaść końca stołu) nie były rozpoznawane.
Wykorzystane rozwiązanie:
brak (ze względu na brak czasu)
Proponowane rozwiązanie:
Skierowanie sensora odległości pod odpowiednim kątem do powerchni poruszania się, oraz ustawienie odległości wyzwalającej trigger mniejszej od 15 (wykryta przeszkoda przed robotem), jak i większej od pewnej stałej (w przypadku nagłego spadku terenu przed robotem sensor odległości wykrywałby dziury itp).
Uwagi
Uwagi dotyczące funkcjonalności PLNXT / powłoki SWIPL
Podczas laboratorium napotkaliśmy problemy związane z komunikacją Bluetooth Czesława z komputerem.
Aby z powrotem odzyskać połączenia niezbędne był restart powłoki SWIPL oraz robota.
Uwagi dotyczące laboratorium
W opisie API PLNXT na stronie laboratorium nie ma dokładnych informacji dotyczących wartości maksymalnych zmienny zmiennych przyjmowanych przez polecenia.
Niektóre z poleceń nie są opisane.
Załączniki
Zdjęcia
Programy
Sprawozdanie opracowane przez:
Jacka Dymczaka
Piotra Kanię
Mateusza Urbanika