Donnerstag, der 20. Oktober war der letzte Tag, bevor unser Robotik-Projekt fertig sein musste. Die Aufgabe war es, einen Pioneer-Roboter nacheinander fünf (vorher unbekannte) Punkte anfahren zu lassen. Bewertet wurden dabei die Geschwindigkeit und Genauigkeit.
Um zu diesen Punkten zu navigieren, muss der Roboter zunächst seine eigene Position kennen. Dazu befanden sich drei unterschiedlich große Säulen am Feldrand, die mit Hilfe eines Laserscanners erkannt werden sollten.
Im Bild: Koordinatensystem mit den drei Säulen (grau), erkannte Säulen (rot) und berechnete Position des Roboters (grün).
Der Robotik-Kurs teilte sich in vier Gruppen, die in dieser Aufgabe gegeneinander antraten. In meinem Team waren die zwei sehr sympathischen und fähigen Australier Pete und Dave.
Unsere Aufgabenteilung sah so aus: Jeder von uns hatte eine Methode zur Säulenerkennung geschrieben (so dass wir die beste auswählen konnten), ich kümmerte mich um die Lokalisierung des Roboters, Pete übernahm die Wegplanung und die Steuerung und Dave hackte alles so zusammen das der Roboter sich tatsächlich auch bewegte.
Bei unserem ersten Testlauf, einige Tage vorher, starteten wir den Roboter mit minimaler Geschwindigkeit, weil wir nicht wussten, wie schnell dieser war. Als er sich kaum sichtbar bewegte, erhöhten wir die Geschwindigkeit schrittweise bis zum Anschlag, wobei der Roboter immernoch so langsam fuhr, dass wir in Gelächter ausbrachen und entschieden unser Team "SLOWBOT" zu taufen.
Nach einiger Tüftelei im Roboterlabor, waren wir am Donnerstag Abend soweit, die Aufgabe lösen zu können. Der Roboter blieb auf dem Feld und erreichte zielstrebig alle Punkte. Die anderen Teams hatten noch sehr profunde Probleme, so dass wir klar vorne lagen. Sicher war aber auch, dass unsere Gegner bestimmt bis tief in die Nacht arbeiten würden.
Pete hatte noch einen Report zum nächsten Tag zu schreiben und ging deshalb früh nach Hause. Dave und ich blieben dort und wollten alles noch etwas optimieren, um ganz sicher nicht von den Anderen überholt zu werden. Außerdem hatte Dave die Geschwindigkeitsbegrenzung für den Roboter gefunden und wollte diese für unseren Lauf aushebeln und damit den Roboter deutlich schneller machen.
Also holten wir uns Burger und Milchshakes von McDonalds und arbeiteten weiter. Problematisch war, dass wir nur einen Roboter zum Testen für alle Teams hatten. Wir wechselten uns ab, wobei jedes Team ein Zeitfenster von 30 Minuten hatte, bevor das nächste Team an der Reihe war.
Gegen Mitternacht hatte Dave es tatsächlich geschafft, die Maximalgeschwindigkeit des Roboters zu verändern. Allerdings konnte er den Roboter nur verlangsamen, nicht schneller machen, weil es an anderer Stelle noch eine Sperre gab. Das half uns natürlich nicht besonders viel weiter, aber sein Ergeiz war gepackt und er wollte noch nicht aufgeben.
Um 2 Uhr morgens waren wir immernoch in der Uni und bei einem Testlauf benahm sich der Roboter völlig seltsam. Relativ schnell war klar, dass der Fehler irgendwo in der Lokalisierung, also meinem Teil der Software, lag. Das könnte uns alles ruinieren und so ging ich das Programm Schritt für Schritt mit Stift und Papier durch, um die Ursache zu finden. Gegen 3 Uhr hatte ich den Fehler soweit eingekreist, dass die Berechnung eines Winkels in einem Dreieck, aus Gründen die ich mir nicht erklären konnte, einen falschen Wert ergab.
Ich zeichnete das Dreieck und rechnete mit einem Taschenrechner nach: sin(B) = sin(A)*b/a und bekam für B einen Winkel < 90° heraus, obwohl der Winkel ganz klar größer war als 90°. Wie sich herausstellte war mein Programm richtig, aber die Mathematik hat einen Fehler. Denn was einem in der Schule Niemand sagt: Der Sinussatz ist für bestimmte Dreiecke mehrdeutig! Das heißt: Es gibt zwei verschiedene Dreiecke mit den Seiten a und b und dem Winkel A. Damit gibt es auch zwei verschiedene Ergebnisse für B.
Um 4 Uhr war das Problem gelöst, indem ich den Sinussatz gegen den Cosinussatz austauschte.
Kurze Zeit später sagte mir Dave: "Ich glaube, ich habs." Er hatte es tatsächlich geschafft, die Geschwindigkeitsgrenze des Roboters zu deaktivieren, so dass wir nun doppelt so schnell waren. Leider mussten wir deshalb die Steuerung des Roboters komplett umschreiben, um die höhere Geschwindigkeit nutzen zu können, ohne jedes Mal über das Ziel hinaus zu schießen.
Während Dave und ich also in Petes Code herumdoktorten, wurde die Müdigkeit immer stärker und wir konnten uns kaum noch konzentrieren. Mehrfach dachten wir daran, Alles rückgängig zu machen und mit der Variante vom Abend anzutreten. Aber die Fortschritte der Anderen ließen uns keine Wahl - wenn wir gewinnen wollten, mussten wir noch besser werden.
Gegen 7 Uhr funktionierte dann endlich alles soweit zufriedenstellend, dass wir unsere Sachen packen und für ein paar Stunden Schlaf, Frühstück und eine Dusche nach Hause fahren konnten, in der Hoffnung, dass es dann um 13 Uhr auch noch funktionieren und gut genug sein würde, um unsere Gegener zu schlagen.
Hier ein Video vom Wettbewerb: (Weil der Akku nicht stark genug ist, musste ich mit einem Stromkabel hinter dem Roboter hinterherlaufen, was manchmal garnicht so einfach ist ... )
Was passiert: Vor dem Lauf werden dem Roboter die Koordinaten von 5 Zielpunkten mitgeteilt. Zu Beginn dreht sich der Roboter im Kreis, um die Säulen zu finden und seine Position zu bestimmen. Danach berechnet er die Reihenfolge, in der er die Punkte anfahren wird. Dann dreht er sich zum ersten Punkt, fährt dort hin und bleibt stehen. Die Position des Roboters wird markiert. Im Anschluss wird der Roboter wieder gestartet und fährt zum nächsten Punkt usw.
Unser Roboter war dank Daves Hack im Vergleich zu den anderen Teams viel schneller und auch die Optimierung der Genauigkeit machte sich bezahlt. Unser Prof. hatte sichtlich Freude, als er die Abweichung von den Zielpunkten ausmaß: "2 Zentimeter, 4 Zentimeter, 1,5 Zentimeter ... ".
Die Nacht durchzuarbeiten hatte sich also gelohnt. Hiernach ging ich zufrieden nach Hause und holte etwas Schlaf nach. :D


Keine Kommentare:
Kommentar veröffentlichen