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/06/12 01:34]
miw
pl:miw:miw08_mindstormsapi [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 +====== PlNXT ======
 +__**Projekt zakończony**__
 +
 +Piotr Hołownia, <​holownia@student.agh.edu.pl>​
 +
 +PlNXT to API w Prologu do obsługi [[http://​mindstorms.lego.com/​eng/​Overview/​default.aspx|LEGO Mindstorms NXT]]
 +
 +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).
 +
 +Udało się założone cele zrealizować w zadowalającym stopniu. Są rzeczy, które warto poprawić. Zachęcam do zapoznania się z opisem.
 +
 +Dokumentacja:​ {{:​pl:​miw:​miw08_mindstormsapi:​plnxtdocs.zip|plnxtdocs.zip}}
 +
 ====== Opis warstw ====== ====== Opis warstw ======
  
Linia 5: Linia 18:
   * średnia warstwa (nxt_sensomoto),​   * średnia warstwa (nxt_sensomoto),​
   * najwyższa warstwa (nxt_movement).   * najwyższa warstwa (nxt_movement).
 +
  
 ===== Warstwa nxt_actions ===== ===== 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: 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 iCommand, +  * {{:​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 Ziółkowskiego).+  * {{:​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]]).
  
-Dowolną inna implementację komunikacji można stworzyć bazując na pliku nxt_actions_dummy.pl. 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 projektu, ale wydzielona tylko, aby 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.+Dowolną inna implementację komunikacji można stworzyć bazując na pliku {{:​pl:​miw:​miw08_mindstormsapi:​080612:​nxt_actions_dummy.pl|nxt_actions_dummy.pl}}. 
 + 
 +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 projektu, ale wydzielona tylko, aby 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.**
  
 ===== Warstwa nxt_sensomoto ===== ===== 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. 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]] Dokumentacja:​ [[http://​student.agh.edu.pl/​~holownia/​plnxt/​nxt_sensomoto.html|nxt_sensomoto]]
  
Linia 22: Linia 39:
  
 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. 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]] Dokumentacja:​ [[http://​student.agh.edu.pl/​~holownia/​plnxt/​nxt_movement.html|nxt_movement]]
  
  
 ====== Dodatkowe komponenty ====== ====== Dodatkowe komponenty ======
 +
  
 ===== Threads ===== ===== 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. 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 threads.pl znajdują się predykaty umożliwiające tworzenie triggerów i timerów. Trigger uruchamia akcję pod warunkiem zajścia zdarzenia. Timer uruchamia ​akcja po wyznaczonym czasie.+ 
 +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]] Dokumentacja:​ [[http://​student.agh.edu.pl/​~holownia/​plnxt/​threads.html|threads]]
  
Linia 36: Linia 57:
 ====== Przygotowanie środowiska ====== ====== Przygotowanie środowiska ======
  
-Krótka instrukcja konfiguracji połączenia z użyciem iCommand dla użytkowników systemu Windows: 
  
-(niebawem będzie).+===== 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>​ 
 + 
 +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: Chcąc używać API, należy do katalogu projektu skopiować następujące pliki:
Linia 53: Linia 90:
 </​code>​ </​code>​
  
-Aby sprawdzić poprawność przygotowania środowiska,​ zachę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. ​Na [[http://​mindstorms.lego.com/​Overview/​MTR_Tribot.aspx|TriBot]] także ruch złożony (jazda do przodu, do tyłu, skręcanie, obracanie).+Aby sprawdzić poprawność przygotowania środowiska,​ zachę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 ====== ====== Laboratorium przygotowane w ramach projektu ======
  
-[[pl:​mindstorms:​lab:​lab5|Laboratorium]] składa się z obserwowania testowego programu oraz implementacji wybranego algorytmu.+[[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. 
-  * 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 być możliwość usuwania wcześniej utworzonych timerów i triggerów. 
  
  
-====== Historia prac nad projektem ====== 
  
-[[pl:​miw:​miw08_mindstormsapi:​historia|Historia]] - spotkania, kolejne wersje projektu, sprawozdania cząstkowe.+====== 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.
  
 +Stąd błędy w poruszaniu się robota przy użyciu tej metody. Np. predykat nxt_go(200,​1000) sprawia, że robot nieznacznie skręca przed wykonaniem ruchu prostoliniowego i na koniec także.
 +
 +Praca silników jest lekko przesunięta w czasie. Przy większych prędkościach obrotowych (np. 700 stopni na sekundę) ta różnica staje się niedopuszczalnie duża. Przy 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.
 +----
 +
 +====== Historia prac nad projektem ======
 +
 +[[pl:​miw:​miw08_mindstormsapi:​historia|Historia]] - spotkania, kolejne wersje projektu, sprawozdania cząstkowe.
pl/miw/miw08_mindstormsapi.1213227260.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