Inhalt | 1. Aufbau & Systemvoraussetzungen | 3. Steuerung der Motoren

Mindstorms-Software zur Fernsteuerung über Bluetooth

  1. Übersicht
  2. iCommand
  3. Einrichten von iCommand unter Linux

Übersicht

Obwohl der Lego Mindstorm NXT erst seit August 2006 auf dem Markt ist, gibt es bereits einige Projekte, die Alternativen zur mitgelieferten Entwicklungsumgebung anbieten. Jedoch merkt man einigen dieser Projekte ihr junges Alter noch stark an. Gleiches gilt für diverse Remote-Umgebungen, die es ermöglichen Programme für den PC zu erstellen, mit denen man den NXT über Bluetooth fernsteuern kann. Eine Liste mit vielen dieser Projekte inklusive Verweise auf deren Homepages findet sich hier[1]:

Software Sprache Art der Steuerung NXT benötigte Firmware Art der Verbindung Steuerung über Windows Mac OSX Linux Sensoren auslesen Webseiten
LEGO NXT Mobile Application Simple RC Remote Control Standard Bluetooth Phone or PDA - - - No LEGO
BT RC NXT-G NXT to NXT Remote Program running on NXT Bluetooth Another NXT - - - User Programmable BTRC
Simple BT Remote Simple RC Remote Control Standard Bluetooth Desktop Yes No No Yes Simple Windows RC
RobotC Simple RC Remote Control Standard USB/BT Desktop Yes Not Yet No Yes CMU Web Site
BricxCC Simple RC Remote Control Standard USB/BT Desktop Yes No Yes BricxCC Web Site
OnBrick PDA Graphic Programmable RC Standard Bluetooth PDA - - - Yes OnBrick
OnBrick PC Graphic Programmable RC Standard Bluetooth Desktop Yes No No Yes OnBrick
NXT Director Simple RC Customizable Remote Control Standard Bluetooth Palm PDA - - - No? Director
RoboDNA Simple RC Remote Control Standard Bluetooth Desktop Yes Yes RoboDNA
MS Robotics Studio .NET User Program running on PC Standard Bluetooth Desktop Yes Yes (non-commercial version is free) Download site or Microsoft Site
NI LabVIEW Toolkit Graphic (LabVIEW G) User Program running on PC Standard USB/BT Desktop Yes Yes Yes LabVIEW toolkit Site
RoboLab Graphic User Program running on PC Standard USB Desktop Yes Yes Yes Robolab 
iCommand Java User Program running on PC Standard Bluetooth Desktop or PDA Yes Yes Yes iCommand
LEGO::NXT Perl User Program running on PC Standard USB/BT Desktop Yes Yes Yes Yes Perl
nxt-Ruby Ruby User Program running on PC Standard Bluetooth Desktop Yes Yes Yes Yes Ruby
NXT# C# User Program running on PC Standard Bluetooth Desktop Yes Yes? NXT#
Mindsqualls C# User Program running on PC Standard Bluetooth Desktop Yes Yes Mindsqualls
NXT Python Python User Program running on PC Standard USB/BT Desktop Yes Yes? Python
My Robot Me Graphic? User Program running on PC Standard USB/BT Desktop Yes No No Yes Robot Me

Die unterstützten Programmiersprachen sind vielfältig, u.a. sind dabei Ruby, Perl, Python, C# und Java. Letzteres ist Grundlage von iCommand, einem Subprojekt von leJOS. leJOS ist ein Projekt, das schon beim Vorgängermodell, dem RCX 1.0, sehr beliebt war. Es ist eines der wenigen Projekte, die sowohl unter Windows, Linux und MacOS X laufen. Die beiden anderen momentan aktiven Projekte sind LEGO::NXT, eine in Perl geschriebene API, sowie nxt-Ruby, welches - wie der Name schon sagt - in Ruby geschrieben ist. Da Java aus numerischer Sicht sicherlich Ruby und Perl vorzuziehen ist, fiel meine Wahl auf iCommand, auch wenn dieses Projekt noch mit einigen grundlegenden Problemen zu kämpfen hat.

Alternativ gäbe es noch die Möglichkeit, selbst ein Interface in einer beliebigen Sprache zu schreiben. Dies ist hauptsächlich deshalb möglich, weil Lego das Kommunikationsprotokoll "Direct Command API" veröffentlicht hat.[2] Einzige Bedingung: Es muss eine Möglichkeit geben, auf eine serielle Schnittstelle zuzugreifen, da die Fernsteuerung über das Serielle Profil (SPP) in Bluetooth abgewickelt wird.


1: http://www.teamhassenplug.org/NXT/NXTSoftware.html <Lokale Kopie>
2: Lego Bluetooth Developer Kit (BDK)

iCommand



Bei der in diesem Dokument beschriebenen Version von iCommand handelt es sich um Version 0.5. Während der Erstellung dieser Seiten wird bereits an Version 0.6 gearbeitet, welche einige Änderungen mit sich bringen wird. Man sollte also unbedingt auch die iCommand beiliegende Dokumentation beachten.

iCommand ist eine in Java implementierte API, die es ermöglicht einen Mindstorm NXT über Bluetooth fernzusteuern. Die API selbst greift hierbei auf eine Java-Bibliothek namens RXTX [1] zurück, die einen plattformübergreifenden Zugriff auf eine serielle Schnittstelle aus Java heraus ermöglicht.

Über RXTX greift iCommand also auf den NXT zu, wobei die Funktionen zur direkten Kommunikation in die beiden Klassen NXTComm und NXTCommand sowie das Interface NXTProtocol gekapselt sind. Darauf aufgebaut werden einige rudimentäre Klassen, welche recht systemnahes Ansteuern der Motoren und Abfragen der Sensoren ermöglichen. Z.B. werden bei den Klassen Motor und SyncMotors Entfernungen nicht in Metern oder Inches angegeben, sondern in "Counts", wobei ein Count in etwa ein Grunformatiertad Motorumdrehung ist. Die Daten der Sensoren werden auch unbearbeitet weitergegeben, wie sie von den Sensoren selbst auch kommen.

Auf die rudimentären Klassen zur Bewegung des Mindstorms aufgesetzt wurden Klassen wie ServoNavigator, die mittels an sie übergebenen diversen physikalischen Eigenschaften der Lego-Konstruktion mehr Komfort aufweist, als beispielsweise SyncMotors. So ist es mit ServoNavigator möglich, vorgegebene Streckenlängen zu fahren oder den Mindstorm eine gewisse Gradzahl rotieren zu lassen.

Zur Übersicht: Klassenhierarchie von iCommand[2]

Package Hierarchies:
icommand.nxtcomm, icommand.platform.nxt, icommand.robotics, icommand.vision

Class Hierarchy

Interface Hierarchy


1: http://rxtx.org/
2: http://lejos.sourceforge.net/p_technologies/nxt/icommand/api/index.html <Lokale Kopie>

Einrichten von iCommand unter Linux

Einrichtung der Bluetooth-Umgebung

Zunächst muss man BlueZ installieren. Wie dies geht, entnimmt man am besten der Dokumentation der jeweiligen Distribution. Für Ubuntu Linux gibt es hier eine sehr gute Anleitung. Um einen Lego Mindstorm anzusteuern, sollten die Dienste hcid, sdpd und rfcomm genügen.

Für einen ersten Test Bluetooth am NXT und dem PC aktivieren und als User in der Kommandozeile nach dem NXT suchen:

$ hcitool scan
Dies sollte eine Ausgabe ähnlich der folgenden zurückliefern:
Scanning ...
        00:16:53:02:20:F9       NXT
Die 6 durch Doppelpunkte getrennten Bytewerte sind quasi die Seriennummer des Bluetooth-Adapters, ähnlich einer MAC-Adresse bei Netzwerk-Interfaces. Der NXT wird also vom PC gefunden, jetzt versuchen wir eine erste Verbindung herzustellen. Dazu aktivieren wir zunächst das Serielle Profil auf Kanal 3:
$ sdptool add --channel=3 SP
Serial Port service registered
Mittels
$ rfcomm listen /dev/rfcomm0 3
warten wir auf Kanal 3 auf eine Verbindung, deren Kommunikation über das Device-File /dev/rfcomm0 abgewickelt wird. Jetzt schalten wir den NXT ein, gehen in das Bluetooth-Menü. Mittels der "Search"-Funktion suchen wir nach dem PC. Meist ist dessen Bluetooth-Name identisch seinem Netzwerknamen + Fortlaufende Nummer bzw. es steht ein "bluez-" vorneweg. Nach erfolgreicher Suche wählen wir den PC an und verbinden uns über Kanal 3 mit ihm, indem wir auf dem NXT die 3 mit dem gestrichelten Rahmen auswählen. Geht alles gut, meldet sich der PC mit
Connection from 00:16:53:02:20:F9 to /dev/rfcomm0
Press CTRL-C for hangup

Es kann sein, dass man beim Verbinden sowohl auf dem PC als auch auf dem NXT nach einer sog. PIN gefragt wird. Hier ist es egal, was man eingibt, vorausgesetzt, es ist sowohl auf dem PC als auch im NXT die gleiche Zeichenkette als PIN hinterlegt. Am einfachsten ist es man nimmt 1234 als PIN.

Jetzt gibt es zum einen die Möglichkeit, die Verbindung statisch zu konfigurieren oder sie jedesmal bei Bedarf neu zu erzeugen:

Bei beiden Varianten ist wichtig, dass der User, mit dessen Berechtigung später die Programme ausgeführt werden sollen, eine Lese- und Schreibberechtigung auf die Datei /dev/rfcomm0 besitzt. Um bei den Rechnern im WAP-Pool Lese- und Schreibrechte auf das Device-File /dev/rfcomm0 zu erhalten, muss man in die Benutzergruppe uucp wechseln:
$ newgrp uucp

Download & Installation der iCommand Pakete

Um iCommand v0.5 einzurichten, benötigt man zunächst ein paar Pakete:

Auch hier haben wir wieder zwei Möglichkeiten: Die Dateien in Systmverzeichnisse kopieren oder Java mitteilen, wo es die Dateien findet. Nachteil bei letzterer Methode: Man muss es immer wieder mitteilen. Bei der ersten Variante müssen lediglich die beiden .jar-Dateien in beispielsweise /usr/lib/jvm/java-1.5.0-sun/jre/lib/ext. Dieser Pfad kann natürlich von Java-Version zu Version variieren, genauso ist er nicht in jeder Linux-Distribution gleich. Gleiches gilt für den Bibliothekspfad, in den die beiden .so Shared Libraries kopiert werden müssen: /usr/lib/jvm/java-1.5.0-sun/jre/lib/i386, der sogar noch von der Prozessorarchitektur abhängt.

Auf den ersten Blick einfacher ist ein Setzen der Umgebungsvariablen LD_LIBRARY_PATH

$ export LD_LIBRARY_PATH=/pfad/zur/librxtxSerial.so
und Übergabe der Orte der .jar-Packages per Parameter
$ javac -classpath /pfad/zur/icommand.jar:/pfad/zur/RXTXcomm.jar:. <JavaFile>
zum compilieren und
$ java -classpath /pfad/zur/icommand.jar:/pfad/zur/RXTXcomm.jar:. -Dgnu.io.rxtx.SerialPorts=/dev/rfcomm0 <ClassFile>
zum Starten der Java-Programme.

Um die Dokumentation nicht mit überflüssigem Ballast zu füllen lasse ich die Parameter bei Beispielaufrufen weg. Im WAP-Pool sind die Parameter stets mit zu übergeben.

Damit iCommand weiß, welchen seriellen Port es verwenden soll, muss eine icommand.properties entweder im Arbeitsverzeichnis oder im Homeverzeichnis angelegt werden. Diese Datei sollte unter Linux in etwa so aussehen:

# Set the value of the nxtcomm property to the value of ->your<- serial port,
# e.g. COM4 (on Windows), dev/tty.NXT_1 (on Mac OSX), /dev/rfcomm0 (on Linux)
nxtcomm=/dev/rfcomm0
Wird - aus welchen Gründen auch immer - ein anderes Device-File als /dev/rfcomm0 benutzt, muss diese Datei natürlich angepasst werden.

Testen der iCommand Installation

Zum Testen der Bluetooth und iCommand Installation erstellen wir ein Java-Sourcefile namens ForwardTest.java mit folgendem Inhalt:

import icommand.platform.nxt.*;
import icommand.nxtcomm.*;
import icommand.robotics.*;

public class ForwardTest {

        public static void main(String[] args) {
                SyncMotors sm = new SyncMotors(Motor.C, Motor.B);
                sm.setSpeed(24);
                ServoNavigator sn = new ServoNavigator(56.011.5360.0, sm);
                sn.travel(20);

                NXTCommand.close();
        }
}
Compilieren mit
$ javac ForwardTest.java
und starten das Programm mit
$ java -Dgnu.io.rxtx.SerialPorts=/dev/rfcomm0 ForwardTest
Der Test war erfolgreich, wenn sich der Mindstorm mit langsamer Geschwindigkeit ca. 20cm vorwärts bewegt.


1: http://lejos.sf.net/
2: http://www.jstuber.net/lego/nxt-programming/bluetooth-linux.html
3: http://nxt.ivorycity.com/index.php?/archives/3-How-to-get-started-with-Linux-Bluetooth-and-the-NXT.html
4: Installationsanleitung von iCommand v0.5 für SuSE Linux <Lokale Kopie>

Nach oben | Inhalt | 1. Aufbau & Systemvoraussetzungen | 3. Steuerung der Motoren