Linefollower

Funktion
Der Segway ist im Freifach "Technisch Innovative Projekte" am TGM entstanden. Mein Teil des Projektes war eine Erweiterung zu entwerfen, die es dem Gefährt ermöglichen soll, sich autonom fortzubewegen. Die Stabilisierung des Roboters übernimmt ein LPC1768 Microcontroller von NXP Semiconductors. Zu diesem Zweck wurde ein PID-Regler in C implementiert, dessen Ein- und Ausgabe über ein Cyclone-IV FPGA von Altera geregelt wird. Auf der ersten Abbildung ist die Rückseite des Segways zu sehen. Auf der linken Bildhälfte ist das Microcontrollerboard zu sehen, während sich auf der rechten das FPGA befindet. Das FPGA wurde in VHDL programmiert und ist über ein Binary Unit System (BUS) mit einer Datenleitung von 8 Bit und einer Addressleitung von 3 Bit mit dem vorher genannten Microcontroller verbunden. Die Schrittmotorcontroller befinden sich direkt unterhalb der Piezolautsprecher. Es werden sieben der acht Adressen für den Beschleunigungssensor, das Gyroskop, die Drucktaster, die Motorcontroller, das Display und den Rotaryencoder verwendet. Dadurch bleibt für meine kameragesteuerte Erweiterung noch ein Byte im BUS über. Da ein USB-Core in VHDL ein Ding der Unmöglichkeit für mich als Einzelperson darstellt, habe ich mich für eine andere Schnittstelle mit dem Smartphone entschieden. Die Wahl ist auf den Klinkenstecker des Handys gefallen, da er durch sein zwangsläufig genaues Timing eine ideale asynchrone serielle Schnittstelle abgibt. Ich verwende ihn aber trotz seiner analogen Möglichkeiten ausschließlich als digitalen Ausgang.

Um das zu realisieren, wird mit dem FPGA ein auf dem Altera-PCB verbauter ADC eingelesen und dessen zurückgelieferter Wert mit einem anhand des Oszilloskops gewählten Threshhold verglichen. Auf dem rechten Bild ist ein solches Signal zu sehen. Nachdem das Signal auf diese Weise digitalisiert wurde, muss es nur noch parallelisiert und an das mbed zur Verarbeitung weitergegeben werden. Das weitergegebene Signal ist eine 6 Bit Zahl (0-63), bei der "0 = linker Anschlag" und "63 = rechter Anschlag" gilt. Die beiden übrigen Bits sind für ein Ende der Linie, beziehungsweise für einen Blinker reserviert. Das mbed lässt diese Zahl nun separat in die Berechnung des linken und des rechten Motorwertes einfließen. Falls das Bit, welches ein Linienende signalisiert, gesetzt ist, versucht das mbed das Segway möglichst schnell zum Stillstand zu bringen.

Das dritte Bild ist eine Bildschirmaufnahme der von mir geschriebenen App. Um den Segway einer Linie nachfahren zu lassen, muss der Audio-Klinkenstecker des Android-Smartphones mit den Analogeingängen des FPGAs verbunden werden und die Medienlautstärke auf das absolute Maximum gestellt werden. Danach muss durch Toucheingabe die Helligkeit der gewünschten Linie eingestellt werden. Sobald das geschehen ist, wird unter Verwendung der Computervision-Library OpenCV die Linie automatisch von der App erkannt und die Daten werden in das oben beschriebene Binärformat konvertiert. Im Bild habe ich zu Demonstrationszwecken die Binärzahl ausgeben lassen, welche zufälligerweise gerade eine genau zentrierte Linie beschreibt. (1000002=3210, was der gerundeten Hälfte von 64 entspricht) Die führende 1 signalisiert nur die rechts oben aktivierten Blinker. Falls mehrere Linien erkannt werden, so wird die binär Repräsentierte grün umrandet, während die Restliche(n) rot markiert werden. Mithilfe der rechten und der linken Pfeiltasten kann eine Tendenz in die jeweilige Richtung bei einer Kreuzung eingestellt werden, so wie es im anschließenden Video zu sehen ist.

Beim Entwickeln der App gab es Anfangs ein Problem, das die ausgegebenen Werte vollkommen wertlos gemacht hat, weil die Linie so gut wie nicht erkannt wurde. OpenCV verwendet das sogenannte HSV (Hue, Saturation und Value) Format. Als ich mit der App begonnen habe, habe ich mich dafür entschieden einen Spektralbereich des Hue-Wertes auszuwählen (wird in Grad angegeben), was bei verschiedenfarbigem Untergrund und Linie hervorragend funktioniert hat. Als ich das ganze aber versucht habe bei einem schwarz-weißen Kontrastverhältnis anzuwenden, hat sich herausgestellt, dass der Hue-Wert vollkommen zufällige Ergebnisse liefert.

Deshalb habe ich mich dafür entschlossen, wie im Screenshot zu sehen, ein Spektrum auf einer Graustufenskala zu definieren. Ich habe die App bereits auf 4 verschiedenen Smartphones mit unterschiedlichen API-Levels getestet, es hat bei allen zufriedenstellend funktioniert. Die App läuft sogar noch auf dem 2012 veröffentlichten Testgerät füssig und zuverlässig. Bei einem Galaxy S6 hat sich der Rahmen jedoch innerhalb kürzester Zeit stark erhitzt, was wahrscheinlich auf die dauerhaft aktivierte Hochleistungs-LED zurückzuführen ist. Den Blitz habe ich per Programm angeschalten, da er für eine gleichmäßigere Ausleuchtung und somit für zuverlässigere Ergebnisse der optischen Bilderkennung sorgt. Aktuell hat die Firmware des Microcontrollers noch einen Bug, der zur Überhitzung der Schrittmotoren führt, falls man sich zu lange in der Menüauswahl aufhält.