Zdalne sterowanie robotem NXT

Transkrypt

Zdalne sterowanie robotem NXT
Zdalne sterowanie robotem NXT
Komunikacja z robotem, lista obsługiwanych poleceo, przykłady nawiązywania połączenia
1. Wstęp:
Robot LEGO NXT komunikuje się z komputerem wykorzystując technologię Bluetooth. Do
poprawnego działania połączenia niezbędne są sterowniki Fantom Driver do pobrania z
http://mindstorms.lego.com/en-us/support/files/default.aspx#Driver.
Dodatkowo, ponieważ projekt wykonywany jest przy użyciu firmware’u LeJOS, przy kompilacji
programów niezbędne będą również biblioteki Javy NXJ do komunikacji z robotem, do pobrania z :
http://lejos.sourceforge.net/nxj-downloads.php.
2. Instrukcje sterowania robotem
Wszystkie instrukcje sterowania robotem są obecnie kodowane w postaci pojedynczej, 32-bitowej
liczby całkowitej. Ideowo podobne są one do instrukcji procesora gdzie bity na odpowiedniej pozycji
kodują różne polecenia wraz ze swoimi prefiksami i sufiksami. W odróżnieniu od instrukcji procesora
polecenia sterujące są kodowane dziesiątkowo (cyfra na odpowiedniej pozycji odpowiada danemu
poleceniu) co ułatwia debugging. Docelowo komendy będą kodowane binarnie przy użyciu
minimalnej długości instrukcji, jeżeli okaże się że przepustowośd łącza Bluetooth wymaga
optymalizacji ilości przesyłanych informacji (mało prawdopodobne).
Obecnie wszystkie instrukcje są 5-cyfrowymi liczbami całkowitymi. Pozycją pierwszą nazywad
będziemy najbardziej znaczącą cyfrę. W każdej instrukcji odpowiednie pozycje odpowiadają za:
1 pozycja: kategoria polecenia
2 pozycja: podkategoria polecenia
pozycje 3-5: dana liczbowa
np. instrukcja 31025 jest rozumiana jako:
3 – polecenie kategorii 3 (jazda na wprost na zadaną odległośd)
1 - podkategoria 1 (jazda do tyłu
025 – wartośd liczbowa 25, (odległośd 25 cm)
Po otrzymaniu takiej instrukcji robot powinien przemieścid się w linii prostej do tyłu o 25 cm.
3. Kompletna lista obecnie obsługiwanych poleceń:
 1xxxx – Kategoria poleceo ogólnych
 10xxx - podkategoria poleceo systemowych
 10000 – Przerwij wszystkie działania. Zatrzymaj się używając
hamulców
 10999 – Rozłącz, czekaj na kolejne połączenie
 2xxxx – Kategoria poleceo jazdy w zadanym kierunku. Ruch będzie utrzymywany aż
do odebrania kolejnego polecenia.
 20xxx – domyślna podkategoria
 20000 – zatrzymaj się używając hamulców
 20001 – jedź do przodu, prosto
 20002 – jedź po łuku do przodu w prawo
 20003 – obrót w miejscu w prawo
 20004 – jedź po łuku do tyłu w prawo
 20005 – jedź do tyłu, prosto
 20006 – jedź po łuku do tyłu w lewo
 20007 – obrót w miejscu w lewo
 20008 – jedź po łuku do przodu w lewo
 20009 – zatrzymaj się bez używania hamulców
 3xxxx – kategoria poleceo jazdy na wprost na zadaną odległośd (w cm)
 30xxx – jazda do przodu
 30001 : 30999 – jazda na wprost na odległośd 1-999 cm
 31xxx – jazda do tyłu
 31001 : 31999 – jazda do tyłu na odległośd 1-999 cm
 4xxxx – kategoria poleceo obrotu o zadany kąt skierowany
 40xxx – obrót o dodatni kąt skierowany (obrót przeciwnie do ruchu
wskazówek zegara)
 40001 : 40999 – obrót o kąt 1-999 stopni
 41xxx – obrót o ujemny kąt skierowany (obrót zgodnie z ruchem wskazówek
zegara)
 41001: 41999 – obrót o kąt ujemny 1-999 stopni
 5xxxx - kategoria bezpośrednich poleceo uniesienia / opuszczenia kamery
 50xxx-domyślna podkategoria
 50000 – zatrzymaj ruch, utrzymuj położenie kamery aktywnie
 50001 – pochyl kamerę w dół
 50002 – pochyl kamerę w górę
 50004 – zatrzymaj ruch, utrzymuj kamerę pasywnie
 50005 – zatrzymaj ruch poprzez odcięcie zasilania do silnika, brak
utrzymywania położenia kamery
 6xxxx – kategoria pochylenia kamery o kąt (w przypadku podania kąta większego niż
ograniczenia robot automatycznie ustawia się w największym dozwolonym
położeniu)
 60xxx – pochylenie kamery w dół




 60001:60999 – pochylenie o zadany kąt (w praktyce maks ok. 75)
 61xxx – pochylenie kamery w górę
 61001:61999 – pochylenie o zadany kąt (w praktyce maks ok. 75)
7xxxx – kategorie ustawienia kamery na zadany kąt pochylenia (dozwolony zakres
kątów pochylenia kamery to [-25,55], po przekroczeniu, robot automatycznie
ustawia się na odpowiedni koniec przedziału)
 70xxx – kąt dodatni (pochylenie w dół)
 70000 – wypoziomowanie (mniejwięcej) kamery
 70001:70999 ustawienie kamery na zadany kąt (w praktyce maks 25)
 71xxx – kąt ujemy (pochylenie w górę)
 71001:71999 ustawienie kamery na zadany kąt (w praktyce maks 55)
8xxxx – kategoria poleceo-zapytao odnośnie odczytów z czujników robota. Wymaga
odebrania informacji zwrotnej w postaci pojedynczej wartości całkowitej po każdym
wysłanym poleceniu.
 80000 – zapytanie o stan baterii, odczyt z czujnika odległości oraz kąt
pochylenia kamery. Zwraca pojedynczą liczbę int. Dane zapisane w sposób:
100000*Kąt pochylenia+1000*odległośd+napięcie/10 (3 pierwsze liczby kąt
pochylenia, jeżeli kąt ujemny cała liczba będzie ujemna, 3 kolejne liczby to
odległośd, 3 ostatnie to napięcie/10 w miliwoltach) Obecnie odpytywanie
częściej niż co 500 milisekund jest bezcelowe, gdyż dane z czujników
odświeżane są 2 razy na sekundę. Możliwośd zwiększenia jeżeli wartośd ta
okaże się niewystarczająca
9xxxx – kategoria poleceo sterowania mocą (prędkością) silników
 90xxx – ustawienie prędkości silników na portach A i B (silniki napędowe)
 90001 : 90100 – ustawienie prędkości obrotowej silników w zakresie
(1 – 100) *9 *deg/s+ (teoretycznie, zależy od poziomu baterii i
obciążenia silników. W uproszczeniu w zakresie 1 – 100%)
 91xxx – ustawienie prędkości silników na porcie C (silnik pochylania)
Zalecane prędkości w zakresie( 0-30)
 91001 : 91100 – ustawienie prędkości obrotowej silnika w zakresie
(1 – 100) *9 *deg/s+ (teoretycznie, zależy od poziomu baterii i
obciążenia silników. W uproszczeniu w zakresie 1 – 100%)
Dowolna liczba ujemna – powoduje zatrzymanie, zamknięcie połączenia i wyłączenie
robota.
4. Przykładowy program umożliwiający połączenie z NXT
/* prosty program do komunikacji dwukierunkowej z NXT. Program łączy się
* z pierwszym znalezionym NXT i wysyła liczby całkowite podane w terminalu.
* Zakładamy że NXT odbiera liczbe, mnoży ją prze -1 i odsyła z powrotem.
* Program odbiera przesłane liczby i wyświetla je w terminalu.
*
* @author Mayday
* na podstawie jednego z przykladów ze strony http://lejos.sourceforge.net/
*/
import lejos.pc.comm.*; //biblioteka LeJOS dla komputerów do komunikacji z NXT
import java.io.*; // biblioteka we-wy javy
import java.util.Scanner; // skaner potrzebny do wprowadzania wartości z lini komend
public class BTSend {
public static void main(String[] args) {
// utworzenie obiektu klasy connector identyfikującej połaczeni z NXT
NXTConnector conn = new NXTConnector();
// łączenie z dowolnym NXT
boolean connected = conn.connectTo("btspp://");
if (!connected) {
//reakcja na błąd połączenia z NXT
System.err.println("Błąd połączenia z NXT!");
System.exit(1);
}
//utworzenie obiektów strumieni wejścia i wyjścia
DataOutputStream dos = conn.getDataOut();
DataInputStream dis = conn.getDataIn();
int i=1;
// obiekt skaner pozwalający na wprowadzanie liczb z konsoli
Scanner sc = new Scanner(System.in);
//wysyłaj i odbieraj dopóki nie podane 0
while(i!=0) {
//odczytanie kolejnego inta z konsoli
i = sc.nextInt();
// struktura try - catch nizbęda do obsługi wyjątków
try {
System.out.println("Wysylam " + i);
//wpisanie inta do strumienia wyjscia
dos.writeInt(i);
//"spłukanie" strumienia (wysłanie wartosci)
dos.flush();
//obsługa wyjątka we-wy
} catch (IOException ioe) {
System.out.println("Wyjatek IO podczas wysylania:");
System.out.println(ioe.getMessage());
break;
}
try {
//odczytanie inta ze struminia wejscia i wypisanie na ekran
System.out.println("Odebrano: " + dis.readInt());
} catch (IOException ioe) {
System.out.println("Wyjatek IO podczas odczytu:");
System.out.println(ioe.getMessage());
break;
}
}
try {
dis.close();//zamknięcie strumienia we
dos.close();//zamknięcie strumiania wy
conn.close(); //zamknięcie połączenia z NXT
} catch (IOException ioe) {
System.out.println("Wyjątek IO podczas zamykania polaczenia:");
System.out.println(ioe.getMessage());
}
}
}