|
|
pl:mindstorms:lab:lab_plnxt_zapoznanie [2008/12/16 13:15] 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: FIXME | |
| |
===== Budowa robota ===== | |
| |
Należy zbudować robota opisanego w instrukcji QuickStart i dołączyć potrzebne sensory. | |
| |
===== Praca w powłoce SWIPL ===== | |
| |
Proszę uruchomić powłokę SWIPL i załadować plik plnxt.pl, a następnie: | |
* Otworzyć połączenie: nxt_open. | |
* Wybrać polecenie z dokumentacji: np. nxt_go_cm(400,80). | |
* Wykonać serię wybranych poleceń (przemieszczanie, odczyt sensorów). | |
* Zamknąć połączenie: nxt_close. | |
| |
===== Programy w pliku ===== | |
| |
Większość predykatów ma swoją wersję z opcją 'force', która wymusza natychmiastowe wykonanie polecenia. Brak tej opcji sprawia, że polecenie oczekuje na wykonanie do zatrzymania robota. | |
| |
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,200,force), % Jazda 200 cm do przodu z prędkością 400 stopni/sekundę. | |
nxt_go_cm(-400,200,force), % Jazda 200 cm do tyłu z prędkością 400 stopni/sekundę. | |
nxt_stop, | |
nxt_close. | |
| |
:- start. | |
</code> | |
Taki program nie ma większego sensu. Robot wykona kolejno polecenia jedno po drugim. W efekcie będzie stał w miejscu. | |
| |
| |
Bez opcji force polecenia są sekwencjonowane: | |
<code prolog> | |
:- consult('sciezka_do_plnxt.pl'). | |
| |
start :- | |
nxt_open, | |
nxt_go_cm(400,200), % Jazda 200 cm do przodu z prędkością 400 stopni/sekundę. | |
nxt_go_cm(-400,200), % Jazda 200 cm do tyłu z prędkością 400 stopni/sekundę. | |
nxt_stop, | |
nxt_close. | |
| |
:- start. | |
</code> | |
Po zakończeniu jazdy do przodu robot zacznie jechać spowrotem. | |
| |
===== Do czego w takim razie przydaje się 'force'? ===== | |
| |
Proszę przetestować prosty program z wykorzystaniem mechanizmu trigger (dokumentacja FIXME): | |
<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ć 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ń]] | |