Interfejs programistyczny PLNXT

Piotr Hołownia holownia@agh.edu.pl, Grzegorz J. Nalepa gjn@agh.edu.pl

Plan prezentacji

  • Omówienie platformy LEGO Mindstorms NXT.
  • Przegląd istniejących rozwiązań programistycznych.
  • Przedstawienie PLNXT.
  • Porównanie ze środowiskiem LEGO (NXT-G).
  • Przedstawienie dalszych prac.
  • Krótki pokaz.

Cele prezentacji

Przedstawienie Państwu PLNXT - zaawansowanego interfejsu programistycznego mojego autorstwa dla platformy LEGO Mindstorms:

  • uzupełnia istniejące rozwiązania programistyczne o programowanie deklaratywne,
  • daje możliwość rozszerzenia do wizualnego programowania regułowego.

Omówienie pracy związanej z powstawaniem PLNXT i wykorzystywaniem LEGO Mindstorms w Laboratorium Informatyki Katedry Automatyki AGH.

Platforma LEGO Mindstorms NXT

LEGO Mindstorms to zestaw edukacyjny umożliwiający:

  • budowę robotów,
  • budowę układów automatyki,
  • komunikację z nimi przez Bluetooth i przez USB,
  • programowanie ich.

Zestaw NXT

W skład zestawu wchodzą m.in.:

  • 'brick' - komputerowa jednostka centralna,
  • sensory (dotyk, dźwięk, światło, odległość),
  • serwomechanizmy,
  • klocki LEGO.

Brick

Jednostka centralna jest wyposażona w:

  • 32-bitowy mikrokontroler ARM7 - 256 KB FLASH, 64 KB RAM,
  • 8-bitowy mikrokontroler AVR - 4 Kbytes FLASH, 512 Byte RAM,
  • moduł komunikacji bezprzewodowej Bluetooth,
  • port USB (12 Mbit/s),
  • 4 porty wejściowe i 3 wyjściowe,
  • wyświetlacz LCD o rozdzielczości 100×64 pikseli,
  • głośnik o jakości dźwięku 8kHz.

Rozbudowa zestawu

Zestaw Mindstorms NXT jest świetnie przygotowany do rozbudowy. Dodatkowe elementy sprzedaje zarówno LEGO jak i inne firmy. Oto niektóre, z nich:

  • kompas,
  • akcelerometr,
  • czujnik podczerwieni,
  • żyroskop,
  • kamera.

Nic nie stoi na przeszkodzie, by konstruować własne komponenty.

Cechy i zastosowania Mindstorms NXT

Zestaw LEGO Mindstorms NXT jest kierowany do osób w wieku 10+. Wobec tego musi być prosty w obsłudze. Komponenty nie są precyzyjne.
NXT nie nadaje się do poważnych projektów automatyki i robotyki.

Ma to swoje zalety!
NXT może być wykorzystywane do szybkiego prototypowania. Zestaw jest łatwo rekonfigurowalny.

Przykład: Propozycja pracy dyplomowej Katedry Informatyki i Automatyki Politechniki Rzeszowskiej Sterowanie modelem linii technologicznej

Przegląd rozwiązań programistycznych

Środowiska tekstowe, proceduralne:

  • lejos/iCommand - API w języku Java dla Mindstorms NXT,
  • NXT++ - interfejs w języku C + +,
  • NQC - Not Quite C, język o składni C dla platformy Mindstorms RCX,
  • NBC i NXC - NeXT Byte Codes, Not eXactly C

Środowisko deklaratywne:

  • Legolog - opracowane dla platformy Mindstorms RCX oparte o Prolog. Oferuje jedynie API niskiego poziomu.

Środowiska graficzne

Motywacja do pracy

  • Potrzebujemy możliwości deklaratywnego programowania NXT (projekt Legolog przestał być rozwijany kilka lat temu).
  • Chcemy umożliwić regułowe projektowanie z wykorzystaniem wizualnych narzędzi XTT.

Czym jest PLNXT?

PLNXT to API w języku Prolog dla platformy Mindstorms NXT.

Jest rozwijane w ramach projektu HeKatE.

Ma na celu zapewnienie regułowego rozwiązania programistycznego wysokiego poziomu.

Wymagania wobec PLNXT

  • Pokrycie wszystkich funkcji standardowych komponentów NXT.
  • Przenośność, rozwiązanie dla systemu Windows i GNU/Linux.
  • Ponowne wykorzystanie wybranych rozwiązań:
    • Legolog - wskazówki przy komunikacji szeregowej,
    • iCommand - jeden z modułów jest całkowicie na nim oparty.
  • Uruchamianie na komputerze PC i kontrola robota NXT przy użyciu Bluetooth/USB.

Architektura

Architektura PLNXT

Moduły komunikacyjne

Istniejące moduły warstwy komunikacyjnej:

  • 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 (poza symulatorem) oparte są na protokole komunikacji LEGO.

Cechy warstwy komunikacyjnej

  • Nie powinna być bezpośrednio używana w projektach bazujących na PLNXT.
  • Jej dowolną inną implementację można stworzyć bazując na pliku wzorcowym.

Predykaty warstwy komunikacyjnej

:- module(nxt_actions_dummy,[
  nxt_actions_connection_open/0,     nxt_actions_connection_close/0,
  nxt_actions_motor/3,               nxt_actions_motor_sync/5,
  nxt_actions_motor_is_moving/1,     nxt_actions_motor_stop/1,
  nxt_actions_motor_stop/2,          nxt_actions_motor_get_speed/2,
  nxt_actions_motor_get_rotations/2, nxt_actions_motor_reset_position/2,
  nxt_actions_touch_sensor/2,        nxt_actions_sound_sensor/2,
  nxt_actions_light_sensor/2,        nxt_actions_light_sensor_LED/2,
  nxt_actions_ultrasonic_sensor/2,   nxt_actions_voltage/1,
  nxt_actions_voltage_millivolt/1,   nxt_actions_start_program/1,
  nxt_actions_stop_program/0,        nxt_actions_play_sound_file/2,
  nxt_actions_stop_sound_playback/0, nxt_actions_play_tone/2,
  nxt_actions_get_brick_name/1,      nxt_actions_set_brick_name/1
]).

Komunikacja szeregowa

Moduł komunikacji szeregowej opiera się bezpośrednio na protokole LEGO.

Przykład:

nxt_actions_play_tone(Frequency,Duration) :-
	nxt_actions_connection_type(usb),
	mutex_lock(nxt_serial_device),
	nxt_actions_play_tone_cmd(Frequency,Duration),
	mutex_unlock(nxt_serial_device).
 
nxt_actions_play_tone_cmd(Frequency,Duration) :-
	nxt_actions_send_bytes(['\x80','\x03']),
	nxt_actions_send_number(Frequency,2),
	nxt_actions_send_number(Duration,2).

iCommand

Moduł iCommand wykorzystuje javową bibliotekę. Jej metody są wywoływane w Prologu przy użyciu pakietu JPL.

Przykład:

nxt_actions_play_tone(Frequency,Duration) :-
	jpl_call('icommand.nxt.Sound','playTone',[Frequency,Duration],_).
 
nxt_actions_motor(Motor,Speed,0) :-
	Speed > 0,
	jpl_get('icommand.nxt.Motor',Motor,MotorHandle),
	jpl_call(MotorHandle,'setSpeed',[Speed],_),
	jpl_call(MotorHandle,'forward',[],_).

Warstwa sensomotoryczna

nxt_motor(Motor,Speed) :-
	nonvar(Motor),var(Speed),
	nxt_actions_motor_get_speed(Motor,Speed).
 
nxt_motor(Motor,0) :-
	nonvar(Motor),
	nxt_actions_motor_stop(Motor).
 
nxt_motor(Motor,Speed) :-
	nonvar(Motor),nonvar(Speed),
	nxt_actions_motor(Motor,Speed,0).

Warstwa behawioralna

nxt_rotate(Speed,Degrees,force) :-
	nxt_robot(WC,AL,_,_,_,_,_,_,_,_),
	%Distance is pi*AL*Degrees/360,
	%Angle is Distance/WC*360,
	Angle is round(pi*AL*Degrees/WC),
	nxt_turn(Speed,Angle,force).

Obsługa wątków

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

  • Trigger uruchamia akcję pod warunkiem zajścia zdarzenia.
  • Timer uruchamia akcję po wyznaczonym czasie.

Przykład zastosowania triggera

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.

Programy sekwencyjne

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. Przykład:

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.

Laboratorium

Laboratorium 215 w budynku C-3 stanowi obszar pracy stażystów Laboratorium Informatyki.

Aspekty organizacyjne:

  • przygotowanie zakupionych zestawów NXT,
  • rozmieszczenie klocków w „specjalistycznych” pudełkach i oznaczenie ich,
  • opisanie wykonanej pracy na stronach naszej AI wiki.

Praca ze studentami

PLNXT zostało użyte podczas zajęć JSI ze studentami czwartego roku Automatyki i Robotyki:

  • 1 laboratorium zapoznawcze z Mindstorms NXT,
  • 2 laboratoria wykorzystujące oryginalne oprogramowanie LEGO,
  • 2 - dotyczące PLNXT mojego autorstwa:

Niektóre uwagi studentów zawarte w sprawozdaniach:

  • „Naszym zdaniem PLNXT daje większe możliwości niż standardowe środowisko graficzne LEGO.”
  • „API prologu jest zdecydowanie wygodniejszą formą tworzenia oprogramowania dla Mindstorms.”
  • „Prolog jako język programowania wprowadza zdecydowanie krótszą, a zarazem bardziej logiczną składnię, co w konsekwencji obfituje w znaczący wzrost efektywności robota.”

Efekt współpracy ze studentami

Wykorzystanie PLNXT podczas zajęć przyniosło następujące korzyści:

  • konstruktywną krytykę,
  • pomoc przy znajdywaniu błędów,
  • docenienie zalet przez młodszych kolegów, prawie automatyków, więc fachowców, :)
  • nadzieję, że zostaniemy docenieni również przez koleżanki informatyczki. ;)

PLNXT vs. oprogramowanie LEGO (NXT-G)


PLNXT NXT-G
Czytelność dobra bardzo dobra przy prostych algorytmach, kiepska przy skomplikowanych
Możliwość kompilacji programu i uruchamiania go bez udziału komputera - +
Możliwość kontroli NXT bez konieczność ładowania programu do pamięci + -
Łatwość programowania duża mała przy skomplikowanych projektach
Łatwość instalacji średnia duża

Wypowiedź jednego z użytkowników forum LEGO:
„The LEGO software that comes with the nxt kit is somewhat limiting and gets hard to use once you get good at programing. In small, less complex programs nxt-g is great and easy to use. But when you get into longer, more complex programing, it is quicker to use a text based programing language.”

Zestaw LEGO Mindstorms NXT jest kierowany do osób w młodym wieku. To wymaga prostego, przyjemnego dla oka młodego człowieka interfejsu graficznego, co nie idzie w parze z funkcjonalnością.

Przykład algorytmu

„Sprzątacz”:
Robot ma za zadanie oczyścić teren w promieniu 40 cm od swojej początkowej pozycji. Jeżeli w tym obszarze znajdują się jakieś przeszkody, próbuje je wypchnąć poza niego. Po oczyszczeniu całego terenu, wraca do pozycji wyjściowej i kończy pracę.

Algorytm w PLNXT

:- consult('../plnxt.pl').
 
start :-
    nxt_open,
    trigger_create(_, check_stop, [nxt_stop, nxt_close]),
    patrol.
 
check_distance :-
    nxt_ultrasonic(Distance,force),
    Distance < 40.
 
patrol :-
    trigger_create(_, check_distance, [nxt_stop, push_out, patrol]),
    nxt_rotate(250, 360).
 
check_stop :-
    nxt_touch(Stop,force),
    Stop = 1.
 
push_out :-
    nxt_go_cm(450, 40),
    nxt_go_cm(-450,40).

Algorytm w NXT-G

Uproszczony:

W NXT-G nie ma możliwości odczytu prędkości silnika!

Definicja budowy robota

W PLNXT można zdefiniować parametry robota (obwód kół, długość osi), więc możliwe jest wykonywanie pewnych manewrów.
Np.:

  • obrót robota wokół własnej osi o zadany kąt,
  • przemieszczenie robota o zadaną odległość,
  • wykonanie skrętu z zadanym promieniem.

Obrót/przemieszczenie robota

Rozwiązanie w PLNXT:

nxt_rotate(+Speed,+Angle).

Rozwiązanie NXT-G:

Promień skrętu

W NXT-G nie można wykonać skrętu o zadanym promieniu.

Rozwiązanie w PLNXT:

nxt_turn(+Speed,+Angle,+Radius).

Rozwiązanie NXT-G:

Możliwości rozwoju

  • Warstwa behawioralna jest przystosowana jedynie do pracy z robotem Tribot i jego odmianami. Można ją rozszerzyć na inne typy, np. roboty humanoidalne.
  • Możliwa jest integracja z XTT - formalizmem reprezentacji wiedzy i reguł. To udostępniłoby kompletne, wizualne środowisko programowania regułowego dla Mindstorms NXT.
  • Integracja z telefonem OpenMoko.

XTT

Praca panów Krzysztofa Kaczora i Grzegorza J. Nalepy udostępniła narzędzie wizualnego programowania regułowego HQEd - (Hekate Qt Editor Project) oparte o XTT (EXtended Tabular Trees).

XTT ma trzy poziomy reprezentacji:

  • wizualny - hierarchiczna struktura tabel łączonych ze sobą,
  • logiczny - tabele zawierają reguł,
  • implementacyjny - reguły są przetwarzane przez Prolog.

Przykład tabel XTT

XTT i PLNXT

Przetwarzanie tabel XTT przez Prolog stwarza możliwość programowania Mindstorms NXT w wizualnym środowisku HQEd.

Użycie XTT jest głównym celem dalszych prac nad PLNXT.

Kompilator prologu na platformach wbudowanych (OpenMoko)

Cele:

  • Opracowanie środowiska umożliwiające uruchomienie kompilatora prologu na systemie wbudowanym (np. telefon z procesorem ARM).
  • W miarę możliwości wykorzystanie ogólnodostępnych rozwiązań, zgodne z przyjętymi standardami (POSIX, GNU/Linux).
  • Zapewnienie warunków umożliwiających działanie w czasie rzeczywistym.

Platforma sprzętowa

  • Neo Freerunner http://www.openmoko.org.
  • Dostępność, dokumentacja, przystępna cena.
  • Spore zainteresowanie ze strony społeczności open source.
  • Co najmniej siedem różnych dystrybucji GNU/Linux możliwych do uruchomienia.
  • Potencjalnie interesujące rozwiązania sprzętowe (GPS, host USB, bluetooth, WiFi itd.).

Neo

Neo FreRunner

Platforma software'owa

  • Baza: dystrybucja openmoko.
  • Dostępny toolchain oraz skrypty umożliwiające zbudowanie własnej dystrybucji w oparciu o openmoko.
  • Scheduler RT: kernel openmoko + łaty z http://rt.wiki.kernel.org/.
  • Takie rozwiązanie jest w całości zgodne z POSIX (mała konieczność ingerencji w kod źródłowy + przenaszalność).
  • Wybór poniekąd z konieczności (brak dobrych i ogólnodostępnych implementacji RT dla GNU/Linux).
  • Dostępne kompilatory prologu: SWI, Yap.

Wnioski z wykonanych prac

  • GNU/Linux + embedded zyskuje na popularności - dostępne gotowe i funkcjonalne środowiska (openmoko, OpenEmbedded, android, maemo…).
  • Wciąż małe ukierunkowanie na zastosowania z użyciem RT - konieczność ręcznej kompilacji, brak zgodności łat ze źródłami dostępnymi w dystrybucji itp.
  • Dzięki zgodności z POSIX i typowych rozwiązań z sytemów Unix/Linux projekt zyskuje na uniwersalności pod względem użycia platform sprzętowych (arm, x86) jak i programowych (np. GNU/Linux, *BSD, Solaris).

Podsumowanie

  • PLNXT jako nowy interfejs uzupełnia istniejące rozwiązania programistyczne o programowanie deklaratywne.
  • Pod wskazanymi względami jest lepsze od innych (np. NXT-G).
  • Daje możliwość rozszerzenia do wizualnego programowania regułowego.
  • Pierwsza wydana wersja PLNXT na licencji GPL jest dostępna w AI Wiki.

Pokaz

Dziękuję za uwagę!

Zapraszam do udziału w pokazie i zadawania pytań.