Mobot#

Artikel von Cosku Acay, Edwin Cho, Kenneth Li und Nishant Pol. PDF.

Projektbeschreibung#

Beim Mobot-Wettbewerb der Carnegie Mellon müssen Roboter eine Reihe von 14 Toren passieren, die über einer 255 Fuß langen, gekrümmten weißen Linie auf einem Gehweg im Freien positioniert sind. Der Parcours umfasst zwei steile Rampen und einen Entscheidungsbereich, an dem der Roboter die richtige Route wählen muss, um die 14 Tore in serieller Reihenfolge zu passieren. Da sich die Linie im Freien und bei Pittsburghs Wetter befindet, muss der Roboter unter verschiedenen Bedingungen funktionieren. Dieses Jahr war es am Wettbewerbstag regnerisch und windig. Weitere Informationen finden Sie unter http://www.cs.cmu.edu/mobot/mobot.html

Mobot Mobot

Mobot (full size)Mobot (full size)

Lösung mit der CMUcam4#

Wir haben uns entschieden, die Linienverfolgungsaufgabe mit der CMUcam4 anzugehen, weil sie minimale Hardware erforderte und eine für die Verfolgung einer Linie gut geeignete Schnittstelle hatte.

Mobot hardware Mobot hardware (full size)

Die CMUcam4 nimmt ein Bild der Linie mit 30 Bildern pro Sekunde auf und leitet das Farbverfolgungsbild über eine der drei seriellen Leitungen an den Arduino Mega weiter. Der Arduino Mega verarbeitet dann dieses Bild (siehe Softwarebeschreibung unten) und liefert Motorgeschwindigkeits- und Drehbefehle über eine weitere serielle Leitung an den PID-Regler. Der PID-Regler wiederum liefert dem Arduino Mega Encoder-Zählwerte für das rechte und das linke Rad, was es uns ermöglicht, unsere Position und Ausrichtung relativ zu Tor 0 zu verfolgen.

Der PID-Regler (MD-25) wird von Robot-Electronics in Großbritannien hergestellt. Er treibt zwei mit Getriebe versehene DC-Bürstenmotoren mit magnetischen Encodern an der Motorwelle an. Der LCD-Bildschirm dient zu Debugging-Zwecken. Wir hatten zwei Stromschienen, 12 V für Motoren und 5 V für die Logik, die sich dieselbe Masse teilen und beide aus einer einzigen 12-V-Akku gespeist werden.

Ursprünglich planten wir, einen Prototyp aus einer Holzbasis zu bauen, um schnell in die Programmierphase zu gelangen, und dann an einer schnelleren, zuverlässigeren Basis wie einem RC-Auto zu arbeiten. Wir stellten jedoch fest, dass der Prototyp sehr zuverlässig und einfach zu handhaben war, sodass wir ihn für das endgültige Design beibehielten. Der Wasserschutz für den Körper bestand aus einer Schicht Zellophanfolie unter einer Schicht Verpackungsklebeband. Regen sickerte jedoch durch das Verpackungsklebeband, glücklicherweise aber nicht durch die Zellophanfolie. Die Kamera war mit einem quadratischen Stück Plastik aus einem Ziploc-Beutel abgedeckt, da wir feststellten, dass der „Filter“ die Fähigkeit der Kamera verbesserte, kleine Flecken der Linie zu ignorieren, die für die Kamera wie der Hintergrundbeton aussahen.

Beschreibung des Algorithmus#

Hintergrund#

Wir verwenden die CMUcam4 im Farbverfolgungsmodus mit aktiviertem YUV-Modus, was uns eine binäre Bilddarstellung der Linie liefert. Die Kamerasoftware filtert alles heraus, was nicht weiß ist (d.h. den Hintergrund), und setzt ein „eingeschaltetes“ Pixel dort, wo eine Linie ist (wo es weiß ist). Wir verwenden den YUV-Modus, damit die Farbverfolgung unempfindlich gegenüber der Lichtintensität ist, sodass unser Roboter unter einer Vielzahl von Bedingungen funktionieren kann, sowohl drinnen als auch draußen.

Linienverfolgung#

Die CMUcam4 liefert unserem Arduino-Chip ein 80 mal 60 Binärbild. Wir tasten 10 gleichmäßig verteilte Pixelzeilen aus dem Bild ab und berechnen den Schwerpunkt der „aktiven“ Pixel (siehe hier: https://en.wikipedia.org/wiki/Centroid#Of_a_finite_set_of_points). Wir nehmen dann an, dass die Linie auf dem Schwerpunkt liegt. Indem wir dies auf 10 verschiedenen Zeilen im Bild tun, erhalten wir eine gute Annäherung an die Linie, indem wir die Punkte verbinden. Wir können diese Daten dann nutzen, indem wir herausfinden, wie weit jeder Punkt auf der Linie von der vertikalen Linie entfernt ist, die in der Mitte des Bildes liegt, um einen Wert zu erhalten, der darstellt, wie stark die Linie gekrümmt ist. Dies kann man sich in etwa so vorstellen, als würde man die Fläche zwischen der Tangente und einer Kurve ermitteln und diese Fläche verwenden, um zu bestimmen, wie stark wir drehen müssen. Das Vorzeichen bestimmt, ob die Drehung nach links oder rechts erfolgt, während die Größe bestimmt, wie stark wir drehen müssen, um der Linie zu folgen. Wie zu erwarten, befindet sich die Linie direkt vor dem Roboter und ist eine gerade Linie, wenn wir eine Fläche von null messen. Wenn die Größe der Fläche groß ist, muss der Roboter drehen, um zu versuchen, die Größe dieser Fläche zu minimieren.

Entscheidungspunkte#

Um festzustellen, ob sich der Roboter an einem Entscheidungspunkt befindet, nehmen wir die Daten, die die Kamera bei der Linienverfolgung sammelt, und prüfen, wie viele durchschnittliche Mittelpunkte im schwarzen Bereich erscheinen. Dies funktioniert unter der Annahme, dass der Durchschnittspunkt zwischen zwei Linien auf keiner der beiden Linien liegen sollte, es sei denn, die Linien sind dieselbe Linie. Wenn der Roboter mehrere Durchschnittspunkte im schwarzen Bereich erkennt, kann er schließen, dass es hier zwei Linien geben muss. Dann wählt er die entsprechende Kurve aus und lenkt seine Wendung in diese Richtung, bis er nur noch eine Linie sieht.

Bitte besuchen Sie https://github.com/cacay/Mobot, um eine vereinfachte Version unseres Codes zu sehen, oder hier für eine lokale Kopie.