====== Opis ====== __**Projekt zakończony**__ Paweł Gutowski Communication stack: * Prolog -- control logic in [[http://www.swi-prolog.org|Prolog]] program * Prolog <-> Java -- interface, use JPL and/or Logtalk * [[http://lejos.sourceforge.net/|LeJOS]] [[http://lejos.sourceforge.net/p_technologies/nxt/icommand/icommand.php|iCommand]] -- communication w/ NXT in Java * Bluetooth -- controlled from iCommand * Mindstorms NXT. Idea: * wrap the [[http://lejos.sourceforge.net/p_technologies/nxt/icommand/api/index.html|iCommand API]] with Prolog predicates. * investigate event-related issues * build some simple control logic in Prolog ====== Sprawozdanie ====== ===== Co chcemy osiągnąć? ===== * Chcemy skonfigurować środowisko deweloperskiego w Windows XP w taki sposób aby umożliwić sterowanie klockami LEGO z poziomu Prologu. Sterowanie w założeniu ma odbywać 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. * Chcemy napisać zestaw predykatów realizujących funkcjonalność podstawowych elementów robotów (rozkazy dla silnika, odczyt z każdego z czujników itp.) * Chcemy uzgodnić interfejs (sposób wywołań predykatów) z kolegą pracującym nad [[miw08_mindstormsapi|projektem mindstormsapi]], którego zakres obejmuje prace nad wyższymi warstwami komunikacji. ===== Jak chcemy to osiągnąć? ===== * Do komunikacji PC <-> klocki LEGO poprzez bluetooth użyjemy biblioteki **iCommand** - jest to biblioteka napisana w Javie, umożliwiająca sterowanie klockami w czasie rzeczywistym, poprzez bluetooth. * iCommand'a będziemy wywoływać z Prologu poprzez **JPL** jako, że umożliwia komunikację pomiędzy prologiem a kodem w Javie. Ostatecznie utworzone przez nas warstwy komunikacji przyjmą następującą postać: ^ Prolog | <- Wraz z zestawem napisanych przez nas predykatów | ^ JPL | | ^ iCommand | | ^ Sterowniki bluetooth | <- bluetooth stack + imprementacja dostarczona wraz z iCommand | ^ Klocki LEGO NXT | | ===== Co udało się zrobić? ===== * Przede wszystkim udało się, zgodnie z założeniami, zestawić i uruchomić wszystkie warstwy komunikacji: Prolog -> JPL -> iCommand -> LEGO * Napisano zestaw predykatów służących do sterowania robotem: [[:pl:miw:miw08_mindstormscontrolj:nxt_iCommand.pl|nxt_iCommand.pl]]. Predykaty wywołują poprzez JPL metody z klas iCommand'a. Zestaw ww. predykatów, po kosmetycznych poprawkach został użyty w [[miw08_mindstormsapi|projekcie mindstormsapi]]. Zestaw utworzonych predykatów wraz z krótkim opisem: :- module(nxt_iCmd,[ nxt_iCmd_open/0, % Rozpoczęcie komunikacji/pracy z klockami nxt_iCmd_close/0, % Zakończenie komunikacji/pracy z klockami nxt_iCmd_distance/2, % Odczytanie odległości z ultradźwiękowego czujnika dystansu nxt_iCmd_pressed/2, % Sprawdzenie czy czujnik dotyku jest wciśnięty czy nie nxt_iCmd_lightPercentage/2, % Odczytanie wartości natężenia światła z czujnika nat. światła nxt_iCmd_LED/2, % Ustawienie (włączenie lub wyłączenie) diody LED w czujniku natężenia światła nxt_iCmd_loudness/2, % Odczytanie natężenia dźwięku z czujnika głośności nxt_iCmd_batteryMilliVolt/1, % Odczytanie stanu baterii (napięcie) nxt_iCmd_playSoundFile/2, % Odegranie pliku dźwiękowego zapisanego wewnątrz klocków nxt_iCmd_stopPlayingSound/0, % Zatrzymanie odgrywania wszystkich dźwięków nxt_iCmd_playTone/2, % Zagranie dźwięku o określonej częstotliwości i długości trwania % motors nxt_iCmd_stopMotor/1, % Zatrzymanie wybranego silnika (z użyciem hamulca) nxt_iCmd_setMotorSpeed/2, % Ustawienie prędkości wybranego silnika nxt_iCmd_getMotorSpeed/2, % Odczyt prędkości wybranego silnika nxt_iCmd_rotateMotorToAngle/3, % Nakazanie wybranemu silnikowi ustawienie się w zadanej pozycji (dążenie z zadaną prędkością) nxt_iCmd_getMotorAngle/2, % Odczyt aktualnego położenia wybranego silnika nxt_iCmd_resetMotorAngle/1 % Kalibracja położenia silnika - resetowanie. ]). * Napisano [[pl:miw:miw08_mindstormscontrolj:developertutorial|tutorial instalacji i konfiguracji]] środowiska deweloperskiego, ułatwiający powtórzenie wyników prac udokumentowanych w niniejszym sprawozdaniu * Wykonano przegląd bibliotek iCommand oraz LeJOS w poszukiwaniu funkcjonalności mogących przydać się w dalszych pracach. Ciekawsze klasy/metody wraz z opisem zaprezentowano w [[pl:miw:miw08_mindstormscontrolj:apibrief|wyciągu z API iCommand oraz leJOS]]. ===== Jakie napotkano przeszkody? ===== * Problemy przy instalacji iCommand. Problemy wynikały z drobnych (aczkolwiek dotkliwych) błędów w dokumentacji. Szerszy opis, oraz sposoby ominięcia można znaleźć w [[pl:miw:miw08_mindstormscontrolj:developertutorial|tutorialu]]. * Problemy z bluetoothem. Niestety firma LEGO nie zapewnia kompatybilności ze wszystkimi dostawcami sprzętu i oprogramowania dla bluetooth. Niektóre laptopy Toshiba oraz Dell mogą mieć problemy - więcej w [[pl:miw:miw08_mindstormscontrolj:developertutorial|tutorialu]]. * Napotkano problem przy odczycie kierunku obrotu silniczka. Nie ma problemu z odczytem prędkości z jaką w danej chwili obraca się silnik, jednak nie udało się odczytać jego kierunku. ===== Materiały utworzone w trakcie prac nad projektem ===== * {{:pl:miw:miw08_mindstormscontrolj:nxt_iCommand.pl|nxt_iCommand.pl}} - Ostateczna wersja predykatów służących do sterowania robotem. * [[pl:miw:miw08_mindstormscontrolj:developertutorial|Tutorial instalacji i konfiguracji]] - How to - instalacja i konfiguracja środowiska deweloperskiego - opis ułatwiający powtórzenie wyników prac opisanych w niniejszym sprawozdaniu. * [[pl:miw:miw08_mindstormscontrolj:apibrief|Wyciąg z API iCommand oraz leJOS]] - Interesujące funkcjonalności iCommand oraz LeJOS, które mogą zostać w przyszłości wykorzystane podczas rozwijania niniejszego projektu. * [[pl:miw:miw08_mindstormscontrolj:history|Historia]] - Zapis historii prac nad niniejszym projektem.