|
|
pl:mindstorms:lab:lab_plnxt_zapoznanie [2010/05/11 00:05] snowaczyk |
pl:mindstorms:lab:lab_plnxt_zapoznanie [2019/06/27 15:50] |
====== Laboratorium (zapoznanie z PLNXT) ====== | |
| |
===== Opis ===== | |
| |
Cel: zapoznanie z interfejsem programistycznym PLNXT i budowa prostych algorytmów. | |
| |
Środki: | |
* zestaw LEGO, | |
* adapter BT, | |
* PLNXT. | |
| |
===== Przygotowanie stanowiska ===== | |
| |
__UWAGA!__ Przed rozpoczęciem ćwiczeń należy starannie przygotować swoje stanowisko pracy [[lab215|zgodnie z instrukcją]]. | |
| |
===== Wstęp ===== | |
| |
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: | |
* najniższa warstwa (nxt_actions), | |
* średnia warstwa (nxt_sensomoto), | |
* najwyższa warstwa (nxt_movement). | |
| |
==== Warstwa nxt_actions ==== | |
| |
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 nxt_sensomoto ==== | |
| |
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 nxt_movement ==== | |
| |
**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: {{:pl:mindstorms:lab:nxt_movement.pdf|nxt_movement.pdf}} | |
| |
===== Budowa robota ===== | |
| |
Należy zbudować robota opisanego w instrukcji QuickStart i dołączyć sensory. | |
| |
| |
| |
===== Praca w powłoce SWIPL ===== | |
| |
Proszę uruchomić powłokę SWIPL (polecenie xpce) i załadować plik plnxt.pl ([plnxt].), a następnie: | |
* Otworzyć połączenie: nxt_open. | |
* Wykonać serię wybranych z dokumentacji poleceń (przemieszczanie, odczyt sensorów). Np.: | |
* nxt_go(300). % Jazda do przodu z prędkością 300 stopni/sekundę. | |
* nxt_stop. | |
* nxt_go_cm(400,80). % Jazda do przodu z prędkościa 400 stopni/sekundę. Zatrzymanie po 80 cm. | |
* nxt_touch(Value). % Odczyt sensora dotyku. | |
* nxt_sound(Value). % Odczyt sensora dźwięku. | |
* nxt_light(Value). % Odczyt sensora światła. | |
* nxt_light_LED(activate). % Włączenie diody sensora światła. | |
* nxt_light(Value). | |
* nxt_light_LED(passivate). | |
* nxt_ultrasonic(Value). | |
* nxt_rotate(350,360). % Obrót w prawo o 360 stopni z prędkością 350 stopni/sekundę. | |
* nxt_play_tone(500,2000). % Wydanie dźwięku o częstotliwości 500 Hz i czasie trwania 2000 ms. | |
* nxt_voltage_millivolt(Voltage). % Odczyt napięcia baterii. | |
* Zamknąć połączenie: nxt_close. | |
===== Programy w pliku ===== | |
| |
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. | |
<code prolog> | |
:- 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. | |
</code> | |
| |
===== Do czego w takim razie przydaje się 'force'? ===== | |
| |
Proszę przetestować proste przykłady programów z wykorzystaniem mechanizmu trigger (dokumentacja: {{:pl:mindstorms:lab:threads.pdf|threads.pdf}}). | |
| |
==== Przykład ==== | |
| |
<code prolog> | |
:- 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. | |
</code> | |
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ą. | |
| |
| |
| |
===== Implementacja algorytmu ===== | |
| |
Proszę zaimplementować poniższe algorytmy: | |
| |
==== Algorytm 1 ==== | |
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)//". | |
| |
==== Algorytm 2 ==== | |
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ę. | |
| |
===== Zakończenie ===== | |
| |
__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! | |
| |
| |
| |
===== Sprawozdanie ===== | |
| |
W przypisanej grupie przestrzeni nazw stworzyć stronę, na której umieścić: | |
* kod Państwa programów, | |
* spostrzeżenia, napotkane problemy, wnioski, | |
* uwagi dotyczące funkcjonalności PLNXT. | |
| |
[[pl:dydaktyka:piw:2010:wykaz_sprawozdan|Wykaz sprawozdań]] | |