To jest stara wersja strony!


PLNXT Wprowadzenie

LEGO Mindstorms NXT jest uniwersalną platformą, która oferuje konstruowanie robotów, jak również rozwiązania programistycznie. Jeśli chodzi o programowanie Mindstorms NXT, LEGO dostarcza środowisko, które pozwala tworzyć algorytmy przy użyciu prostego wizualnego języka diagramów przepływu sterowania. Dzięki otwartości platformy pojawiło się wiele programistycznych rozwiązań dla języków takich, jak C/C + +, Java, etc. Przykłady obejmują lejos/iCommand (http://lejos.sourceforge.net) i NQC (http://bricxcc.sourceforge.net/nqc). Wczesne próby rozwiązań opartych o Prolog można znaleźć w projekcie Legolog (http://www.cs.toronto.edu/cogrobo/Legolog). Niestety nie oferuje on ogólnego API i obsługuje tylko starszą wersję Mindstorms - RCX.

PLNXT to API w języku Prolog dla platformy Mindstorms NXT. Jest rozwijane w ramach projektu HeKatE (http://hekate.ia.agh.edu.pl). Ma na celu zapewnienie regułowego rozwiązania programistycznego wysokiego poziomu.

Na podstawie przeglądu istniejących rozwiązań, wymagania nowego API dla NXT zostały sformułowane następująco:

  • pokrycie wszystkich funkcji standardowych komponentów NXT,
  • przenośność, rozwiązanie dla systemu Windows i GNU/Linux,
  • ponownego wykorzystania niektórych dostępnych rozwiązań.

PLNXT ma następujące cechy:

  • jest uruchamiany na komputerze i kontroluje robota NXT przy użyciu Bluetooth/USB,
  • na poziomie funkcjonalnym API jest spójne z innymi dostępnymi rozwiązaniami.

Projekt architektury trójwarstwowej API

  • Warstwa behawioralna (nxt_movement) udostępnia programiście funkcje wysokiego poziomu. Zawiera abstrakcyjne metody kontroli robota takie, jak przemieszczanie się, skręcanie. Obecnie działa dla robota TriBot. Ostatecznie powinna dostarczać pełnego mechanizmu ruchu dla różnych robotów.
  • Warstwa sensomotoryczna (nxt_sensomoto) zapewnia kontrolę komponentów zestawu NXT: silników, sensorów, jak również brick (jednostki centralnej). Ta warstwa może być używana do bezpośredniego odczytu sensorów, jak również programowania silników pojedynczo. Jest to warstwa, która może być używana przez programistę do uwydatnienia funkcjonalności warstwy behawioralnej.
  • Celem warstwy komunikacyjnej (nxt_actions) jest wykonywanie akcji wartswy sensomotorycznej i komunikacja z NXT. Obecnie stworzonych jest kilka alternatywnych modułów tej warstwy, dostarczających różnych środków komunikacji:
    • moduł komunikacji z bezpośrednim użyciem portu szeregowego i protokołu komunikacji LEGO,
    • rozwiązanie hybrydowe oparte na javowej bibliotece iCommand,
    • rozwiązanie hybrydowe oparte na socketach z wykorzystaniem biblioteki NXT++, która komunikuje się z robotem,
    • prosty graficzny symulator NXT, pozwalający w pewnym zakresie testować algorytmy bez użycia zestawu Mindstorms.

W rzeczywistości wszystkie te rozwiązania oparte są na protokole komunikacji LEGO.

Dowolną inną implementację warstwy komunikacyjnej można stworzyć bazując na pliku nxt_actions_dummy.pl. Ograniczeniem jest to, że nazwy predykatów eksportowanych muszą pozostać takie same. Nie ma także możliwości wprowadzenia niczego nowego bez uwzględnienia tego w warstwie wyższej. Dlaczego? Jest to jedna z warstw projektu, ale wydzielona tylko, aby umożliwić wstawienie w jej miejsce różnych alternatywnych wersji. Nie powinna być bezpośrednio używana w projektach bazujących na PLNXT. Nie ma takiej potrzeby.

“Threads” jako dodatkowy komponent

Do implementacji złożonych algorytmów sterowania NXT niezbędne jest wprowadzenie mechanizmów opóźniania akcji w czasie oraz uwarunkowanie akcji od pewnych zdarzeń. W module „threads” znajdują się predykaty umożliwiające tworzenie triggerów i timerów z wykorzystaniem wątków w SWIProlog. Trigger uruchamia akcję pod warunkiem zajścia zdarzenia. Timer uruchamia akcję po wyznaczonym czasie.

Platforma LEGO Mindstorms NXT

Minimalna wiedza o NXT potrzebna do używania PLNXT

Zestaw LEGO Mindstorms NXT

W skład zestawu Mindstorms NXT wchodzi:

  • Brick (jednostka centralna).
  • Sensory:
    • Dotyku. Szumna nazwa. W rzeczywistości jest to zwykły przycisk, który rozróżnia dwa stany (wciśnięty, puszczony).
    • Natężenia dźwięku.
    • Natężenia światła. Wyposażony w czerwoną diodę. Włączenie diody umożliwia rozpoznawanie barw (w skali szarości) przy słabym oświetleniu zewnętrznym.
    • Odległości. To ten podobny trochę do głowy modliszki. Z dwoma dużymi “oczami”. Przy użyciu ultradźwięków badana jest odległość pomiędzy sensorem, a najbliższą przeszkodą. Zasięg do 255 cm.
  • Trzy serwomechanizmy.
  • Klocki umożliwiające składanie robotów z wykorzystaniem powyższych elementów.

Łączenie komponentów

Do portów B i C należy podłączyć silniki odpowiadające za ruch. Do portu A silnik używany do dodatkowych funkcji. Standardowe podłączenie sensorów (chociaż można podłączyć je dowolnie):

  • Port 1: dotyk.
  • Port 2: dźwięk.
  • Port 3: światło.
  • Port 4: odległość.

Interfejs

Przyciski

Włączanie NXT odbywa się przez wciśnięcie pomarańczowego przycisku. Tym samym przyciskiem zatwierdza się wybór w menu. Do przemieszczania się między pozycjami służą przyciski w kształcie trójkątów. Ciemny przycisk poniżej służy do anulowania wyboru i do wyłączania NXT (gdy jest się w głównym menu).

Bluetooth

Włączanie BT odbywa się w menu interfejsu NXT. Należy wybrać: Bluetooth → On/Off → {On albo Off}. Gdy BT jest włączony, w lewym górnym rogu wyświetlacza znajduje się symbol BT oraz na prawo od niego symbol '<'. Po nawiązaniu połączenia obok symbolu '<' pojawia się symbol '>'. Razem tworzą: '<>'. Po zamknięciu połączenia znika symbol '>'.

Baterie

W prawym górnym rogu wyświetlacza znajduje się wskaźnik poziomu baterii. Cały czarny oznacza pełne baterie.

Ustawienia

Sleep

NXT ma funkcję “sleep”. Fabrycznie jest ustawiona na 10 minut. Jeżeli do tego czasu nie zostanie wciśnięty dowolny przycisk, NXT się wyłączy. To oznacza, że może to zrobić także w trakcie wykonywania algorytmu. To może być denerwujące. W celu wyłączenia należy wybrać z menu Settings → Sleep → Never.

Dźwięk

Przy włączaniu NXT mogą być wydawane irytujące dźwięki. Można je wyłączyć wybierając z menu Settings → Volume → 0.

Odczyt wartości sensorów

Można odczytać wskazania sensorów bezpośrednio z menu NXT. Należy wybrać View → {rodzaj_sensora} → {port}

Dokumentacja

FIXME serwer dokumentacji online

Download

FIXME

Quick Start

Jeżeli nie używałeś jeszcze Mindstorms NXT, polecam przejrzeć instrukcję LEGO. Ładna, kolorowa, z obrazkami. :) Na pewno dysponujesz wersją angielską. Tutaj do ściągnięcia wersja polska. Jeśli jesteś do tego zbyt leniwy, zacznij od krótkiego opisu Mindstorms NXT (FIXME link), niezbędnego do używania PLNXT. Zawarta jest tam minimalna, jak tylko się da, wiedza o platformie.

Pobierz i rozpakuj aktualną wersję PLNXT. Do ściągnięcia w dziale download.

Przygotowanie środowiska

Różne moduły komunikacyjne wymagają różnego przygotowania środowiska. Tymczasowo możliwa jest używanie jedynie modułu “serial”. Wkrótce będzie to poprawione. Wobec tego dalsze instrukcje są przygotowane jedynie dla tego modułu.

Moduł nxt_actions_serial

FIXME Pozbierać wszystko, co tu zostało odkryte, do kupy.

Moduł nxt_actions_icommand

Moduł nxt_actions_sockets

Pierwsze kroki

Jeżeli masz już poprawnie przygotowane środowisko (patrz Quick start), możesz przejść do pisania prostych programów. Zachęcam do zapoznania się z „Pierwszymi krokami”.

Praca w powłoce SWIPL

Proszę uruchomić powłokę SWIPL 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 (FIXME dokumentacja).

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.

Strony pokrewne

Licencja

Copyright © 2006-9 by the HeKatE Project

PLNXT jest rozwijany przez HeKatE Project (http://hekate.ia.agh.edu.pl).

PLNXT jest wolnym oprogramowaniem: możesz go rozprowadzać i/lub modyfikować na warunkach licencji GNU General Public License, wydanej przez Free Software Foundation, według wersji 3 tej licencji lub którejś z późniejszych.

PLNXT rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI; nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. W celu uzyskania bliższych informacji, przeczytaj licencję GNU General Public License. Z pewnością wraz z PLNXT otrzymałeś egzemplarz licencji GNU General Public License. Jeśli nie, zobacz http://www.gnu.org/licenses/.

Kontakt

Prosimy o kontakt w przypadku, gdy:

  • zawartość tej strony nie jest wyczerpująca,
  • chcesz zgłosić błąd programu (bug),
  • masz dla nas rady, sugestie, komentarze, itp.

E-mail: holownia(_at_)agh.edu.pl

Aktualności/problemy

14 stycznia 2009
PLNXT zostało użyte podczas zajęć ze studentami. Liczymy na uzyskanie opinii, które pomogą usunąć błędy. Wcześniej trwały prace nad modułem warstwy komunikacyjnej z wykorzystaniem połączenia szeregowego, opartego bezpośrednio na protokole LEGO. Protokół ten daje większe możliwości, niż używane wcześniej moduły icommand i sockets. Pozwala m.in. synchronizować pracę silników. Wyższa warstwa została przekształcona tak, żeby wykorzystać w pełni to, co daje nam protokół LEGO. Należy ją jeszcze wtórnie przystosować do użycia modułów warstwy komunikacyjnej, niezapewniających synchronizacji, jak również same te moduły. W tym momencie możliwe jest użycie tylko modułu serial jako warstwy komunikacyjnej.

pl/plnxt/start.1234872434.txt.gz · ostatnio zmienione: 2019/06/27 15:59 (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