Różnice

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

Odnośnik do tego porównania

pl:miw:2009:nxt_api_demo [2009/08/04 18:21]
jsi08
pl:miw:2009:nxt_api_demo [2019/06/27 15:50]
Linia 1: Linia 1:
-====== Opis ====== 
-Take the PlNXT API. Build tutorial and demo cases. ​ 
  
-Łukasz Bandała - feanaro@student.agh.edu.pl 
- 
-====== Spotkania ====== 
-===== 20090XYZ ==== 
-====== Projekt ====== 
- 
-===== Założenia ===== 
- 
-Celem projektu było przygotowanie demonstracji zastosowania PlNXT API. Zastanawiając się nad licznymi możliwościami 
- ​prezentacji potencjału połączenia języka prolog oraz klocków NXT, ostatecznie zdecydowałem się na budowę i oprogramowanie ​ 
-robota umożliwiającego układanie kostki rubika. Język prolog doskonale nadaje się do rozwiązywania tego typu problemów. 
- 
- ​{{:​pl:​miw:​2009:​miw09_nxt_api_demo:​kostka.png?​100x100}} {{:​pl:​miw:​2009:​miw09_nxt_api_demo:​lego_nxt_logo.png?​250x50}} 
- 
-===== Konstrukcja ===== 
- 
-Podstawowym problemem była ograniczona ilość silników i elementów konstrukcyjnych. W pierwszej kolejności należało sprecyzować zadania robota: 
- 
-  - Zmiana orientacji kostki w przestrzenii 
-  - Ruch kostki 
-  - Badanie rozmieszczenia kolorów na kostce 
- 
-Posiadając tylko 3 silniki można się spodziewać sporych problemów z wykonaniem wszystkich tych czynności. Okazuje się jednak, że problemem tym zajął się ktoś już kiedyś. ​ 
- 
-Konstrukcja [[http://​www.tiltedtwister.com|Tilted Twister]] jest dokładnie tym czego poszukiwałem. Wykorzystująca wszelkie elementy w podstawowym zestawie NXT w sposób wysoce optymalny, umożliwia wykonywanie wszystkich wymienionych powyżej czynności. Można to zobaczyć [[http://​www.youtube.com/​watch?​v=5fAn5A0HbhU|tutaj]]. 
- 
-{{:​pl:​miw:​2009:​miw09_nxt_api_demo:​dsc00242.jpg|Zbudowany Titled Twister}} 
- 
-Kompletną instrukcję budowy można pobrać ze [[http://​www.tiltedtwister.com/​download.html|strony projektu]]. Ponadto znajdują się tam również kody źródłowe dla C++. 
- 
-===== Oprogramowanie ===== 
-==== Wstęp ==== 
-Posiadając już zbudowaną konkretną konstrukcję,​ nie pozostało mi nic innego jak przystąpić do próby napisania oprogramowania w języku Prolog z wykorzystaniem biblioteki [[pl:​plnxt:​start|PlNXT]]. ​ 
- 
-Biblioteka składa się z kilku modułów. Najbardziej zewnętrznymi (z punktu widzenia użytkownika) z nich są 3 następujące:​ nxt_movment,​ threads oraz nxt_sensomoto. Pierwszy jest skierowany do podstawowych robotów jeżdżących. Stąd jego mała przydatność w tym projekcie. Druga dotyczy wywoływaczy (triggers) oraz liczników. Jak okazało się podczas prac, również ten moduł jest mało użyteczny przy oprogramowywaniu twistera. Trzecia natomiast posiada podstawowe czynności związane z komponentami NXT, co okazało się zdecydowanie nabardziej przydatne. 
- 
-==== Ruchy i obroty ==== 
- 
-W celu ujednoznacznienia wykorzystywanych zwrotów, wprowadziłem drobny podział w nazewnictwie:​ 
-  * Kostka zbudowana jest z klocków ( 8 trójściennych,​ 6 jednościennych oraz 12 dwuściennych). To daje w sumie 54 kolorowe kwadraty na kostce. 
-  * **Ruchem** nazywać będę zmianę rozmieszczenia kolorowych kwadratów na kostce. Tym samym **ruch** zmienia rozmieszczenie klocków w kostce. Odpowiednia sekwencja **ruchów** powodować może rozwiązanie kostki. 
-  * **Obrotem** nazywać będę zmianę jedynie orientacji kostki w przestrzenii. Tym samym nie umożliwiają one rozwiązania kostki. 
- 
-**Uwaga!** 
-Początkowa próba wykorzystania wbudowanego w biblotece predykatu //​nxt_motor(Motor,​Speed,​angle(Angle))//​ nie przyniosła oczekiwanego rezultatu. Obroty silników o ustalony kąt były zdecydowanie nieprecyzyjne i pozostawiały bardzo dużo do życzenia jeżeli chodzi o jakikolwiek determinizm. Ratunkiem w ów sytuacji okazał się predykat nxt_motor_get_rotations(Motor,​Rot_count). ​ 
-Umożliwił on zaimplementowanie prostego regulatora P. Jak wiadomo, zdecydowanie najlepiej budować serwomechanizmy w oparciu o regulator typu PD. Jednakże w tej sytuacji lekko zmodyfikowane P okazało się wystarczające. Pobierając dane o pozycji silnika, wypracowywane jest odpowiednie sterowanie. 
- 
-Pojawił się niestety jeszcze jeden kłopot. Otóż ze względu na zbliżanie się silnika do zadanej wartości, stopniowo jest mu zadawana coraz mniejsza prędkość (w założeniu jest ona z przedziału 900 do 0). Niestety przy bardzo niskich wartościach i obciążeniu silnika, nie jest w stanie się on poruszyć. Konieczne zatem było dodanie pewnej tolerancji błędu wartości zadanej oraz przełączenie na regulację dwupołożeniową w bliskim otoczeniu wartości zadanej. Wprowadzenie tej tolerancji wymogło również stosowanie pomiaru pozycji absolutnej (od włączenia układu). Skomplikowało to zdecydowanie predykaty odpowiedzialne za wszelki ruch. 
- 
-=== Obrót względem osi pionowej - silnik A=== 
- 
-Jest to podstawowy obrót. Może odbywać się zgodnie z ruchem wskazówek zegara lub odwrotnie. Zakładając prawidłową pozycję obrotowej platformy, obrót ten odbywa się głównie o 90 stopni. Wyjątkiem jest sytuacja analizy rozmieszczenia kolorowych kwadratów na kostce. W tym przypadku wykorzystywany jest również obrót o 45 stopni. 
-<code prolog> 
-ruch_A_90(Z) :- 
-  nxt_motor_get_rotations('​A',​V1),​ % badanie polozenia w odniesienniu do absolutnej poczatkowej pozycji 
-  V2 is V1+315 ,V3 is V2-(V2 mod 315), 
-  repeat, 
-  nxt_motor_get_rotations('​A',​R0),​ R is R0+157, 
-  X is (R-V3), ​ 
-  P is (Z*315-X)*1.7,​ 
-  dwupolozeniowy(P,​P2,​25),​ % zmiana regulatora przy odpowiednim progu 
-  nxt_motor('​A',​P2),​ 
-  A is abs(X),​ % tolerancja roznicy polozenia 
-  A =< 316, 
-  A >= 314, 
-  nxt_motor('​A',​0). 
-</​code>​ 
- 
-=== Obrót względem osi poziomej === 
- 
-==== Czujniki ==== 
- 
-===== Algorytm ===== 
-===== Realizacja ===== 
-====== Sprawozdanie ====== 
-====== Prezentacja ====== 
-====== Materiały ====== 
pl/miw/2009/nxt_api_demo.txt · ostatnio zmienione: 2019/06/27 15:50 (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