|
|
pl:mindstorms:lab:lab_plnxt_zapoznanie [2008/12/16 22:24] holownia |
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. | |
| |
===== 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. | |
| |
===== Przygotowanie środowiska ===== | |
| |
* zapisz plik {{:pl:mindstorms:lab:plnxt-20081217.tar.gz|plnxt-20081217.tar.gz}} na dysku w folderze FIXME | |
* rozpakuj: tar xvzf plnxt-20081217.tar.gz | |
* przejdź do katalogu plnxt: cd plnxt | |
| |
===== 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 na wykonanie 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 200 cm do przodu z prędkością 400 stopni/sekundę. | |
nxt_go_cm(-400,80), % Jazda 200 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 1 ==== | |
| |
<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ą. | |
| |
==== Przykład 2 ==== | |
| |
<code prolog> | |
:- consult('../plnxt.pl'). | |
| |
start:- | |
nxt_open, | |
go_on_buddy, | |
trigger_create(_,pushed,[nxt_stop,nxt_close]). | |
| |
go_on_buddy :- | |
nxt_go(200), | |
sleep(1), % Chwila przerwy, żeby jedno klaśnięcie nie zostało rozpoznane jako dwa. | |
trigger_create(_,clap,wait_a_second_buddy). | |
| |
wait_a_second_buddy :- | |
nxt_stop, | |
sleep(1), | |
trigger_create(_,clap,go_on_buddy). | |
| |
% Sprawdzenie, czy natężenie dźwięku przekracza progową wartość. | |
clap :- | |
nxt_sound(Value,force), | |
Value > 15. | |
| |
% Sprawdzenie, czy sensor dotyku jest wciśnięty. | |
pushed :- | |
nxt_touch(Value,force), | |
Value=1. | |
</code> | |
| |
Robot jedzie do przodu. Zatrzymuje się po klaśnięciu. Wznawia ruch po ponownym klaśnięciu.\\ | |
Po wciśnięciu sensora dotyku zatrzymuje się i zamyka połączenie.\\ | |
Proszę odpowiednio dobrać próg natężenia dźwięku. W laboratorium może być głośno.\\ | |
Zbyt niska wartość może spowodować zapętlenie.\\ | |
Zbyt wysoka sprawi, że zamiast klaskać, trzeba będzie solidnie "puknąć" sensor. | |
| |
===== Implementacja algorytmu ===== | |
| |
Proszę zaimplementować jeden lub więcej z poniższych algorytmów: | |
| |
==== Omijanie przeszkód ==== | |
| |
Robot przemieszcza się do przodu. Po napotkaniu przeszkody zatrzymuje się i próbuje ją ominąć. W fazie przemieszczania do przodu (tylko w tej fazie) robot zatrzymuje się i zamyka połączenie po klaśnięciu. | |
| |
==== Unikanie przeszkód ==== | |
| |
Robot przemieszcza się do przodu. Po napotkaniu przeszkody cofa się, obraca w innym kierunku i wznawia przemieszczanie do przodu. W fazie przemieszczania do przodu (tylko w tej fazie) robot zatrzymuje się i zamyka połączenie po klaśnięciu. | |
| |
==== Panikarz ==== | |
| |
Robot przemieszcza się powoli. Po klaśnięciu zmienia kierunek i szybko ucieka przez jakiś czas (wtedy nie jest podatny na klaśnięcie), po czym uspokaja się i znowu jedzie powoli. Zatrzymuje się i zamyka połączenie po wciśnięciu sensora dotyku. | |
| |
===== Zakończenie ===== | |
| |
Rozmontować robota, wkladając wszystkie części do [[pl:mindstorms:lab:wyposazenie#rozlozenie_klockow_w_przegrodach|odpowiednich przegródek w pudełku]] | |
| |
__UWAGA__! Należy to robić powoli i ostrożnie - połamanie klocków przy rozmontowywniu jest latwiejsze niż przy montażu. :-( | |
| |
===== 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:mindstorms:studenci:przedmioty:jsi:sprawozdania2008|Wykaz sprawozdań]] | |