Cel: zapoznanie z interfejsem programistycznym PLNXT i budowa prostych algorytmów.
Środki:
UWAGA! Przed rozpoczęciem ćwiczeń należy starannie przygotować swoje stanowisko pracy zgodnie z instrukcją.
PLNXT to API w języku Prolog dla LEGO Mindstorms NXT.
Praca nad PLNXT jest wciąż w toku. Państwa uwagi w sprawozdaniach (także krytyczne) będą dla nas cenne.
API jest podzielone na następujące wartswy:
Warstwa odpowiada za komunikację z NXT. Mamy do dyspozycji predykaty poruszające silnikami, odczytującymi dane z sensorów, itp. W tej warstwie można zastosować różne systemy komunikacji. Na zajęciach będziemy używać komunikacji po porcie szeregowym z wykorzystaniem protokołu komunikacji LEGO.
Warstwa bazuje na nxt_actions. To, co zostało zaimplementowane w niższej warstwie, w tej jest obudowane w logikę (np. sprawdzanie, czy wartość prędkości jest dopuszczalna).
Warstwa, z której Państwo będziecie bezpośrednio korzystać. Warstwa dostarcza predykaty realizujące złożoną pracę silników: ruch pojazdu do przodu, do tyłu, skręcanie, obracanie.
Dokumentacja: nxt_movement.pdf
Należy zbudować robota opisanego w instrukcji QuickStart i dołączyć sensory.
Proszę uruchomić powłokę SWIPL (polecenie xpce) i załadować plik plnxt.pl ([plnxt].), a następnie:
Większość predykatów ma swoją wersję z opcją 'force' (np. nxt_go(400,force).), która wymusza natychmiastowe wykonanie polecenia.
Brak tej opcji sprawia, że polecenie oczekuje z wykonaniem do zatrzymania robota.
To pozwala na pisanie sekwencyjnych programów, jak przykład niżej.
Proszę skopiować poniższy kod do pliku i załadować w SWIPL.
:- consult('sciezka_do_plnxt.pl'). start :- nxt_open, nxt_go_cm(400,80), % Jazda 80 cm do przodu z prędkością 400 stopni/sekundę. nxt_go_cm(-400,80), % Jazda 80 cm do tyłu z prędkością 400 stopni/sekundę. nxt_close. :- start.
Proszę przetestować proste przykłady programów z wykorzystaniem mechanizmu trigger (dokumentacja: threads.pdf).
:- 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.
Trigger będzie wyzwolony, gdy check_distance będzie prawdziwe. Wtedy zostanie wykonane zatrzymanie robota i zamknięcie połączenia.
Zatem jest to prosty program: robot porusza się do przodu do napotkania przeszkody.
Pomiar odległości odbywa się cyklicznie. Bez opcji 'force' odbyłby się po zatrzymaniu silników (w tym przypadku „nigdy”).
Robota czekałoby bolesne spotkanie z przeszkodą.
Proszę zaimplementować poniższe algorytmy:
Robot porusza się dowolnie wewnątrz obszaru ograniczonego czarną linią (można wykorzystać planszę testową). Nie może poza niego wyjechać! Gdy najedzie na czarną linię, powinien zawrócić – niekoniecznie o 180 stopni, żeby było ciekawiej. Podpowiedź: można użyć formuły typu „Angle is 120 + random(120)”.
Robot podąża wzdłuż czarnej linii (można wykorzystać planszę testową). Nie może jej zgubić! Gdy napotka przeszkodę, powinien się zatrzymać i poinformować o problemie sygnałem dźwiękowym. Po usunięciu przeszkody robot powinien kontynuować jazdę.
UWAGA! Prosze nie rozmontowywać robota!
UWAGA! Jeżeli należycie Państwo do ostatniej tego dnia grupy ćwiczeniowej, należy wyciągnąć baterie z robota i przekazać je prowadzącemu do naładowania!
W przypisanej grupie przestrzeni nazw stworzyć stronę, na której umieścić: