Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:miw08_mindstormscontrolj [2008/05/20 03:23] miw |
pl:miw:miw08_mindstormscontrolj [2019/06/27 15:50] (aktualna) |
====== Opis ====== | ====== Opis ====== |
| |
| __**Projekt zakończony**__ |
| |
Paweł Gutowski | Paweł Gutowski |
<pawel.gutowski@gmail.com> | <pawel.gutowski@gmail.com> |
| |
====== Sprawozdanie ====== | ====== 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. |
| |
===== 08.02.26 ===== | ===== Jak chcemy to osiągnąć? ===== |
* testowanie komunikacji iCommand | * 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 | | |
| |
===== 080311 ===== | ===== Co udało się zrobić? ===== |
* próba spięcia Prologu z Javą, [[http://www.swi-prolog.org/packages/jpl/|JPL]] | * Przede wszystkim udało się, zgodnie z założeniami, zestawić i uruchomić wszystkie warstwy komunikacji: |
* przegląd działania/sensowności klas icommand | |
* nieob | |
| |
| |
===== 080318 ===== | |
* j.w. | |
| |
| |
| |
===== 080401 ===== | |
* ciała predykatów z JPL | |
| |
| |
===== 080415 ===== | |
* impl. brakujących? dodatkowych funkcji silnika | |
* specyfikacji funkcji kontroli brick: sound, display, filesystem | |
* przemyslenie integracji [[miw08_mindstormsapi]] | |
| |
| |
| |
===== 080429 ===== | |
* tutorial instalacji | |
* przeglad funkcj lejos/icommand -> z moglibysmy dodać w warstei movement/behavioral (subsumption) | |
| |
===== 080520 ===== | |
* beta sprawozd? | |
| |
====== Projekt ====== | |
| |
| |
| |
| |
===== 080318 ===== | |
| |
* Udało się przekopać, połączyć i odpalić naraz wszystkie warstwy: | |
Prolog -> JPL -> iCommand -> LEGO | 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]]. |
* Niestety wciąż występują dziwne problemy - testowe programy lubią się wieszać w dziwnych okolicznościach (ten sam kod raz działa raz nie). | Zestaw utworzonych predykatów wraz z krótkim opisem: |
Podejrzana komunikacja bluetooth - wciąż powtarzają się problemy z nawiązaniem komunikacji | |
| |
* Zakres prac: | |
Owinięcie funkcjonalności potrzebnej do obsługi 4 podstawowych czujników + 3 silników? Niby iCommand dostarcza możliwość kontrolowania innych czujników, ale brak możliwości przetestowania (brak innych czujników - np czujnik koloru). | |
| |
* Sugeruję założyć, że silniki i czujniki są zawsze podpięte do tych samych - standardowych portów ustalonych przez LEGO - brak dodatkowych i zupełnie niepotrzebnych nakładów na konfigurację. | |
| |
* Z jaką dokładnością owijamy iCommand? 1:1 czy trochę mądrzej? | |
Sugerują tę drugą opcję - żeby zachować 'filozofię' prologu, a nie bawić się w gettery/settery i przechowywanie kilkunastu obiektów. | |
<code prolog> | <code prolog> |
% | :- module(nxt_iCmd,[ |
% Proponowany zestaw predykatów: | 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 |
%Konfiguracja: | nxt_iCmd_pressed/2, % Sprawdzenie czy czujnik dotyku jest wciśnięty czy nie |
open(H) | nxt_iCmd_lightPercentage/2, % Odczytanie wartości natężenia światła z czujnika nat. światła |
close(H) | 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 |
%Czujnik dotyku: | nxt_iCmd_batteryMilliVolt/1, % Odczytanie stanu baterii (napięcie) |
touchPressed(H,Pressed) | 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 |
%Czujnik głośności: | nxt_iCmd_playTone/2, % Zagranie dźwięku o określonej częstotliwości i długości trwania |
loudness(H,Loudness) | % motors |
| nxt_iCmd_stopMotor/1, % Zatrzymanie wybranego silnika (z użyciem hamulca) |
%Ultradźwiękowy czujnik odległości: | nxt_iCmd_setMotorSpeed/2, % Ustawienie prędkości wybranego silnika |
distance(H,Distance) | 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ą) |
%Czujnik światła: | nxt_iCmd_getMotorAngle/2, % Odczyt aktualnego położenia wybranego silnika |
lightPercentage(H,Light) | nxt_iCmd_resetMotorAngle/1 % Kalibracja położenia silnika - resetowanie. |
led(H, ON) | ]). |
| |
%Silniki: | |
motorSpeed(Port, H, Motor, Speed) | |
motorPos(Port, H, Motor, Pos, ReturnAfter) | |
</code> | </code> |
| * 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]]. |
| |
Obsługa czujników może okazać się niepraktyczna (brak callbacków). | ===== Jakie napotkano przeszkody? ===== |
Wyjdzie w praktyce... | * 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]]. |
FIXME | * 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. |
* prefix namespace icmdMotorSpeed, icmdTouch | |
* rozpisanie predykatów... | |
* połącznie JPL j.w. | |
| |
| |
| |
| |
===== 080401 ===== | |
Zaimplementowano i przetestowano predykaty realizujące następujące funkcje: | |
* Odczyt czujnika nacisku | |
* Odczyt czujnika siły dźwięku | |
* Odczyt czujnika odległości | |
* Odczyt czujnika natężenia światła | |
* Ustawianie ON/OFF diody LED w czujniku światła | |
* Ustawianie prędkości silników dla pracy w nieskończoność (w obydwu kierunkach) | |
* Odczyt prędkości silników (tylko prędkości, __nie kierunku__) - najprawdopodobniej istnieje możliwość odczytania również kierunku. Wymaga to zagłębienia się w klasy iCommand realizujące niższą warstwę komunikacji. | |
| |
Istnieje możliwość zaimplementowania pracy silników tak aby wykonywały zadaną ilość obrotów lub obrót do zadanej pozycji. | |
Implementacja jest możliwa zarówno z uwolnieniem sterowania w chiwli wywołania funkcji, jak i ze zwolnieniem w chwili dotarcia do zadanej pozycji. | |
__Wg dokumentacji iCommand, taki tryb pracy może nie działać prawidłowo z firmware'm firmy LEGO.__ | |
| |
Predykaty wraz zaimplementowanymi ciałami: | |
{{:pl:miw:miw08_mindstormscontrolj:iCmd.pl|iCmd.pl}} | |
| |
| |
| |
| |
| |
| |
| |
===== 080415 ===== | |
Kolejna wersja zestawu predykatów, uwzględniająca niektóre uwagi: | |
{{:pl:miw:miw08_mindstormscontrolj:nxt_iCommand.pl|nxt_iCommand.pl}} | |
| |
Dodatkowe funkcjonalności iCommand: | |
* pobranie informacji o stanie baterii. Jest zaimplementowane. Owinąłem JPL'em i przetestowałem - Działa. | |
* keepAlive - powstrzymanie robota od wyłączenia się w przypadku dłuższego nieużywania. Opatrzone komentarzem "UNTESTED" - odrzuciłem. | |
* playSoundFile, playTone, stopPlaying - odgrywanie melodyjki z pliku zapisanego w bricku, lub tonu o zadanej częstotliwości i czasie trwania. Jest zaimplementowane. Owinąłem JPL'em i przetestowałem - Działa. | |
* operacje na plikach wewnątrz NXT, transfer itp. - jest dostępnych kilka funkcji w iCommand. Większość opatrzona komentarzem: UNFINISHED lub UNTESTED. Komentarze w kodzie źródłowym również nie są zbyt obiecujące: "// !! * Could crash due to receiving..." - odrzuciłem. | |
| |
Połączenie z projektem mindstormscontrolapi (min. różnice): | |
* Problem wspomniany w projekcie mindstormscontrolapi - pobieranie prędkości zerowej "0" - rozwiązałem już w poprzedniej wersji iCmd.pl | |
* Dla silnika, zamiast dwóch różnych predykatów uruchamiania silnika z zadaną prędkością (forward, backward) proponuję zrobić jeden (z prędkością podawaną ze ze znakiem "-") - wydaje się być bardziej intuicyjne. | |
* Zaproponowałem swoje nazewnictwo z dwóch powodów: Krótsze nazwy to lepsze nazwy, poza tym wersja nazw w nxt_iCmd wydaje mi się być bardziej intuicyjna (kwestia gustu - można zmienić). | |
* Dodałem kilka nowych funkcjonalności (pobieranie kąta położenia silnika, obsługa dźwięków itp.) | |
* Zasadniczo reszta cech jest kompatybilna z projektem mindstormsapi | |
| |
====== Sprawozdanie ====== | |
| |
===== 080226 - 080318 ===== | |
Problemy z komunikacją BT pod Windows. | |
W ogóle nie udało się dogadać przez BT z poziomu firmowej aplikacji LEGO [sic!] | |
Zanim udało się porozmawiać przez iCommand należało: | |
- zrobić upgrade sterowników BT | |
- zrobić upgrade stack'a BT | |
- skopiować plik konfiguracyjny do katalogu użytkownika. W moim przypadku: C:\Documents and Settings\gutek\icommand.properties **(Okazuje się, że wbrew dokumentacji, iCommand szuka pliku konfigracyjnego __tylko__ w tym katalogu)** | |
- nie przejmować się tym, że komenda sprawdzająca poprawność instalacji nie działa. Nie ma prawa działać: | |
<code java> | |
java -jar icommand.jar | |
</code> | |
| |
Wciąż występują problemy z komunikacją BT: | |
* czasami problem z nawiązaniem komunikacji (jak już raz zaskoczy to później idzie) | |
* czasami wieszanie się programów (zarówno z prologu jak i bezpośrednio z Eclipsa) (być może nie jest to wina BT?) | |
| |
Okazuje się, że LEGO nie lubią się dogadywać z BT w niektórych laptopach Toshiby i Della (używam Toshiby). | |
Używam BT Toshiba Stack (lego nie gwarantuje kompatybilności Toshiba stack'a z klockami) - być może trzeba będzie się przerzucić na coś innego. | |
| |
| |
| |
===== 080429 ===== | |
Wyciąg z API iCommand oraz leJOS - Funkcjonalność, której użycie może okazać się przydatne w przyszłości: | |
| |
{{:pl:miw:miw08_mindstormscontrolj:funkcjonalnosc_icommand_oraz_lejos.txt|Wyciąg z API}} | |
| |
Tutorial instalacji: Prologa->JPL->iCommand->LEGO: | |
| |
{{:pl:miw:miw08_mindstormscontrolj:instalacja_tutorial_win.txt|Tutorial}} | |
| |
| |
====== Materiały ====== | |
| |
| ===== 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. |