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

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

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

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

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

Przykład 1

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

Przykład 2

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

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

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