iCommand Prolog dla Win XP HowTo by Paweł Gutowski - <pawel.gutowski@gmail.com>
Co chcemy osiągnąć
Co nam jest potrzebne
Instalacja
Instalacja i testowanie SWI-Prologu + JPL'a.
Instalacja i testowanie iCommand
Uruchomienie iCommand z Prologu przy użyciu JPL'a
1. Co chcemy osiągnąć
Naszym celem jest skonfigurowanie środowiska deweloperskiego w Windows XP w taki sposób aby umożliwić sterowanie klockami LEGO z poziomu Prologu. Sterowanie będzie odbywało się poprzez Bluetooth, w czasie rzeczywistym. „Program” Prologu będzie wykonywany na maszynie PC, zaś odczyty z czujników oraz rozkazy dla silników będą wysyłane w czasie rzeczywistym via bluetooth.
Struktura warstw komunikacyjnych wygląda następująco:
Prolog | ← Wraz z zestawem napisanych przez nas predykatów |
JPL | |
iCommand | |
Sterowniki bluetooth | ← bluetooth stack + imprementacja dostarczona wraz z iCommand |
Klocki LEGO NXT | |
2. Co nam jest potrzebne
Klocki Lego NXT (używałem firmowego firmware'u LEGO)
Komputer PC + Blueatooth (używałem Toshiby A100-467 wraz ze zintegorwanym portem Blueatooth)
Sterowniki dla bluetootha (używałem Toshiba Bluetooth stack + rxtx dostarczony wraz z iCommand'em)
Java (używałem JDK 1.6.0)
Środowisko do pracy z Prologiem (używałem SWI-Prolog'u v.5.6.4.7)
Wtyczka JPL do Prologu (używałem wersji dostarczonej wraz z pakietem instalacyjnym SWI-Prologu)
iCommand (używałem v. 0.7)
Do testów podczas instalacji przydatny jest Eclipse
3.I. Instalacja i testowanie SWI-Prologu + JPL'a
W moim przypadku JPL był dostarczony wraz z pakietem instalacyjnym SWI-Prolog. Wystarczyło jedynie pobrać z internetu odpowiedni pakiet instalacyjny, uruchomić, a następnie postępować zgodnie ze wskazówkami instalatora.
Aby upewnić się, że JPL działa prawidłowo można skompilować i uruchomić następujący prosty predykat:
integer_to_float(A,B):-
jpl_new( 'java.lang.Integer', [A], H),
jpl_call( H, floatValue,[], B).
Po skompilowaniu i uruchomieniu, w konsoli SWI-Prologu powinniśmy ujrzeć mniej więcej coś takiego:
1 ?- integer_to_float(5,A).
% Added [C:\Program Files\Java\jdk1.6.0\jre\bin\client, C:\Program Files\Java\jdk1.6.0\jre\bin, C:\Program Files\Java\jdk1.6.0\bin] to %PATH%
A = 5.0
2 ?-
3.II. Instalacja i testowanie iCommand
Cały proces jest dokładnie opisany w pliku README.txt umieszczonym wewnątrz paczki z iCommand'em. Należy wykonać wszystkie czynności zgodnie z punktami: 2.1, 2.2, 2.3 pliku README.txt
Po ich prawidłowym wykonaniu powinniśmy być w stanie uruchamiać przykładowe klasy Javowe, sterujące robotem via iCommand.
Moje uwagi dot. instalacji:
1. Nie przejmować się tym, że punkt instalacji 2.3.1.6 nie działa! Po przyjrzeniu się kodom źródłowym iCommand widać, że wykonanie komendy:
java -jar icommand.jar
nie ma prawa działać.
2. Plik konfiguracyjny icommand.properties:
a) Skopiować go do katalogu użytkownika. W moim przypadku:
C:\Documents and Settings\gutek\icommand.properties
Okazuje się, że iCommand szukał pliku konfigracyjnego tylko w tym katalogu - wbrew dokumentacji,
wg której plik jest szukany również w kataogu roboczym (.)
b) W moim przypadku plik icommand.properties ostatecznie składał się z trzech linijek:
nxtcomm.type=rxtx
nxtcomm=COM40
rxtx.port=COM40
COM40 - na takim wirtualnym porcie Toshiba bluetooth stack ustanowił mi połączenie
3. Firma LEGO nie udostępniła informacji o tym, że klocki NXT będą działały z bluetoothem Toshiby. Co więcej - przegląd internetu wykazał, że klocki NXT mają problemy z komunikowaniem się via bluetooth z niektórymi laptopami Toshiby i Dell'a - faktycznie były z tym problemy, niemniej ostatecznie udało się wszystko uruchomić.
4. Łączenie iCommanda z klockami składa się z dwóch etapów: w pierwszym należy „sparować” dwa urządzenia (tak samo jak dla wszystkich urządzeń bluetooth - z podaniem PINu itd.).
Następnie Należy z klasy NXTCommand uruchomić metodę open() - po kilku sekundach na wyświetlaczu bricka powinna pojawić się następująca ikona: <> W moim przypadku te dwa etapy były najtrudniejsze - jako, że pojawiały się liczne problemy z Bluetoothem.
5. Przed przejściem do kolejnego kroku warto jest przetestować iCommanda z poziomu Eclipse'a - np uruchamiając przykładowe klasy.
3.III. Uruchomienie iCommand z Prologu przy użyciu JPL'a
Jeżeli poprawnie wykonaliśmy punkty 3.1 i 3.2 to z tym nie powinniśmy mieć problemów. Ważne jest, żeby ścieżki do wszystkich wspomnianych bibliotek *.jar znalazły się w zmiennej CLASSPATH
Można już pisać predykaty sterujące robotem, np. ustanowienie komunikacji i odczytanie wartości z ultradźwiękowego czujnika wyglądać będzie następująco:
nxt_iCmd_open:-
writeln('Opening connection...'),
jpl_call( 'icommand.nxt.comm.NXTCommand' , 'open', [], _),
writeln('Configuring connection...'),
jpl_call( 'icommand.nxt.comm.NXTCommand' , 'setVerify', [@(true)], _),
writeln('Connection established!').
nxt_iCmd_distance(PortName, Dist):-
writeln('Getting port handle...'),
jpl_get('icommand.nxt.SensorPort', PortName, PortHandle),
writeln('Creating ultrasonic sensor object...'),
jpl_new('icommand.nxt.UltrasonicSensor', [PortHandle], UltraSonic),
writeln('Reading distance from ultrasonic sensor...'),
jpl_call( UltraSonic, 'getDistance', [], Dist),
writeln('Reading finished.').
Zaś odpowiadające wywołanie w Prologu to:
nxt_iCmd_open.
nxt_iCmd_distance('S4', X).