Spis treści

View page as slide show

Interfejs programistyczny PLNXT

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

Plan prezentacji

Cele prezentacji

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.

Platforma LEGO Mindstorms NXT

LEGO Mindstorms to zestaw edukacyjny umożliwiający:

Zestaw NXT

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

Brick

Jednostka centralna jest wyposażona w:

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:

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:

Środowisko deklaratywne:

Ś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

Architektura

Architektura PLNXT

Moduły komunikacyjne

Istniejące moduły warstwy komunikacyjnej:

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:

Praca ze studentami

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

Niektóre uwagi studentów zawarte w sprawozdaniach:

Efekt współpracy ze studentami

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

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/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

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:

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:

Platforma sprzętowa

Neo

Neo FreRunner

Platforma software'owa

Wnioski z wykonanych prac

Podsumowanie

Pokaz

Dziękuję za uwagę!

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