Interfejs programistyczny PLNXT
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.
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
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 Istnieje prototyp modelu linii technologicznej wykonany z Lego Mindstorms. Aktualnie sterowany jest przez inteligentne klocki Lego NXT. Należy udoskonalić linię, wykonać interfejs pozwalający na sterowanie ze sterowników PLC (np. Siemens, Fanuc), opracować nowe algorytmy sterowania (w języku drabinkowym lub innym), dokonać wizualizacji działania.
Przegląd rozwiązań programistycznych
Środowiska tekstowe, proceduralne:
-
NXT++ - interfejs w języku C + +,
NQC - Not Quite C, język o składni C dla platformy Mindstorms RCX,
-
Środowisko deklaratywne:
Legolog - opracowane dla platformy Mindstorms RCX oparte o Prolog. Oferuje jedynie
API niskiego poziomu.
Środowiska graficzne
Motywacja do pracy
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
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
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.
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.
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.
-
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
Baza: dystrybucja openmoko.
Dostępny toolchain oraz skrypty umożliwiające zbudowanie własnej dystrybucji w oparciu o openmoko.
-
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ń.