Robotersteuerung

Seit geraumer Zeit arbeite ich daran, einen Roboter aufzubauen. Dieser soll zentral durch einen Computer gesteuert werden. Im ersten Schritt wird die Steuerung noch statisch vorgegeben sein. Ziel ist es aber, dass eine Art KI die Steuerung vornimmt.

Die Hardware für den Roboter ist aktuell Folgende:

roboter
Der Roboter an sich.

Die Hardware ist ein "Scarab Robot Kit" von Playtastic(TM). Erkennt dieser Roboter ein Hinderniss (mechanisch), so können Bewegungen über Jumper definiert werden. Für jede Reaktion sind zwei Aktionen definierbar. Das ist recht praktisch, da ich mich daher nicht um die Bewegungen selbst kümmern muss, sondern um die Logik, wie sich der Roboter zurecht finden kann. Zuerst habe ich den mechanischen Sensor ausgetauscht durch einen Ultraschall-Sensor.

roboter-sensor
Die 'Augen' des Roboter - in meinem Fall habe ich mich für einen Ultraschall-Entfernungssensor entschieden.
Die Steuerung übernimmt ein IBM Thinkpad 600 (Typ 2645) - Notebook mit einem Pentium 2 - Prozessor (233 MHz). Als Schnittstelle zum Roboter dient der Parallelport. Folgendes Schema zeigt den prinzipiellen Aufbau:
roboter-schema
Schema des Aufbaus
Die Relaiskarte ist mit dem Parallelport verbunden. Sobald die Spannung des Ultraschallsensors einen Punkt X überschreitet, schaltet das Relais. Diese Änderung wird am LPT-Eingang registriert und die Software kann darauf reagieren.
roboter-relaiskarte-lpt
Der LPT-Eingang

Fehler: natürlich muss der Widerstand raus - ansonsten fällt die Spannung darüber ab - und der Eingang bekommt gar nichts mit ... also Eingang kurzschliessen.

Die folgende Schaltung erläutert die Steuerleitungen näher, welche dann die Bewegungen des Roboters definieren, wenn ein Hinderniss ermittelt wurde. Die Schaltung ist sehr simpel mit Relais gelöst - aber sie funktioniert! Die Datenleitung D0 ist dafür reserviert, dass eine Aktion am Roboter initiiert wird. Es sind dann also noch 7 Steuerleitungen frei, eine vordefinierte Bewegung des Roboters anzusprechen.
roboter-ausgang-lpt
Schaltung am LPT-Ausgang

Die Software ist (selbstverständlich) in Java geschrieben und nutzt eine MySql - Datenbank als Backend. Die Kommunikation über die parallele Schnittstelle erfolgt die Parport - Bibliothek.

Alternativ ist es auch vorgesehen, die Kommunikation über die Adio.sys - Controllerkarte zu realisieren. Hierfür ist es aber nötig, die Bibliothek an Linux anzupassen und neu zu kompilieren. Damit würde die Kommunikation via JNI die ADIO.sys Bibliothek geschehen.

Die Stromversorgung wird über die USB - Schnittstelle realisiert. Der Roboter läuft zwar standardmäßig mit 4 AAA - Batterien, welche zusammen 6 Volt bringen. Mit 5 Volt bewegt sich der Roboter aber auch vorwärts - wenn auch ab und zu scheinbar etwas langsamer.

Die Bewegungen werden in Form eines Textfiles eingelesen und nach Bedarf nacheinander abgearbeitet. Dies ist der Fall, sobald durch den Ultraschallsensor ein Hinderniss erkannt wird. Durch die ansteigende Spannungsdifferenz wird ein Relais geschaltet, welches an einem Eingangspin vom Parallelport den Pegel auf HIGH schaltet. Dieser Eingang wird durch regelmäßiges Polling abgefragt (konfigurierbar).

Nach jedem Polling wird der Status am Eingang ausgewertet, in die Datenbank geschrieben und eine evtl. Richtungsänderung initiiert. Ich habe mich für das Polling entschieden, da ich zukünftig auch eine Aktion ausführen möchte, wenn eigentlich keine Aktion nötig wäre.

Orientieren soll sich der Roboter in einer Zeitmatrix, d.h. seine Position berechnet er aus den Zeiten, welche zwischen den Polling-Intervallen vergangen sind. Je länger sich dann der Roboter bewegt, umso mehr Informationen werden über die Umgebung gesammelt.
Gleichzeitig werden die Daten aus dem Sensor analysiert. Wird ein Hinderniss erkannt, muss eine Richtungsänderung initiiert werden. Hier gibt es diverse Strategien, nach denen die nächste Richtung gewählt werden sollte:
  • möglichst schnell vorankommen
  • die Umgebung möglichst genau analysieren

Ich habe mich für die zweite Strategie entschieden. Damit kann ich einen definierten Raum in x Schritten erkunden und die Ergebnisse visualisieren. Ziel ist es also, einen geeigneten Algorithmus zu finden, mit dem ich die Funktionen realisieren kann.

Angedacht habe ich dabei den folgenden Ablauf:

  • In der Datenbank wird geprüft, ob die Position und damit die nachfolgende Bewegung bekannt ist. xmin = xpos - threshold xmax = xpos + threshold ymin = ypos - threshold ymax = ypos + threshold
  • Der Wertebereich soll die ganzen Ergebnisse relativieren und die Fehlertoleranz erhöhen.
  • In einem Wertebereich kann es durchaus mehrere Einträge geben. Relevant für die Betrachtung ist ebenfalls die aktuelle Richtung.
  • Threshold muss so gewählt werden, dass die Bewegung im Raum möglichst effektiv ist.
  • Das Ergebnis ist dann die Basis für den Entscheidungsbaum.
  • Anbinden einer Rules Engine