Laboratorium - zapoznanie z PLNXT
08.04.2009, godz. 9.30
grupa w składzie: Joanna Jaworek, Eliasz Kańtoch, Piotr Figiel
Informatyka Stosowana IV rok
Robot: Franek
Konstrukcja
Dobudowaliśmy do robota czujniki światła i odległości.
W pełni funkcjonalnego robota możemy obserwować na rysunku poniżej:
Konfiguracja stanowiska do pracy z NXT
Przez kilkanaście minut nie udało nam się połączyć z Robotem. Nie pomogło kolejno: resetowanie powłoki i restart robota. Dopiero restart komputera po uzgodnieniu z prowadzącym ćwiczenia umożliwił prawidłowe podłączenie do robota.
Przetestowaliśmy funkcjonalność robota za pomocą poleceń dostępnych w dokumentacji:
np:
[plnxt].
nxt_open.
nxt_rotate(100, 180).
nxt_close.
Implementacja algorytmu
Na podstawie dokumentacji opracowaliśmy rozwiązanie 2 problemów.
Algorytm 1
Do rozwiązania tego problemu napisaliśmy predykat sprawdz_czy_linia umożliwiącego wykrycie czarnej linii przed robotem. Stworzyliśmy także predykat jedz_wprzod, który definiuje trigger który wyzwalał obrot robota o losowy kąt z przedziału 100-180 stopni gdy robot najedzie na ciemne pole (linię).
:- consult('plnxt.pl').
start:-
nxt_open,
jedz_wprzod.
jedz_wprzod :-
nxt_go(300),
trigger_create(_,sprawdz_czy_linia,obrot).
sprawdz_czy_linia :-
nxt_light(Value,force),
Value < 20.
obrot :-
nxt_stop,
Angle is 100 + random(80),
nxt_rotate(350,Angle),
jedz_wprzod.
Algorytm 2
Do rozwiązania tego problemu skorzystaliśmy z predykatu chceck_distance umożliwiącego wykrycie przeszkody oraz stworzyliśmy predykat jedz_wprzod, który definiuje trigger który wyzwalał obrot robota o losowy kąt z przedziału 100-130 stopni gdy robot w pobliżu wykrył przeszkodę.
:- consult('plnxt.pl').
start:-
nxt_open,
jedz_wprzod.
jedz_wprzod :-
nxt_go(300),
trigger_create(_,check_distance,obrot).
obrot :-
nxt_stop,
Angle is 100 + random(30),
nxt_rotate(350,Angle),
jedz_wprzod.
check_distance :-
nxt_ultrasonic(Distance,force),
Distance < 15.
Problemy
Napotkaliśmy trudności podczas testowania kolejnych wersji opracowanych przez nas algorytmów. Nie potrafimy ustalić dlaczego co jakiś czas byliśmy zmuszeni restartować system w celu poprawnego połączenia się z robotem. Stało się to bardzo poważnym utrudnieniem podczas testowania algorytmów.
Wnioski
Warstwa nxt_movement okazała się być bardzo pomocnym narzędziem podczas programowania zaawansowanych ruchów robotów typu ruch do przodu, tyłu, skręcanie i obracanie.
Dokumentacja okazała się zgodna z przetestowanymi poleceniami.
Dzięki nxt_movement można stworzyć poruszającego się robota nie tylko omijającego przeszkody ale także reagującego na bodźce świetlne w kilku linijkach kodu.
Propozycje rozwoju
Naszym zdaniem warstwę nxt_movement można rozszerzyć o akcję jeszcze bardziej wysokopoziomowe np. poruszanie się za intensywnością światła przez robota - nxt_search_light , nxt_search_sound. Interesujące byłoby dodanie ruchu robota po bardziej skomplikowanych trajektoriach typu zygzak nxt_go_ zigzag czy okrąg nxt_go_circle. Robot byłby w stanie wykonywać naprawdę widowiskowe ruchy w kilku linijkach kodu.