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:
W skład zestawu wchodzą m.in.:
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.
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
Ś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',[],_).
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).
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).
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.:
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:
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ń.