Ü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
- java.lang.Object
- icommand.nxtcomm.AsciizCodec
- icommand.platform.nxt.Battery (implements icommand.nxtcomm.NXTProtocol)
- icommand.vision.ColorDetectionControl (implements java.awt.event.ActionListener, javax.swing.event.ChangeListener, javax.media.Control)
- icommand.robotics.CompassNavigator (implements icommand.robotics.Navigator)
- java.awt.Component (implements java.awt.image.ImageObserver, java.awt.MenuContainer, java.io.Serializable)
- java.awt.Container
- java.awt.Window (implements javax.accessibility.Accessible)
- java.awt.Frame (implements java.awt.MenuContainer)
- icommand.vision.Vision (implements javax.media.ControllerListener)
- icommand.nxtcomm.DeviceInfo
- icommand.nxtcomm.FileInfo
- icommand.platform.nxt.FileSystem
- icommand.nxtcomm.FirmwareInfo
- icommand.vision.FlipControl (implements java.awt.event.ActionListener, javax.media.Control)
- icommand.vision.Font
- icommand.platform.nxt.I2CSensor
- icommand.platform.nxt.Compass
- icommand.platform.nxt.Ultrasonic
- icommand.nxtcomm.InputValues
- icommand.platform.nxt.Light
- icommand.vision.MotionDetectionControl (implements java.awt.event.ActionListener, javax.swing.event.ChangeListener, javax.media.Control)
- icommand.platform.nxt.Motor (implements icommand.nxtcomm.NXTProtocol)
- icommand.platform.nxt.NXT
- icommand.nxtcomm.NXTComm
- icommand.nxtcomm.NXTCommand (implements icommand.nxtcomm.NXTProtocol)
- icommand.nxtcomm.OutputState
- icommand.vision.Region
- icommand.vision.RegionControl (implements java.awt.event.ActionListener, javax.media.Control)
- icommand.platform.nxt.Sensor (implements icommand.nxtcomm.NXTProtocol)
- icommand.robotics.ServoNavigator (implements icommand.robotics.Navigator)
- icommand.platform.nxt.Sound
- icommand.platform.nxt.Speaker
- icommand.platform.nxt.SyncMotors
- java.lang.Thread (implements java.lang.Runnable)
- icommand.vision.Recorder (implements javax.media.ControllerListener)
- icommand.platform.nxt.Touch
- icommand.vision.VisionEffect (implements javax.media.Effect)
- icommand.vision.ColorEffect
- icommand.vision.FlipEffect
- icommand.vision.MotionDetectionEffect
- icommand.vision.RegionEffect
Interface Hierarchy
- icommand.vision.ColorListener
- icommand.nxtcomm.ErrorMessages
- icommand.vision.LightListener
- icommand.vision.MotionListener
- icommand.robotics.Navigator
- icommand.nxtcomm.NXTProtocol
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 scanDies sollte eine Ausgabe ähnlich der folgenden zurückliefern:
Scanning ... 00:16:53:02:20:F9 NXTDie 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 registeredMittels
$ rfcomm listen /dev/rfcomm0 3warten 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:
-
Dynamische Variante
Zunächst muss, wie vorhin auch schon, das Serielle Profil aktiviert werden:$ sdptool add --channel=3 SP Serial Port service registered
Anschließend Device-File und NXT verknüpfen:# rfcomm bind /dev/rfcomm0 00:16:53:02:20:F9
Benötigt man das Binding nicht mehr, sollte es wieder freigegeben werden:# rfcomm release /dev/rfcomm0
- Statische Methode
Hier wird das Binding in einer Konfigurations-Datei eingestellt und somit bei jedem Start automatisch geladen. rfcomm wird normalerweise in /etc/bluetooth/rfcomm.conf konfiguriert. Ein Eintrag für den NXT könnte beispielsweise so aussehen:# # RFCOMM configuration file. # rfcomm0 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device 00:16:53:02:20:F9; # RFCOMM channel for the connection channel 3; # Description of the connection comment "Lego Mindstorm NXT"; }
Nun wird bei jedem Systemstart automatisch /dev/rfcomm0 erzeugt und ein Binding zum NXT erzeugt.
$ newgrp uucp
Download & Installation der iCommand Pakete
Um iCommand v0.5 einzurichten, benötigt man zunächst ein paar Pakete:
- iCommand [ Online ] [ Lokal (v0.5, modifiziert) ]
- RXTX Java Package [ Online ] [ Lokal (rxtx-2.1-7-bins-r2, OHNE Sun CommAPI) ]
- RXTX Libraries [ Online ] [ Lokal librxtxSerial.so i686, ia64 oder x86_64 ]
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.sound Ü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/rfcomm0Wird - 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.0, 11.5, 360.0, sm); sn.travel(20); NXTCommand.close(); } }Compilieren mit
$ javac ForwardTest.javaund starten das Programm mit
$ java -Dgnu.io.rxtx.SerialPorts=/dev/rfcomm0 ForwardTestDer 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>