RobotC, eine Einführung in die Programmierung der Lego-Roboter in C
Einführung in die Programmierung von Lego Mindstorms NXT Robotern mit C
Der Lego Mindstorms NXT Roboter ist eine erschwingliche programmierbare Roboterplattform, die einen optimalen Einstieg in die Robotik bietet und auch interessante Kreationen auf dem Gebiet der mobilen und programmierbaren Robotik ermöglicht. Der Lego Mindstorms NXT Roboter wird in vielen Schulen und Universitäten auf der ganzen Welt eingesetzt.
Für die NXT-Serie sind besonders viele Sensoren und Zubehörteile erhältlich (auf der Website von Génération Robots werden so gut wie alle dieser Robotersensoren angeboten). Darüber hinaus stehen für die Programmierung dieses Roboters mehrere Programmiersprachen zur Auswahl.
- NXT-G ist die mit dem NXT Roboter mitgelieferte grafische Entwicklungsumgebung, basierend auf der Labview-Software von National Instruments
- Labview von National Instruments
- Lejos ist eine Java-Bibliothek zur Programmierung von NXT
- NXC ist eine C-Bibliothek
- Matlab
Und schließlich werden wir mit der Einführung in der Robotik weitergehen und werden ein paar Einzelheiten über die hier vorgestellte Programmiersprache RobotC geben.
Einführung in RobotC, die Programmierumgebung für Lego NXT-Roboter
Die Roboter-Programmiersoftware RobotC wurde von der amerikanischen Eliteuniversität Carnegie Mellon entwickelt. Sie ist all jenen, die sich für Robotik interessieren, als Referenz in Sachen Robotik in den USA ein Begriff.
Mit der Programmierumgebung RobotC können Lego Mindstorms NXT Roboter in C programmiert werden. Es gibt auch eine RobotC-Version für Roboter von Vex Robotics.
RobotC ist eine komplette IDE-Festplattenschnittstelle mit einem sehr praktischen und leistungsstarken interaktiven Echtzeit-Debugger. Mit RobotC ist Multitasking möglich: Bis zu 10 Aufgaben können gleichzeitig vom Roboter ausgeführt werden. Andererseits installiert RobotC, wie in der Folge beschrieben, eine eigene Firmware auf dem Roboter, die leistungsfähiger als die Standard-Firmware ist. Im Vergleich zu anderen Programmiersoftware-Programmen sind RobotC-Programme wesentlich schneller.
RobotC unterstützt standardmäßig alle gängigen Sensoren von Lego. Eine Treiberbibliothek ist als Open-Source-Software verfügbar, die alle im Handel erhältlichen Sensoren und Zubehörteile umfasst. Somit kann der NXT-Roboter mit RobotC ohne Einschränkungen programmiert werden.
Derzeit arbeitet die Carnegie Mellon University an einem 3D-Simulationstool, das mit RobotC kompatibel ist.
Darstellung der Schnittstelle von RobotC
Die folgende Abbildung zeigt die RobotC-Programmierumgebung:
Abbildung 1: Programmierschnittstelle von RobotC
Für alle, die mit Programmierumgebungen vertraut sind, stellt sich die Schnittstelle von RobotC als klassisch dar. In der Spalte links sind die Strukturen der Standardcodes zu finden, und im Fehlerbereich unten stehen die Compiler-Ausgänge.
Für mehr Effizienz und Produktivität läuft während dem Programmieren mit RobotC IntelliSense, das die beim Programmieren eingegebenen Ausdrücke ergänzt.
Über das Help-Menü ist eine ziemlich vollständige Online-Hilfe verfügbar; außerdem werden zahlreiche Programmbeispiele geliefert.
Vor dem Einsatz von RobotC
Nach dieser Einführung in der Robotik gehen wir nun mehr ins Detail. Wie bereits erwähnt, muss anstelle der Standard-Firmware (sozusagen das Betriebssystem des Roboters) die RobotC-Firmware installiert werden, damit die mit RobotC durchgeführten Programme auf dem Roboter laufen. Das ist sehr einfach und muss nur ein einziges Mal durchgeführt werden.
Hierfür genügt es, im Menü „Robot“ auf „Download Firmware“ zu klicken. Dadurch öffnet sich folgendes Fenster:
Abbildung 2: Schnittstelle für das Firmware-Update
Die Nachricht ist eindeutig: Es wurde kein NXT-Stein (Gehirn des Roboters) gefunden. Der NXT-Roboter muss also mithilfe des mitgelieferten USB-Kabels an den PC angeschlossen und eingeschaltet werden. Sobald Sie anschließend auf die „Refresh Lists“-Schaltfläche klicken, erkennt RobotC den Roboter.
Für das Update der Firmware muss nun nur noch auf die Schaltfläche „F/W Download“ geklickt und in dem sich öffnenden Fenster die gewünschte Firmware gewählt werden. Daraufhin ist ein leises Geräusch zu hören: Der Intelligent Brick arbeitet und startet schließlich neu. Das war’s!
Im Fenster wird nun „Firmware download completed“ angezeigt.
Abbildung 3: Firmware auf NXT heruntergeladen
Wenn Sie nach RobotC wieder mit dem im Lego-Set enthaltenen Grafikprogramm NXT-G arbeiten möchten, muss derselbe Vorgang in der NXT-G-Schnittstelle wiederholt werden, um die ursprüngliche Firmware wiederherzustellen. Das ist genauso einfach.
Ein erstes Programm in RobotC schreiben
Nun kann das eigentliche Programmieren beginnen, zum Beispiel mit dem in Abbildung 1 dargestellten Programm. Damit lässt sich ein mobiler Zweirad-Roboter mit Differenzialantrieb steuern, also die meisten klassischen Roboter.
Mit diesem Programm werden die an den Port A und C des Roboters angeschlossenen Motoren mittels der Funktion „Motor“ gesteuert. Der dieser Funktion zugeteilte Wert zeigt an, mit welcher Geschwindigkeit sich der Motor dreht:
- +100: Der Motor dreht sich mit voller Geschwindigkeit vorwärts
- 0 : Der Motor steht still
- -100 : lDer Motor dreht sich mit voller Geschwindigkeit rückwärts
Je nach Bauart (Ausrichtung des Motors auf Ihrem Roboter) ist ein positiver oder negativer Wert zu verwenden.
Bei diesem einfachen Programm kommen auch zwei Methoden zum Einsatz, mit denen das Programm verzögert werden kann:
- wait1Msec(): Mehrere Millisekunden lang geschieht nichts
- wait10Msec(): Mehrere 10 Millisekunden lang geschieht nichts
Kompilierung und Ausführung
Zum Kompilieren des Programms stehen zwei Einträge im Menü „Robot“ bzw. die Tasten F5 und F7 als Shortcuts zur Verfügung.
Mit der Taste F7 wird das Programm lediglich kompiliert. Damit lassen sich Kompilierungsfehler erkennen.
Mit der Taste F5 wird das Programm kompiliert und der kompilierte Code auf den Computer übertragen. Diese Funktion ist nur dann aktiv, wenn der Roboter angeschlossen ist, das heißt, der Stein ist eingeschaltet und (mittels USB oder Bluetooth) mit dem Computer verbunden
Beim Betätigen der Taste F5 öffnet sich ein Fenster, das anzeigt, wie das Herunterladen des Programms auf den Roboter voranschreitet. Dann schließt sich dieses Fenster und es öffnet sich das Fenster „Program Debug".
Abbildung 4: "Program Debug"-Fenster
Wenn Sie nun auf „Start“ klicken, wird das Programm, das Sie soeben heruntergeladen haben, ausgeführt.
Mit der Schaltfläche „Step Into“ werden die Anwendungen Schritt für Schritt ausgeführt, und die anderen Debug-Buttons werden aktiviert, mit denen zum Beispiel ein Befehl ausgesetzt oder übersprungen wird: „Suspend“, „Step Over“ und „Step Out“.
Einführung in der Verwendung von Sensoren und Variablen
Nun sollen Roboter und Programm ein wenig komplexer werden. Wir fügen einen Lego Mindstorms NXT Ultraschallsensor hinzu, mit dem sich Entfernungen zu Hindernissen mit Hilfe von Ultraschall erkennen lassen, und stecken ihn an den Port Nr. 4 des NXT-Steins.
Abbildung 5: Ultraschallsensor
IZunächst muss das Programm RobotC davon in Kenntnis gesetzt werden, dass dieser neue Sensor hinzugekommen ist. Hierfür gehen Sie ins Menü „Robot“ und klicken auf „Motors and Sensors Setup“. Später werden Sie sehen, dass dieser Schritt optional ist und ein Sensor auch über den Code angemeldet werden kann. Hier haben wir uns allerdings das Ziel gesetzt, RobotC und die vielfältigen Möglichkeiten, die sich damit bieten, vorzustellen.
In dem sich öffnenden Fenster klicken Sie auf den Reiter „Sensors“. Sie werden merken, dass auch die Position der Motoren auf dem Roboter angegeben werden kann.
Abbildung 6: Schnittstelle zur Anmeldung von Sensoren
Wie aus der Abbildung oben ersichtlich, geben Sie Ihrem Sensor einen Namen und wählen den Sensortyp im Dropdown-Menü aus. Achten Sie darauf, dass Sie diesen Schritt tatsächlich auf dem Port durchführen, an dem Ihr Sensor angeschlossen ist, denn sonst verhält sich Ihr Programm sehr sonderbar.
Klicken Sie anschließend auf „OK“.
Die Schnittstelle hat somit automatisch in Ihrem Code folgende Anweisung hinzugefügt:
#pragma config(Sensor, S4, MySonar, sensorSONAR)
//*!!Code automatically generated by 'ROBOTC' configuration wizard
Wir werden nun ein Programm erstellen, bei dem der Roboter dazu angeleitet wird, geradeaus zu gehen, bis er auf ein Hindernis stößt, wo er dann nach rechts abbiegt. Zwar gibt es viel effizientere Algorithmen zum Ausweichen von Hindernissen (Kollisionsvermeidung), aber darauf soll hier nicht näher eingegangen werden. Die folgende Abbildung zeigt den entsprechenden Code.
Abbildung 7: Einfacher Code zur Kollisionsvermeidung
Dieser Code bringt die Funktion SensorValue ein, die es ermöglicht, den zuletzt vom konfigurierten Sensor gemessenen Wert zu extrahieren. Hier handelt es sich offenbar um einen Ultraschall-Entfernungsmesser.
Bevor wir nun prüfen, wie sich das Programm auf dem Roboter verhält, sehen wir uns noch verschiedene Möglichkeiten an, die RobotC bietet, um zu verstehen, was vor sich geht, wenn das Programm läuft. Gehen Sie hierfür in das Menü „Robot / Debug Windows“ und klicken Sie auf „Global Variables“. Wiederholen Sie den Vorgang für „System Parameters“.
Dadurch gelangen Sie zu den Reitern neben Ihrem „Error“-Reiter, der im Zuge der ersten Kompilierung geöffnet wurde. Achten Sie während des Kompiliervorgangs darauf, was sich in den soeben geöffneten Fenstern tut.
Im Fenster „Global Variables“ werden die Werte aller Variablen und Konstanten Ihres Programms in Echtzeit dargestellt. Sollte der Wert nicht aktualisiert werden, so klicken Sie im Fenster „Program Debug“ auf „Continuous“.
Abbildung 8: Das Fenster „Global Variables“ zeigt alle Werte der Programmvariablen in Echtzeit
Dieses Fenster liefert sehr hilfreiche Informationen über den Istzustand des Systems und das Voranschreiten des Programms in Echtzeit: Der Computer zeigt in Echtzeit die Messwerte der verschiedenen Sensoren, die Werte aller Variablen und Konstanten sowie die Motorleistungswerte an.
Im Fenster „System Parameters“ werden die allgemeinen Daten über den Systemzustand dargestellt.
Schlussbemerkung nach der Einführung in die Programmierung mit C
Dieser Artikel ist der erste aus einer Reihe von Artikeln, in denen unterschiedliche Aspekte von RobotC präsentiert werden. Hier wurden die Grundlagen der Software sowie die verschiedenen Debug-Optionen vorgestellt. RobotC ist eine einfache und leistungsfähige Software zur Programmierung von Lego Mindstorms NXT Robotern und zum Einstieg in die Robotik.
Generation Robots (http://www.generationrobots.de)
Jegliche Verwendung oder Vervielfältigung bedarf der vorherigen ausdrücklichen Genehmigung.