Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:miw08_mindstormscontrolc [2008/04/06 22:39] miw |
pl:miw:miw08_mindstormscontrolc [2019/06/27 15:50] (aktualna) |
====== Opis ====== | ====== Opis ====== |
| __**Projekt zakończony**__ |
| |
Marcin Ziółkowski <mziolkow@student.agh.edu.pl> | Marcin Ziółkowski <mziolkow@student.agh.edu.pl> |
| |
* 100% funkcji? | * 100% funkcji? |
* sockety pod windows | * sockety pod windows |
| |
| |
| |
* sockety pod boost | * sockety pod boost |
* kompilacja cygwin nxt++ (GJN) | * 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 ====== |
| |
===== Opis protokolu ===== | ===== Opis protokolu ===== |
| |
| |
| |
^ 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 | |
* err: unknown_command: [what] | * err: unknown_command: [what] |
* err: wrong_params: [what] | * err: wrong_params: [what] |
| |
| |
| |
== 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:** |
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 trakcie realizacji. | 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. | 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 ====== |