Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:miw:miw08_mindstormsapi [2008/03/11 15:12]
gjn
pl:miw:miw08_mindstormsapi [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
-====== ​Opis ======+====== ​PlNXT ====== 
 +__**Projekt zakończony**__ 
 Piotr Hołownia, <​holownia@student.agh.edu.pl>​ Piotr Hołownia, <​holownia@student.agh.edu.pl>​
  
-Build an API prototype in Prolog for NXT-based robots +PlNXT to API w Prologu do obsługi ​[[http://mindstorms.lego.com/eng/Overview/default.aspx|LEGO Mindstorms NXT]]
-  * low-level sensomotoric API, cover NXT funcs, provide control for motors, sensors, brick i/o +
-  * mid-level mimic LEGO env blocks?? does it make sens? +
-  * component-level:​ identify common robot parts that need control: wheel, sensor, arm, etc? +
-  * robot-level:​ identify robot classes: e.g. im/mobile, rolling vs. walking; provide means to describe common robot designs, like the four provided by LEGO +
-  * high-level provide services for different classes +
-Architecture:​ +
-  * MVC, the above is logical model +
-  * provide a V for every M component to support building of the interface +
-Issues: +
-  * communication +
-  * control +
-  * design +
-  * event handling, device polling +
-Ideas: +
-  * think how to build a Prolog ​API for NXT +
-  * investigate the [[http://lejos.sourceforge.net/|LeJOS]] [[http://lejos.sourceforge.net/​p_technologies/​nxt/​nxj/​api/​index.html|NXJ API]] to remain compatible +
-  * investigate communication layer: one can use native NXT protocol, iCommand stack, other? +
-  * middle layer for: integrating logic layer with communication layer+
  
-====== Spotkania ======+Celem projektu było zaimplementowanie funkcji niskiego poziomu (np. obracanie silnikiem, odczyt sensorów) oraz wyższego (np. jazda do przodu przez zadany czas, wykonanie skrętu w lewo o zadany kąt z zadanym promieniem).
  
-===== 08.03.04 =====+Udało się założone cele zrealizować w zadowalającym stopniuSą rzeczy, które warto poprawić. Zachęcam do zapoznania się z opisem.
  
-  * fenomenologicznie ​:) mamy klocki, jakby można zrobić API? +Dokumentacja{{:​pl:​miw:​miw08_mindstormsapi:​plnxtdocs.zip|plnxtdocs.zip}}
-  * inżyniersko,​ mamy klocki, BT, jak się dogadać z Prologiem+
  
-===== 08.03.11 ​===== +====== Opis warstw ======
-  * spec: czego chcemy od niższej warstwy, np.: synchr, etc. +
-  * próbujemy opisywać predyaktem w prologu moduły ze środ. lego+
  
 +Projekt jest podzielony na następujące wartswy:
 +  * najniższa warstwa (nxt_actions),​
 +  * średnia warstwa (nxt_sensomoto),​
 +  * najwyższa warstwa (nxt_movement).
  
-====== Projekt ====== 
  
 +===== Warstwa nxt_actions =====
  
-===== 08.03.04 ===== +Warstwa odpowiada za komunikację z NXTMamy do dyspozycji predykaty poruszające silnikami, odczytującymi dane z sensorów, itpW tej warstwie można zastosować różne systemy komunikacji. Do tej pory zaimplementowane zostały dwa: 
-{{:​pl:​miw:​miw08_mindstormsapi:​akcje.pl|:pl:​miw:​miw08_mindstormsapi:​akcje.pl}} +  ​* ​{{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_actions_icommand.pl|nxt_actions_icommand}} - komunikacja z użyciem [[http://lejos.sourceforge.net/​p_technologies/​nxt/​icommand/​icommand.php|iCommand]],​ 
-{{:​pl:​miw:​miw08_mindstormsapi:​ruch.pl|:pl:miw:miw08_mindstormsapi:​ruch.pl}}+  ​* ​{{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_actions_sockets.pl|nxt_actions_sockets}} - komunikacja z użyciem socketów (dziełko kolegi [[pl:miw:miw08_mindstormscontrolc|Ziółkowskiego]]).
  
-<code prolog>​ +Dowolną inna implementację komunikacji można stworzyć bazując na pliku {{:pl:miw:miw08_mindstormsapi:080612:nxt_actions_dummy.pl|nxt_actions_dummy.pl}}.
-nxt_motor(Motor,​Speed,​ Direction) ​:+
-  var(Speed), % odczyt pr +
-  get_speed(Speed) +
-nxt_motor(Motor,​Speed,​ Direction) ​:+
-  var(Dir), % odczyt dir +
-nxt_motor(Motor,​Speed,​ Direction) ​:+
-  nonvar(S),​ +
-  set_speed(S),​ +
-nxt_motor(Motor,​Speed,​ Direction) ​:+
-  Speed < 0, +
-nxt_motor(Motor,​reverse,​ Direction) ​:+
-  nxt_motor(Motor,​Speed,​ _), +
-  Speedn is - Speed, +
-  nxt_motor(Motor,​Speedn).+
  
-nxt_motor(Motor,SpeedTime) :- +Ograniczeniem jest toże nazwy predykatów eksportowanych muszą pozostać takie same. Nie ma także możliwości wprowadzenia niczego nowego bez uwzględnienia tego w warstwie wyższej. Dlaczego? Jest to jedna z warstw projektuale wydzielona tylkoaby umożliwić wstawienie w jej miejsce różnych alternatywnych wersji. **Warstwa nxt_actions nie stanowi części API. Nie powinna być używana w projektach bazujących na PlNXT. Nie ma takiej potrzeby.**
-  create_timer(T1)%potrzebuje miec timery +
-  set_speed(M,​S),​ +
-  wakeup(T1,​Time,​nxt_motor(,​0,​_)).+
  
 +===== Warstwa nxt_sensomoto =====
 +
 +Warstwa bazuje na nxt_actions. To, co zostało zaimplementowane w niższej warstwie, w tej jest obudowane w logikę. Zatem mamy tutaj: poruszanie silnikami, odczyt sensorów, odczyt napięcia baterii, odtworzenie pliku dźwiękowego zapisanego w pamięci NXT, odtworzenie dźwięku o podanej częstotliwości.
 +
 +Dokumentacja:​ [[http://​student.agh.edu.pl/​~holownia/​plnxt/​nxt_sensomoto.html|nxt_sensomoto]]
 +
 +===== Warstwa nxt_movement =====
 +
 +Warstwa dostarcza predykaty realizujące złożoną pracę silników: ruch pojazdu do przodu, do tyłu, skręcanie, obracanie, ruch do napotkania przeszkody.
 +
 +Dokumentacja:​ [[http://​student.agh.edu.pl/​~holownia/​plnxt/​nxt_movement.html|nxt_movement]]
 +
 +
 +====== Dodatkowe komponenty ======
 +
 +
 +===== Threads =====
 +
 +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ń. Np. chcemy, żeby po 10 sekundach od wciśnięcia sensora dotyku urządzenie odtworzyło plik dźwiękowy.
 +
 +W pliku {{:​pl:​miw:​miw08_mindstormsapi:​080612:​threads.pl|threads.pl}} znajdują się predykaty umożliwiające tworzenie triggerów i timerów z wykorzystaniem wątków w SWIProlog. Trigger uruchamia akcję pod warunkiem zajścia zdarzenia. Timer uruchamia akcję po wyznaczonym czasie.
 +
 +Dokumentacja:​ [[http://​student.agh.edu.pl/​~holownia/​plnxt/​threads.html|threads]]
 +
 +
 +====== Przygotowanie środowiska ======
 +
 +
 +===== Z użyciem iCommand =====
 +
 +Krótka instrukcja konfiguracji połączenia BT z wykorzystaniem iCommand dla użytkowników systemu Windows:
 +
 +  - Ściągnij i rozpakuj (np. do katalogu C:\nxt\) następujące pliki zip:
 +    * iCommand (http://​lejos.sourceforge.net/​p_technologies/​nxt/​icommand/​downloads.php),​
 +    * rxtx (http://​www.rxtx.org),​
 +    * bluesock (http://​bluesock.dev.java.net).
 +  - Dopisz do zmiennej środowiskowej Classpath ścieżki do następujących plików jar: icommand.jar,​ bluesock.jar,​ RXTXcomm.jar. Np.: <​code>​ C:​\nxt\icommand-0.7\dist\icommand.jar;​C:​\nxt\bluesockbeta1.0\bluesock.jar;​C:​\nxt\rxtx-2.1-7-bins-r2\RXTXcomm.jar </​code>​
 +  - Dopisz do zmiennej środowiskowej Path ścieżki do katalogów z bibliotekami dll pochodzącymi z RXTX i bluesock. Np.: <​code>​ C:​\nxt\rxtx-2.1-7-bins-r2\Windows\i368-mingw32\;​C:​\nxt\bluesockbeta1.0\ </​code>​
 +  - Sparuj komputer z NXT. Dla tego urządzenia musi być dostępna usługa portu szeregowego "Dev B". Sprawdź jaki port COM został przypisany do tej usługi dla NXT.
 +  - Umieść w katalogu domowym plik icommand.properities (przy próbie skorzystania z iCommand zostanie utworzony automatycznie). Edytuj go, wpisując dwie następujące linie:
 +<​code>​
 +nxtcomm=COM6
 +nxtcomm.type=bluesock ​
 </​code>​ </​code>​
  
-  nxt_motor(M,S,_),S \0.+Zamiast COM6 wpisz portktóry jest przypisany do Twojego NXT. 
 + 
 +Chcąc używać APInależy do katalogu projektu skopiować następujące pliki: 
 +  * {{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_actions_icommand.pl|nxt_actions_icommand.pl}},​ 
 +  * {{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_sensomoto.pl|nxt_sensomoto.pl}},​ 
 +  * {{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_movement.pl|nxt_movement.pl}},​ 
 +  * {{:​pl:​miw:​miw08_mindstormsapi:​080612:​threads.pl|threads.pl}}. 
 + 
 +W programie należy załadować moduły, których chcemy używać. Np. 
 +<code prolog>​ 
 +:- use_module(nxt_movement)
 +:- use_module(nxt_sensomoto). 
 +:- use_module(nxt_thread). 
 +</​code>​ 
 + 
 +Aby sprawdzić poprawność przygotowania środowiskazachęcam do uruchomienia pliku testowego {{:​pl:​miw:​miw08_mindstormsapi:​test.pl|test.pl}}. Jest on przygotowany dla robota [[http://​mindstorms.lego.com/​Overview/​MTR_Tribot.aspx|TriBot]]. Można dzięki niemu szybko sprawdzić poprawność odczytów czujników oraz działanie silnika. Dla [[http://​mindstorms.lego.com/​Overview/​MTR_Tribot.aspx|TriBot]] także ruch złożony (jazda do przodu, do tyłu, skręcanie, obracanie). 
 + 
 + 
 +====== Laboratorium przygotowane w ramach projektu ====== 
 + 
 +[[pl:​mindstorms:​lab:​lab5|Laboratorium]] przewidziane na 1,5 godziny składa się z obserwowania testowego programu oraz implementacji wybranego algorytmu. 
 + 
 + 
  
  
  
-===== 08.03.11 ​===== +====== Co należy poprawić? ======
-  * {{:​pl:​miw:​miw08_mindstormsapi:​ruch2.pl|ruch2.pl}} +
-  * {{:​pl:​miw:​miw08_mindstormsapi:​silnik.pl|silnik.pl}} +
-  * {{:​pl:​miw:​miw08_mindstormsapi:​akcje2.pl|akcje2.pl}}+
  
 +Moduł komunikacyjny nxt_actions_icommand nie daje możliwości odczytu kierunku obrotu silnika. Nie jest to zaimplementowane w samym iCommand.
 +----
 +Odczytu sensorów dokonuje się podając numer portu. Powinna być też możliwość łatwiejszego odczytu bez podawania portu. Port byłby wtedy pobierany z konfiguracji robota.
 +----
 +Musi istnieć możliwość usuwania wcześniej utworzonych timerów i triggerów.
 +----
 +W iCommand metoda Motor.A.rotate(long count,​boolean returnNow) obraca silnik o zadany kąt i zwraca sterowanie, jeśli returnNow==true. Nie zwraca go jednak wystarczająco szybko (wywoływana przez jpl), aby uruchomienie dwóch silników bezpośrednio po sobie odbyło się bez opóźnienia.
  
-====== Sprawozdanie ====== +Stąd błędy w poruszaniu się robota ​przy użyciu tej metody. Np. predykat nxt_go(200,1000sprawia, że robot nieznacznie skręca przed wykonaniem ruchu prostoliniowego i na koniec także.
-===== 08.03.04 ===== +
-Podejście inżynierskie zawiesiłem. Spróbowałem tworzyć API wyższego poziomu ​przy założeniu, że mam dostępne pewne predykaty API niższego poziomu ​(ustawianie prędkości obrotowej serwomechanizmuobracanie o zadany kąt). Jest to trudne do realizacji bez gotowych rozwiązań API niższego poziomu. Istotne jest, aby stworzyć mechanizmy działania, które w leJOS są dostępne w klasie Behavior i umożliwiają podejmowanie akcji po zajściu jakiegoś zdarzenia. Myślę, że należy skupić się na podejściu inżynierskim.+
  
-===== 08.03.11 ===== +Praca silników ​jest lekko przesunięta czasiePrzy większych ​prędkościach obrotowych (np700 stopni na sekundę) ta różnica staje się niedopuszczalnie dużaPrzy mniejszych (np150 stopni ​na sekundę) wydaje się nie przeszkadzać. Może dla wyeliminowania ​tego błędu należałoby zastosować wielowątkowość w Javie. 
-W pliku ruch2.pl zamieszczone są predykaty realizujące złożoną pracę ​silników: ruch pojazdu do przodu, do tyłu, skręcanie, obracanie. +----
-W pliku silnik.pl znajduje się predykat nxtMotor, pozwalający ​wybrany sposób poruszać silnikiem. +
-W pliku akcje2.pl są predykaty, które powinny obracać silnik z zadaną prędkością, o zadany kąt, odczytywać ​prędkość obrotową silnika, a także umożliwiać tworzenie timerów i triggerów. +
-Wprowadzenie triggerów pozwala dodać dla każdego z ruchów pojazdu warunek: "do napotkania przeszkody"​ i wiele innych możliwościNpjedź do napotkania przeszkody, skręcaj do napotkania przeszkody, rozpocznij jazdę ​na komendę dźwiękową. +
-W tym momencie predykaty z pliku akcja2.pl wypisują jedynie swój zamierzony cel, aby móc testować działanie. +
-** Wobec tego od realizujących warstwy niższe oczekuję wykonania w tym miejscu działających mechanizmów. Czyli:** +
-  * możliwość sterowania z Prologu ruchem silnika z zadana prędkością,​ zadanym kątem lub nieskończoność,​ +
-  * możliwość używania timerów i triggerów.+
  
-====== ​Materiały ​====== +====== ​Historia prac nad projektem ​======
-   * http://​mindstorms.lego.com/​Overview/​NXTreme.aspx +
-   * http://​mindstorms.lego.com/​eng/​community/​resources/​default.asp+
  
 +[[pl:​miw:​miw08_mindstormsapi:​historia|Historia]] - spotkania, kolejne wersje projektu, sprawozdania cząstkowe.
pl/miw/miw08_mindstormsapi.1205244727.txt.gz · ostatnio zmienione: 2019/06/27 15:58 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0