To jest stara wersja strony!


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 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: 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.

:- 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.

Do czego w takim razie przydaje się 'force'?

Proszę przetestować proste przykłady programów z wykorzystaniem mechanizmu trigger (dokumentacja: threads.pdf).

Przykład

:- 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ą.

Implementacja algorytmu

Proszę zaimplementować jeden lub więcej z poniższych algorytmów:

Algorytm 1

Robot porusza się dowolnie wewnątrz obszaru na planszy testowej ograniczonego czarną linią. Nie może poza niego wyjechać! Gdy najedzie na czarną linię, powinien zawrócić. Niekoniecznie o 180 stopni. Np. Angle is 120 + random(120) zunifikuje Angle z liczbą z przedziału od 120 do 240. Można jej użyć jako kąt obrotu robota.

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.

Wykaz sprawozdań

pl/mindstorms/lab/lab_plnxt_zapoznanie.1273502950.txt.gz · ostatnio zmienione: 2019/06/27 15:57 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0