Worum es hier geht

Dieses Blog dokumentiert Fortschritte und Rückschläge der Entwicklung meines ersten Roboterprojektes. Ich habe dem Projekt den Namen vehikel[eins] gegeben - mit mehr oder weniger Hintersinn. Das Vehikel ist als fahrender Roboter konzipiert, der sich mittels einer Kamera visuell orientieren können soll. Die eigentliche Bildverarbeitung findet auf einem PC statt, der Roboter wird deshalb per Funk mit einem Computer in Verbindung stehen. Ich verkneife mir, allzu übermütige Pläne darüber zu schmieden, was im Detail mein Vehikel später visuell leisten können soll. Ich bin in erster Linie von der Idee eines Systems fasziniert, das mit Hilfe selbst gewonnener visueller Informationen in der realen Welt halbwegs sinnvoll agiert - mit der Welt interagiert. Alles noch etwas undurchsichtig? Ja... :)

Der aktuelle Stand

Ich habe das Projekt in drei Etappen aufgeteilt. Die erste Etappe bestand in der mechanischen Realisierung einer motorisierten Plattform für alle späteren Aufbauten. Diese Etappe wurde erfolgreich abgeschlossen. Daraus hervorgegangen ist ein dreirädriges Vehikel, dessen zwei Vorderräder unabhängig über ein Getriebe von jeweils einem Schrittmotor angetrieben werden. Das Hinterrad stellt sich passiv auf die aktuelle Bewegungsrichtung ein. In der zweiten Etappe des Projektes ging es darum, die Elektronik des Vehikels und der Basisstation zu entwickeln. Auch wenn ich noch an Details arbeite, ist diese Etappe in dem Sinne abgeschlossen, dass die gesteckten Ziele erreicht wurden. Der zentrale Mikrocontroller des Vehikels ist ein ATMEL AVR Mega32, die Firmware dafür entwickle ich mit der BASCOM IDE von MCS. Die Schrittmotoren werden durch eine Treiberelektronik auf Basis der Bausteine L297 und L298 angesteuert. Eine Funkverbindung zwischen Vehikel und PC wird mittels eines dazu entwickelten Interfaces hergestellt, das bidirektional mit dem PC über RS-232, mit dem Vehikel per Funk im 433 MHz Band kommuniziert. Die Funkstrecke wurde auf Grundlage der RFM12 Module von HopeRF realisiert. Vorne auf dem Vehikel ist eine mittels Servo bewegliche Funkkamera installiert. Die Kamera unterhält eine eigene Funkstrecke mit ihrem Empfängermodul, das mit PC-Interface und Netzteil die Basisstation bildet. Die am Vehikel befindliche Sensorik kann je nach konkretem Versuch variieren, zur Zeit ist vorne ein SRF05 Ultraschallmodul als Echolot installiert, an den Seiten vorne und hinten befinden sich Infrarot-Abstandssensoren. Die dritte Etappe ist diejenige, die für mich die unberechenbarste ist (aber deshalb auch besonders spannend), denn dabei steht die Implementierung eins visuellen Verhaltens im Mittelpunkt. Mittlerweile habe ich die ersten kleinen "Erfolge" in diesem Bereich zu verzeichnen.

Zum Aufbau dieser Seite


Unterhalb dieses Abschnittes sind die Tagebucheinträge chronologisch angeordnet, der aktuellste steht oben. Es werden nur die jeweils jüngsten acht Einträge auf dieser Seite angezeigt, ältere kann man an ihrem unteren Ende aufrufen. Man kann einen Eintrag kommentieren, in dem man auf "comments" unter dem entsprechenden Posting klickt.

Posts mit dem Label Programmierung werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Programmierung werden angezeigt. Alle Posts anzeigen

Mittwoch, 28. Mai 2008

Code III - Navigationsalgorithmus in Matlab

So, hier nun der Rest des Codes. Es gilt auch hierfür das bereits Gesagte: möglicherweise sind noch einige Schönheitsfehler in den Funktionen.

Sonntag, 25. Mai 2008

Code II - Basisstation

Und hier nun der Bascom Code für die Basisstation. Tatsächlich habe ich nicht die Sorgfalt beim Aufräumen des Programms walten lassen, die ich eigentlich für angemessen halte. Im Ergebnis könnte es somit sein, dass noch eine ganze Menge Müll im Code rumliegt - etwa Dimensionierungen von Variablen, die dann doch niemals benutzt werden. Wie auch immer, voilà:

Samstag, 24. Mai 2008

Code I - Fahrzeug

Jetzt habe ich es endlich mal geschafft, zumindest das erste Drittel des Quellcodes meines vehikel[eins] Projektes aufzubereiten. Unten ist der Bascom-Code für das Fahrzeug verlinkt. Das Programm für die Basisstation sowie der Matlab-Code für die Bildverarbeitung fehlen noch. Leider habe ich zur Zeit ziemlich viel zu tun, ich werde trotzdem versuchen, den Rest zügig nachzureichen.

Dienstag, 1. Januar 2008

vehikel[eins] als kamerabasierter Linienfolger

Kaum muss man ein paar Tage nicht arbeiten, schon kommt man endlich mal richtig zum arbeiten… Wie ja bereits angedeutet, waren meine Spielereien mit Ultraschall- und Infrarothindernisortung alles in allem etwas ernüchternd. Und da ich dieses Thema ja ohnehin nicht übermäßig spannend finde, habe ich es vorerst ad Acta gelegt und mich der meinem Geschmack nach wesentlich interessanteren Problematik der kamerabasierten („visuellen“) Navigation zugewandt. Mein erstes Projekt ist ein Linienfolger, also ein Fahrzeug, das eine auf dem Boden befindliche Line abfährt. Abgesehen von der recht simplen Algorithmik, eignet sich dieses Projekt gut zum Einstieg, weil es die verlässliche Funktion der gesamten, mittlerweile doch etwas komplex gewordenen „Infrastruktur“ des Systems erfordert, ich hier also zum ersten Mal alles „closed-loop“ betreiben muss - incl. Bildverarbeitung. Als neue Komponente dafür ist eine Frame-Grabber-Karte in meinen PC gekommen. Der Grabber digitalisiert das Videosignal vom Kameraempfänger und stellt es als einzelne Frames in MATLAB zur Verfügung, ich kann dann darauf rechnen und die extrahierten Informationen per RS-232 an meine Basisstation geben. Diese reicht die Steuerbefehle per Funk an das Vehikel weiter, das sich dann – wenn alles klappt – entsprechend verhält und dadurch wiederum den visuellen Input des Systems verändert.
Das über dem Bild verlinkte Video zeigt zum einen von oben, wie das Vehikel einen kleinen Parcours, den ich mit weißem Klebeband auf schwarze Pappe geklebt habe, „autonom“ abfährt. Das linke Bild des unteren Bilddrittels zeigt die Fahrt parallel aus Sicht des Vehikels. Um den zum „Erkennen“ der Linie verwendeten Algorithmus zur erleutern, sind noch ein paar weitere Dinge in dem Video dargestellt, die sogleich zur Sprache kommen sollen. Nach Spielereien mit wesentlich komplizierteren Ansätzen bin ich zu einem erstaunlich simplen Verfahren gekommen, um die Aktivierung der Motoren zu regeln. Nachdem ich per Schwelle ein 8-bit Graustufenframe von der Kamera in ein 1-bit Schwarzweißbild übersetzt habe, bestimme ich die Koordinaten des Schwerpunktes (center of gravity, COG) dieses Bildes und rechne dann die x-Koordinate des COG in die Aktivierung der Motoren um. Eine Abweichung der x-Koordinate des COG nach rechts von der Bildmitte führt dabei zu einer proportionalen Erhöhung der Drehgeschwindigkeit des linken Rades und einer proportionalen Verminderung Drehgeschwindigkeit des rechten Rades. Eine Abweichung des COG nach links von der Bildmitte hat entsprechend die umgekehrte Konsequenz. Befindet sich der COG in der Mitte der x-Dimension des Bildes, drehen beide Motoren gleich schnell. Links unten im Video ist nun die 1-bit Repräsentation des aktuellen Frames zu sehen, in grün eingezeichnet der COG, durch eine Linie verbunden mit der Mitte des unteren Bildrandes. Das original Kamerabild rechts zeigt in gleicher Weise den COG, dessen Koordinaten sind in den ersten beiden Zeilen angegeben, darunter die daraus errechnete Aktivierung des rechten und linken Motors in Prozent der Maximalgeschwindigkeit. In ein paar Tagen werde ich den BASCOM und MATLAB Quellcode posten.

Um Codec Probleme zu vermeiden, habe ich das Filmchen als Blogger Video eingebunden - trotz der durch die hohe Kompression miesen Qualität. Hier ist zusätzlich aber auch noch ein Link zu einem avi mit etwas besserer Qualität:

Video: [link]

Mittwoch, 14. November 2007

Echolot

Soweit es meine Zeit zuließ, habe ich an meinem vehikel[eins] Projekt weitergearbeitet. Die Hardware ist ja mittlerweile fertiggestellt, sodass ich beginnen konnte, auf dem PC, der mit meiner Basisstation verbunden ist, erste simple Steueralgorithmen zu basteln. Ich verwende dafür nach wie vor Matlab, einfach weil ich es ziemlich stumpf runter schreiben kann – zum Experimentieren also genau das richtige. Ich habe mir zunächst die Routinen gebaut, die die Kommunikation mit dem Vehikel bewerkstelligen. Nachdem das akzeptabel funktionierte, habe ich begonnen, kleine Navigationsalgorithmen zu schreiben, die die über das Echolot gewonnenen Entfernungsinformationen verwenden. Einige Kleinigkeiten funktionieren schon, zufrieden bin ich damit allerdings längst nicht. Leider ist die Signalqualität des Ultraschallsensors nicht ganz so doll – aber zugegeben, mehr war auch realistisch gesehen wohl nicht zu erwarten. Um mal ein Gefühl für den Sensor zu bekommen, habe ich ein einfaches Experiment gemacht, dessen Ergebnis ich hier kurz vorstellen möchte. Ich habe mein Vehikel mittig (also auf dem Punkt x=y=40 cm) in einer 80 * 80 cm großen Box eine 360°-Wende machen lassen. Dabei habe ich die zum PC gefunkten gemessenen Entfernungen zur Wand während der Drehung mit den theoretischen (also aus dem Drehwinkel errechneten) Entfernungen verglichen. Das Ergebnis zeigt das unten stehende Bild. Da der Sensor einige Zentimeter vor dem Drehpunkt des Vehikels liegt, sind gemessene und berechnete Entfernung kleiner als 40 cm. Dass die gemessenen Peaks deutlich schärfer als die berechneten sind, zeigt, dass die Entfernung teilweise unterschätzt wird. Ich bin mir nicht im Klaren warum – die Box war zumindest wirklich quadratisch. Auch die „Asymmetrie“ der Antwort ist für meinen Geschmack größer, als es eine Ungenauigkeit in der anfänglichen Positionierung des Vehikels erklären kann. Was außerdem unangenehm auffällt, ist die teilweise Zerklüftung der gemessenen Peaks (siehe z. B. bei 135°, also der zweiten Ecke der Box). Die insgesamt etwas grobe Quantisierung in der Entfernungsdimension rührt daher, dass ich nur ein Byte für die Kodierung der Entfernung verwende und ein LSB dabei 1 cm entspricht – ggf. werde ich hier noch anders Skalieren. Auf jeden Fall wird deutlich, dass mögliche Orientierungsalgorithmen Mittelungen über einen gewissen Drehwinkel verwenden müssen, sonst gibt’s Gezappel. Daran bastel ich gerade… Quellcodes, BASCOM und Matlab, poste ich dann in kürze auch endlich mal, ich will sie vorher noch aufräumen.


Malte Ahlers 2007-2008