Piotr Hołownia holownia@agh.edu.pl, Grzegorz J. Nalepa gjn@agh.edu.pl
Przedstawienie Państwu PLNXT - zaawansowanego interfejsu programistycznego mojego autorstwa dla platformy LEGO Mindstorms:
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:
Jednostka centralna jest wyposażona w:
Zestaw Mindstorms NXT jest świetnie przygotowany do rozbudowy. Dodatkowe elementy sprzedaje zarówno LEGO jak i inne firmy. Oto niektóre, z nich:
Nic nie stoi na przeszkodzie, by konstruować własne komponenty. Pozwalają na to dostępne specyfikacje LEGO. Wiele ciekawych projektów można znaleźć na stronie http://www.philohome.com/.
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.
Środowiska tekstowe, proceduralne:
Środowisko deklaratywne:
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.
Istniejące moduły warstwy komunikacyjnej:
W rzeczywistości wszystkie te rozwiązania (poza symulatorem) oparte są na protokole komunikacji LEGO.
:- 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 ]).
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).
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',[],_).
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.
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.
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 215 w budynku C-3 stanowi obszar pracy stażystów Laboratorium Informatyki.
Aspekty organizacyjne:
PLNXT zostało użyte podczas zajęć JSI ze studentami czwartego roku Automatyki i Robotyki:
Niektóre uwagi studentów zawarte w sprawozdaniach:
Wykorzystanie PLNXT podczas zajęć przyniosło następujące korzyści:
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ą.
„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ę.
:- 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).
W PLNXT można zdefiniować parametry robota (obwód kół, długość osi), więc możliwe jest wykonywanie pewnych manewrów.
Np.:
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:
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:
Dziękuję za uwagę!
Zapraszam do udziału w pokazie i zadawania pytań.