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_mindstormscontrolc [2008/03/31 20:32]
miw
pl:miw:miw08_mindstormscontrolc [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 ====== Opis ====== ====== Opis ======
 +__**Projekt zakończony**__
 +
 Marcin Ziółkowski <​mziolkow@student.agh.edu.pl>​ Marcin Ziółkowski <​mziolkow@student.agh.edu.pl>​
  
Linia 31: Linia 33:
     * wariant mniej optymistyczny -> tylko jeżeli powyższe nie zadziała! to użycie bibliotek typu http://​apr.apache.org/​ http://​www.boost.org/​     * wariant mniej optymistyczny -> tylko jeżeli powyższe nie zadziała! to użycie bibliotek typu http://​apr.apache.org/​ http://​www.boost.org/​
   * http://​www.faqs.org/​rfcs/​   * http://​www.faqs.org/​rfcs/​
 +
  
  
Linia 39: Linia 42:
   * 100% funkcji?   * 100% funkcji?
   * sockety pod windows   * sockety pod windows
 +
 +
 +
 +===== 080408 =====
 +  * sockety pod boost
 +  * kompilacja cygwin nxt++ (GJN)
 +
 +===== 080409 =====
 +  * opis kompilacji i zależności
 +  * przykład użycia przez telnet
 +
 +
 +===== 080422 =====
 +  * implementacja w prologu najniższej warstwy
 +  * test komunikacji z prologu (open socket)
 +
 +
 +
 +===== 080520 =====
 +  * GJN -> api w cvs, -> PH/MZ
 +  * MZ -> integr -> PH
 +  * PH -> testy
 +  * GJN -> testy + kompilacja win/linux
 +  * BT pod win? ident robota + uwierz(pin?​)
 +
 +===== 080603 =====
 +  * testy, oceny
  
 ====== Projekt ====== ====== Projekt ======
Linia 56: Linia 86:
                V                V
              NXT              NXT
 +
  
  
Linia 69: Linia 100:
 Kod dziala w ten sposob, ze wystawia na socket (na wybranym porcie) polaczenie, ktore oczekuje na polaczenia od klientow. Po zainicjalizowaniu polaczenia, klient przesyla polecenia, ktore maja zostac wykonane przez robota. Na potrzeby komunikacji serwer <-> klient zostal stworzony i zaimplementowany stosowny protokol (ponizej jego opis) wedlug ktorego nastepuje komunikacja. Kod dziala w ten sposob, ze wystawia na socket (na wybranym porcie) polaczenie, ktore oczekuje na polaczenia od klientow. Po zainicjalizowaniu polaczenia, klient przesyla polecenia, ktore maja zostac wykonane przez robota. Na potrzeby komunikacji serwer <-> klient zostal stworzony i zaimplementowany stosowny protokol (ponizej jego opis) wedlug ktorego nastepuje komunikacja.
  
-[[pl:miw:miw08_mindstormscontrolc:​files|Źródła projektu]]+Zrodla projektu: {{:pl:miw:mindstorm_control_c.zip|mindstorm_control_c.zip}}
  
 ===== Opis protokolu ===== ===== Opis protokolu =====
 +
  
  
Linia 78: Linia 110:
 ^ command ​     ^ return ​      ^ description ​         ^ ^ command ​     ^ return ​      ^ description ​         ^
 | nxt; open    | ---     | Initiates the NXT connection ​       | | nxt; open    | ---     | Initiates the NXT connection ​       |
 +| nxt; openBT ​   | ---     | Initiates the NXT connection over BT      |
 +| nxt; pair; resourceName;​ passkey; pairedResourceName ​   | ---     | Pairs the specified NXT to this computer ​  |
 +| nxt; unpair; resourceName ​ | ---     | Destroys the Bluetooth pairing that was previously established between this computer and the specified NXT |
 | nxt; close    | --- | Closes the NXT connection| | nxt; close    | --- | Closes the NXT connection|
 | nxt; batteryLevel ​   | value     | Returns the current battery level        | | nxt; batteryLevel ​   | value     | Returns the current battery level        |
Linia 127: Linia 162:
   * err: unknown_command:​ [what]   * err: unknown_command:​ [what]
   * err: wrong_params:​ [what]   * err: wrong_params:​ [what]
 +
  
  
Linia 133: Linia 169:
 == Possible commands: == == Possible commands: ==
 ^ command ​     ^ return ​      ^ description ​         ^ ^ command ​     ^ return ​      ^ description ​         ^
-sonar; setTouch; portNr ​   | ---     | Sets a sensor in a specified port to a touch sensor ​    | +sensor; setTouch; portNr ​   | ---     | Sets a sensor in a specified port to a touch sensor ​    | 
-sonar; setSound; portNr ​  | --- | Sets a sensor in a specified port to a sound sensor ​ | +sensor; setSound; portNr ​  | --- | Sets a sensor in a specified port to a sound sensor ​ | 
-sonar; setLight; portNr, active ​  | --- |Sets a sensor in a specified port to a light sensor ​       | +sensor; setLight; portNr, active ​  | --- |Sets a sensor in a specified port to a light sensor ​       | 
-sonar; setSonar; portNr ​  | ---     | Sets a sensor in a specified port to a sonar sensor ​     | +sensor; setSonar; portNr ​  | ---     | Sets a sensor in a specified port to a sonar sensor ​     | 
-sonar; setRaw; portNr ​ | --- | Sets a sensor to return a raw value  | +sensor; setRaw; portNr ​ | --- | Sets a sensor to return a raw value  | 
-sonar; getValue; portNr ​  | value     | Retrieves the value of a sensor ​      | +sensor; getValue; portNr ​  | value     | Retrieves the value of a sensor ​      | 
-sonar; lsGetStatus;​ portNr ​   | value     | Gets the status of the lowspeed port      | +sensor; lsGetStatus;​ portNr ​   | value     | Gets the status of the lowspeed port      | 
-sonar; getSonarValue;​ portNr ​ | value | Retrieves the value for sonar sensors ​ | +sensor; getSonarValue;​ portNr ​ | value | Retrieves the value for sonar sensors ​ | 
-sonar; setSonarOff;​ portNr ​   | ---    | Tells the sonar sensor to stop sending pulses ​ | +sensor; setSonarOff;​ portNr ​   | ---    | Tells the sonar sensor to stop sending pulses ​ | 
-sonar; setSonarSingleShot;​ portNr ​   | ---    | Tells the sonar sensor to only send a pulse when you ask it what it's value is  | +sensor; setSonarSingleShot;​ portNr ​   | ---    | Tells the sonar sensor to only send a pulse when you ask it what it's value is  | 
-sonar; setSonarContinuous;​ portNr ​   | ---    | Tells the sonar sensor to continuously send pulses ​ | +sensor; setSonarContinuous;​ portNr ​   | ---    | Tells the sonar sensor to continuously send pulses ​ | 
-sonar; setSonarContinuousInterval;​ portNr, interval ​ | ---    | Sets the interval at which the sonar sensor sends a pulse  |+sensor; setSonarContinuousInterval;​ portNr, interval ​ | ---    | Sets the interval at which the sonar sensor sends a pulse  |
  
 **Description arguments:​** **Description arguments:​**
Linia 158: Linia 194:
   * err: unknown_command:​ [what]   * err: unknown_command:​ [what]
   * err: wrong_params:​ [what]   * err: wrong_params:​ [what]
 +
 +
  
  
Linia 166: Linia 204:
 Wstepne testy wykazaly poprawnosc dzialania kodu (przetestowane funkcje dzialaly zgodnie z zalozeniami i potrafily wykonywac rozne operacja z wykorzystaniem robota). Wstepne testy wykazaly poprawnosc dzialania kodu (przetestowane funkcje dzialaly zgodnie z zalozeniami i potrafily wykonywac rozne operacja z wykorzystaniem robota).
 Kod zostal napisany pod Linuxem z wykorzystaniem socketow dostarczanych przez ten wlasnie system. W zwiazku z koniecznoscia dzialania kodu takze na systemach rodziny windows dokonano prob uruchomienia napisanego kodu z wykorzystaniem srodowisk Cygwin i MinGW. W obu przypadkach proby zakonczyly sie niepowodzeniem. Nawet maksymalna ilosc dostepnych pakietow w srodowisku Cygwin nie pozwolila na uruchomienie kodu. Powodem byl problem z kompilacja bliblioteki nxtpp (bylo to niemozliwe zarowno za pomoca linkowania zbudowanych bibliotek *.lib dla windows jak i niepowodzeniem konczyla sie proba zbudowania samych pakietow nxtpp). Kod zostal napisany pod Linuxem z wykorzystaniem socketow dostarczanych przez ten wlasnie system. W zwiazku z koniecznoscia dzialania kodu takze na systemach rodziny windows dokonano prob uruchomienia napisanego kodu z wykorzystaniem srodowisk Cygwin i MinGW. W obu przypadkach proby zakonczyly sie niepowodzeniem. Nawet maksymalna ilosc dostepnych pakietow w srodowisku Cygwin nie pozwolila na uruchomienie kodu. Powodem byl problem z kompilacja bliblioteki nxtpp (bylo to niemozliwe zarowno za pomoca linkowania zbudowanych bibliotek *.lib dla windows jak i niepowodzeniem konczyla sie proba zbudowania samych pakietow nxtpp).
-W zwiazku z powyzszym, aby mozna bylo uruchamiac kod zarowno na systemach linux jaki i windows postanowiono przepisac czesc kodu odpawiadajaca komunikacji sieciowej, z wykorzystaniem najnowszej wersji biblioteki asio boost'​a ([[www.boost.org]]).+W zwiazku z powyzszym, aby mozna bylo uruchamiac kod zarowno na systemach linux jaki i windows postanowiono przepisac czesc kodu odpawiadajaca komunikacji sieciowej, z wykorzystaniem najnowszej wersji biblioteki asio boost'​a ([[www.boost.org]]) ​- w trakcie realizacji. 
 + 
 + 
 + 
 + 
 +===== ===== 
 +Dokonano modyfikacji czesci kodu odpowiadajaca za komunikacje sieciowa. Zgodnie z zalozeniami zostala wykorzysta biblioteka boost'​a ASIO. Dzieki temu kod jest w pelni przenosny. Na chwile obecna zostaly wykonane testy dla systemow Linux i windows, ktore potwierdzaja poprawnosc dzialania kodu. 
 + 
 + 
 + 
 + 
 + 
 +===== ===== 
 +Usunieto wszytkie znalezione bledy/​niedorobki,​ glownie zwiazane z obsluga samych bledow. Zostaly dodane tez funkcje escapujace znaki CR/LF (13/10) co umozliwia wykorzystanie jako klienta zwyklego telnetu. Na systemach z rodziny windows radzi sie wykorzystanie programu '​putty',​ gdzie rzecz jasna jako '​Connection type' wybieramy '​RAW'​ (socket). W systemach unixowych doskonale sprawuje sie zwykly telnet (przetestowano). 
 + 
 +Zrodla projektu (ver. 2) {{:​pl:​miw:​mindstorm_control_c_ver.2.zip|mindstorm_control_c_ver.2.zip}} 
 + 
 + 
 + 
 +===== ===== 
 +**OPIS KOMPILACJI** 
 + 
 +Przygotowanie srodowiska:​ 
 + 
 +Potrzebujemy dwoch bibliotek:​ 
 +NXT++ ktora mozemy sciagnac [[http://​sourceforge.net/​project/​showfiles.php?​group_id=193451|tutaj]].  
 +Pelny opis przygotowania srodowiska by moc uzywac tej biblioteki znajdziemy:  
 +  * [windows] [[http://​nxtpp.wetter61169.de/​mediawiki-1.6.9/​index.php/​Visual_Studio_Tutorials:​_Setting_up_Visual_Studio|tutaj]]. Opis dotyczy kompilatora VC++, gdyz tylko dla niego jest oficjalne wsparcie w systemach windows. 
 +  * [linux] [[http://​nxtpp.wetter61169.de/​mediawiki-1.6.9/​index.php/​Beginner_Tutorial_-_Part_0:​_Building_the_library|tutaj]] 
 +Druga biblioteka do komunikacji sieciowej to ASIO, ktora jest czescia boost'​a. 
 +Opis uzywania dla obu systemow znajduje sie [[http://​www.boost.org/​doc/​libs/​1_35_0/​doc/​html/​boost_asio.html|tutaj]] 
 +Z tej samej strony oczywiscie mozemy zassac zrodla. 
 + 
 +UWAGA! Po wykonaniu czynnosci opisanych na stronie [[http://​www.boost.org/​doc/​libs/​1_35_0/​doc/​html/​boost_asio.html|http://​www.boost.org/​doc/​libs/​1_35_0/​doc/​html/​boost_asio.html]] niekoniecznie wszystkie wymagane bibioteki trafia do katalogow przeznaczenia i bedziemy miec problemy podczas linkowania. W takiej sytuacji kopiujemy z utworznego przez boost'​a katalogu '​bin.v2'​ wszystkie wymagane biblioteki. 
 + 
 +Gdy powyzszy etap bedziemy mieli ze soba, mozemy juz uzywac stworzonego projektu, najlepiej wykorzystujac stworzone i zalaczone w zrodlach dla: 
 +  * [windows] projekt w VC++ 2005 
 +  * [linux] makefile (oczywiscie uprzednio go edytujac - nalezy podac informacje o polozeniu headerow dla nxt++ oraz (w zaleznosci od sposobu wykonania pierwszego etapu) ewuntualnie sciezki do ASIO boost'​a). 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +===== ===== 
 +**Binarki** 
 + 
 +  * [windows] {{:​pl:​miw:​nxt.zip|nxt.zip}} (zbudowano na Windows XP SP2) 
 +  * [linux] {{:​pl:​miw:​nxt.tar.gz|nxt.tar.gz}} (zbudowano na Debian 4.0 R3) Jesli nie instalowano uprzednio ASIO boosta z pewnoscia bedziemy musieli wykorzystac zalaczona biblioteke do uruchomienia binarki. Najlepiej ja przeniesc w stand. miejsce wszystkich bibliotek czyli pewnie do /​usr/​lib/​. 
 + 
 +**Binarki - wersja 3.** 
 +  * [windows] {{:​pl:​miw:​nxt2.zip|nxt2.zip}} 
 +  * [linux] {{:​pl:​miw:​nxt2.tar.gz|nxt2.tar.gz}} 
 + 
 +===== ===== 
 +**Przyklad uzycia** 
 + 
 +  * laczymy sie np. przez telnet na porcie 2056 (oczywiscie IP stosowny do sytuacji; na cele przykladu zaklada sie lokalne odpalenie serwera), czyli wpisujemy: '​**telnet localhost 2056**'​ 
 +  * na poczatku musimy sie polaczyc z robotem, wydajemy wiec polecenie: '​**nxt;​ open**'​ 
 +  * pozniej wszystkie inne polecenia, ktore zrobia z robotem wszystko czego zapragniemy ;) 
 +  * na samym koncu zeby sie rozlaczyc z robotem wydajemy polecenie '​**nxt;​ close**'​ 
 +  * i rozlaczanie z samym serwerem realizujemy za pomoca polecenia: '​**bye**'​ 
 + 
 + 
 + 
 + 
 + 
 +===== ===== 
 +**Kolejna, trzecia wersja** 
 + 
 +W nowej wersji dokonano niewielkich modyfikacji czesci kodu, na rzecz usuniecia znalezionych niedopatrzen. 
 +Wieksza czesc pracy nad ta wersja poswiecono na dodanie pewnej funkcjonalnosci na potrzeby integracji z Prologiem (klient napisany w Prologu). 
 +  * Zrodla (wersja 3): {{:​pl:​miw:​mindstorm_control_c_ver.3.zip|mindstorm_control_c_ver.3.zip}} 
 + 
 + 
 + 
 + 
 +===== ===== 
 +**Klient w prologu** 
 + 
 +Kolejnym etapem byla integracja napisanego uprzednio kodu, z klientem, ktory mialby sie laczyc z naszym serwerem i na rzecz ktorego serwer wykonywalby zadane operacje. API calosci napisal kolega, Piotr Hołownia, moim zadaniem bylo napisanie tresci (klienta) w Prologu. 
 +Dokonano wiec implementacji zadanych instrukcji, ktore komunikuja sie z poziomu Prologu za pomoca socketow z programem napisanym w C++. 
 +  * Zrodla: {{:​pl:​miw:​nxt_actions_dummy.pl|nxt_actions_dummy.pl}} 
 + 
 + 
 + 
 + 
 + 
 +===== ===== 
 +**BT pod win** 
 + 
 +Z wykorzystaniem NXT++ istnieje mozliwosc polaczenia z robotem nie tylko za pomoca USB, ale takze przez BT.  
 +W celu polaczenia przez BT (wczesniej juz zparowanego) wystarczy wywolac funckcje OpenBT(). W przypadku kiedy chcemy zdecydowac z poziomu kodu o parowaniu konkretnego robota musimy uzyc odpowiednich funkcji: 
 +  * **Parowanie:​** iNXT::​pairBluetooth( ViConstString resourceName,​ ViConstString passkey, ViChar pairedResourceName[],​ tStatus&​ status ); 
 + 
 +  * <​resourceName>​ The resource string that specifies the NXT with which to pair 
 +  * <​passkey>​ A string containing the passkey the computer should exchange with the device. The passkey cannot be longer than 15 characters and must be NULL-terminated 
 +  * <​pairedResourceName>​ A Bluetooth resource string representing the paired device. On Windows, the specified resourceName is suffixed with the COM port; On Mac OS X, the RFCOMM channel identifier. The resource string must have a capacity of 256 bytes 
 +  *<​status>​ Status chaining object. 
 +  * **Odparowywanie:​** iNXT::​unpairBluetooth( ViConstString resourceName,​ tStatus&​ status ); 
 +  * <​resourceName>​ The resource string that specifies the NXT with which to unpair 
 +  * <​status>​ Status chaining object 
 +  * **Sprawdzanie zparowania:​** iNXT::​isPaired( ViConstString resourceName,​ tStatus&​ status ); 
 +  * <​resourceName>​ A resource string that specifies the NXT for which to check its pairing status 
 +  * <​status>​ Status chaining object 
 +  * Return: VI_TRUE if the NXT is paired with this computer (or if it is connected via USB); VI_FALSE otherwise 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +===== ===== 
 +**BT pod win cd. - dodano kod do uzywania (parowania, odparowywania,​ otwierania) BT** 
 + 
 +Tak jak w temacie - dodano mozliwosc uzywania BT pod win, wlacznie z parowaniem/​odparowywaniem. Informacje jak tego uzywac znajdziemy powyzej, w zaktualizowanym opisie protokolu, ktorego uzywa serwer. 
 + 
 +  * Zrodla, ostatniej wersji: {{:​pl:​miw:​mindstorm_control_c_ver.4.zip|mindstorm_control_c_ver.4.zip}} 
 + 
 +P.S. Oczywiscie w celu wyszukiwania,​ parowania etc. (nad BT) mozemy wykorzystac pod win powszechnie uzywany program: [[http://​www.bluesoleil.com/​|BlueSoleil]] 
 + 
 + 
 +===== ===== 
 +**Poprawki w serwerze na rzecz wspolpracy z prologiem; Dodano duza czesc implementacji po stronie prologu, tak by byla max. zgodnosc z iCommand** 
 + 
 +  * Zrodla:​{{:​pl:​miw:​mindstorm_control_c_ver.6.zip|mindstorm_control_c_ver.6.zip}} 
  
 ====== Materiały ====== ====== Materiały ======
pl/miw/miw08_mindstormscontrolc.1206988346.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