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.

Samstag, 22. September 2007

Ultraschall

Das Ultraschallmodul zur Abstandsmessung ist mittlerweile da, montiert, angeschlossen und in Funktion. Die mechanische und elektrische Integration war denkbar simpel. Ich verwende das SRF05 Modul von Devantech [link], in Deutschland vertrieben durch robotikhardware.de [link]. Die Fotos zeigen, wie ich das Modul angebaut habe: es ist auf eine Lochrasterplatine geschraubt, in die Platine sind rechts und links oben zwei Elemente einer doppelreihigen Buchsenleiste gelötet. Auf der Hauptplatine befinden sich als Gegenstücke entsprechend zwei gewinkelte Pfostenstecker. Über die Kontakte der einen Seite ist das Ultraschallmodul elektrisch mit der Hauptplatine verbunden. Da das Modul leicht und keinerlei mechanischen Belastungen ausgesetzt ist, ist dies eine praktikable Befestigung, ich kann das Modul somit einfach abziehen. Sollte ich doch mal den Akku wechseln wollen, wäre das von Vorteil, dieser ist nämlich (ohne Rumgeschraube) nur von vorne zugänglich. Wie ich das Antwortsignal des Moduls softwareseitig auswerte, wird man in Bälde dem Quellcode entnehmen können. Schonmal in Kürze: der Objektabstand wird von dem Ulstraschallmodul in der Länge eines Antwortpulses kodiert. Also löse ich bei jedem Flankenwechsel dieses Signals einen Interrupt aus, und messe mit Timer0 des AVR (ja, ist nur ein 8 Bit Timer, reicht aber an Genauigkeit für meine Zwecke) den Abstand zwischen den Interrupts (d. i. Flankenwechseln). Erfreulicherweise verhält sich das Modul einigermaßen linear, sodass ich die gemessene Zeit schlicht über einen (empirisch ermittelten) Faktor in den Abstand umrechnen kann. Das Ergebnis verschicke ich dann per Funk an die Basis. Funktioniert prima.

Sonntag, 2. September 2007

Basisstation

Auch wenn ich hier jetzt schon länger nichts habe von mir hören lassen, habe ich natürlich dennoch fleißig weitergearbeitet. Zu sehen gibt es heute mal ein Bild von meiner "Basisstation", also dem Interface zwischen PC und Vehikel. Der Aufbau ist aktuell noch provisorisch, bei Zeiten werde ich alles (Netzteil, Basisstation, Funkkameraempfänger) zu Modulen für ein 19-Zoll Einschubgehäuse umbauen.
Die bidirektionale Kommunikation zwischen Vehikel und PC funktioniert mittlerweile, das Prinzip dabei ist folgendes: Der PC sendet per RS-232 an die Basisstation Datenpakete à 16 Byte. Darin sind bisher die Schrittfrequenz für beide Motoren und die Stellung der Kamera kodiert (ich habe also noch einige Bytes übrig, um anderes zu übertragen). Die Basisstation sendet ein empfangenes Paket dann per Funk weiter an das Vehikel. Das Vehikel reagiert entsprechend der Befehle und antwortet seinerseits mit einem 16 Byte großen Datenpaket. Dieses wird wiederrum von der Basisstation über die serielle Schnittstelle an den PC übertragen. Darin enthalten sind "sensorische" Informationen, zum einen über die Akkuspannung, bald außerdem das Signal eines Ultraschallsensors, mit dem ich den Abstand zu Hindernissen messen möchte. Ein Vorteil dieser einfachen Kommunikationsform ist, dass die Updaterate der Datenpakete vom PC bestimmt wird: ich kann viel oder wenig Pakete pro Zeit verschicken. Da die Antwort des Vehikels durch den Empfang eines Paketes getriggert wird, ist somit auch die Antwortrate definiert. Im Moment arbeite ich mit einer Rate von etwa 100 Hz, d.h. ich verschicke ca. 100 Datenpakete pro Sekunde (man stelle sich das mal per Post vor...), und bekomme also auch 100 zurück. Daraus resultiert somit eine Reaktionslatenz des Vehikels von maximal etwa 10 ms - meiner Einschätzung nach ausreichend für die Maximalgeschwindigkeit, von der ich z. Zt. ausgehe. Um auf die Schnelle mal eine einfache Ansteuerung per Computer zu realisieren, habe ich ein paar kleine Matlab-Funktionen geschrieben, die mir die jeweils gewünschten Befehle per RS232 verschicken und die Antwortpakete einlesen und auswerten. Auf die Dauer ist Matlab natürlich zu lahmarschig, mittelfristig werde ich also auf eine andere Entwicklungsumgebung umsteigen. Wenn die Software insgesamt (also auch der Bascom-Code für Vehikel und Basisstation) "rund" ist, werde ich alles hier veröffentlichen – noch ist der Code definitiv zu schmutzig (ich bin da etwas gênant).
Neben der Computersteurung beitet die Basisstation außerdem einen "manuellen Modus", bei dem ich das Vehikel per Hand unabhängig vom PC steuern kann - nur für den Fall, dass die autonome Navigation irgendwann mal in eine Sackgasse geführt hat. Dazu habe ich zwei Joysticks (so Billigdinger für Gamecontroller) verwendet, allerdings benutze ich pro Steuerkreuz nur eine Dimension, mit der ich dann jeweils ein Rad aktiviere. Ich hatte erst eine Version mit nur einem Joystick aufgebaut, weil die Dinger aber sehr unpräzise sind, mangelte es dabei etwas an "Freude am Fahren". Jetzt steuert man das Vehikel wie einen Panzer - zumindest glaube ich als alter Zivi, dass man einen Panzer so steuert.
Noch ein paar Worte zur Technik: als µC verwende ich in hier einen AVR Mega162. Da dieser keine A/D-Wandler hat, digitalisiere ich das Joysticksignal mittels eines PCF8591, der über I2C am AVR hängt. Das sieht auf den ersten Blick etwas ungeschickt aus, schließlich hätte ich ja einfach einen Mega32 mit integrierten ADCs verwenden können. Der Grund, es dennoch so zu machen, ist schlicht: den Mega162 hatte ich noch rumliegen, außerdem wollte ich seit längerem mal was mit dem PCF8591 machen, so bot sich diese Variante an.
So, jetzt warte ich nur noch, dass der Ultraschallsensor endlich bei mir eintrifft, dann kann’s weitegehen. Langsam wird’s spannend…

Malte Ahlers 2007-2008