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/04 15:16]
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 ​======+Projekt ​jest podzielony na następujące wartswy: 
 +  * najniższa warstwa (nxt_actions),​ 
 +  * średnia warstwa (nxt_sensomoto),​ 
 +  * najwyższa warstwa (nxt_movement).
  
  
 +===== Warstwa nxt_actions =====
  
 +Warstwa odpowiada za komunikację z NXT. Mamy do dyspozycji predykaty poruszające silnikami, odczytującymi dane z sensorów, itp. W tej warstwie można zastosować różne systemy komunikacji. Do tej pory zaimplementowane zostały dwa:
 +  * {{:​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:​080612:​nxt_actions_sockets.pl|nxt_actions_sockets}} - komunikacja z użyciem socketów (dziełko kolegi [[pl:​miw:​miw08_mindstormscontrolc|Ziółkowskiego]]).
  
-===== 08.03.04 ===== +Dowolną inna implementację komunikacji można stworzyć bazując na pliku {{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_actions_dummy.pl|nxt_actions_dummy.pl}}.
-{{:​pl:​miw:​miw08_mindstormsapi:​akcje.pl|:​pl:​miw:​miw08_mindstormsapi:​akcje.pl}} +
-{{:​pl:​miw:​miw08_mindstormsapi:​ruch.pl|:​pl:​miw:​miw08_mindstormsapi:​ruch.pl}}+
  
-<code prolog>​ +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.**
-nxt_motor(Motor,SpeedDirection) :- +
-  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,​Speed,​ Time) :- +===== Warstwa nxt_sensomoto =====
-  create_timer(T1),​ %potrzebuje miec timery +
-  set_speed(M,​S),​ +
-  wakeup(T1,​Time,​nxt_motor(,​0,​_)).+
  
 +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 port, który jest przypisany do Twojego NXT. 
 + 
 +Chcąc używać API, należ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 przodudo 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. 
 + 
 + 
 + 
 + 
 + 
 + 
 +====== Co należy poprawić? ====== 
 + 
 +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 metodyNp. predykat nxt_go(200,​1000) sprawia, że robot nieznacznie skręca przed wykonaniem ruchu prostoliniowego i na koniec także.
-===== 08.03.04 =====+
  
-Podejście inżynierskie zawiesiłemSpró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 serwomechanizmu,​ obracanie 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ś zdarzeniaMyślęże należy skupić się na podejściu inżynierskim.+Praca silników jest lekko przesunięta w czasiePrzy większych ​prędkościach obrotowych (np700 stopni na sekundę) ta różnica staje się niedopuszczalnie dużaPrzy mniejszych (np. 150 stopni na sekundę) wydaje się nie przeszkadzać. Może dla wyeliminowania tego błędu ​należałoby zastosować wielowątkowość w Javie. 
 +----
  
-====== ​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.1204640167.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