Gestelltes Problem
Als Kind hatte ich eine Autorennbahn der Firma Faller.
Eigentlich ein Zwei-Personen-Spielzeug, aber leider wollte niemand ein zweites Mal gegen mich antreten. In Ermangelung eines menschlichen Gegners musste ich deshalb den zweiten Wagen immer mit auf einer mittleren Position arretierten “Gasgriff” fahren lassen. Es zeigte sich, dass ich diesen Wagen zwar leicht überholen konnte, sich die Sache aber recht schnell drehte, wenn mein Auto aufgrund eines Fahrfehlers herausflog. Speziell wenn ich dadurch in Rückstand und Stress geriet, folgten dann oft weitere Fehler meinerseits.
Wie dem auch sei, um 2000 rum holte ich das Ding aus dem Keller und baute es nach langer Zeit einmal wieder auf. Meinen Mangel an Sparringspartnern hatte die Zeit nicht heilen können.
Vielleicht konnte da der Computer helfen, einen Gegner zu emulieren?
Algorithmus
In den 1980ern schwebte mir schon einmal eine automatische Fahrzeugsteuerung vor. Damals hätte man jedoch jede einzelne Fahrbahnschiene um einen elektronischen Melder ergänzen müssen, um ermitteln zu können, wo sich der Wagen gerade befindet. Aber mittlerweile gabs ja Webcams. Damit musste es doch möglich sein, herauszufinden wo sich der Renner gerade auf der Strecke befand. Der erste Ansatz war, den Streckenaufbau Schiene für Schiene am PC zu erfassen. Dann sollte jeder Schiene eine Maximalgeschwindigkeit zugeordnet werden. Ein Streckenmodellierprogramm das sämtliche Faller-Schienen eingebaut bekam und Strecken grafisch darstellen konnte, hatte ich schon geschrieben. Wie jetzt das von der Webcam aufgenommene Bild dieser Strecke zugeordnet werden sollte, war mir noch zunächst unklar. Später kam mir bei nochmaligem Nachdenken der Gedanke, dass man eigentlich drauf pfeifen kann, wie der Streckenaufbau ist. Aus der Sicht der Kamera beschreibt das Fahrzeug eine irgendwie geartete Schleife. Jedem Segment dieser Schleife muss eine Geschwindigkeit zugeordnet werden. Die Form dieser Schleife kann durch einigen Testrunden ermittelt werden. Bei diesen Testrunden fährt nur das vom Rechner zu steuernde Auto. Dadurch ist dem Programm bekannt, in welchem Bereich sich das Fahrzeug befinden kann. Diese Schleife wird in Segmente eingeteilt. In der nächsten Phase, dem Training, wird die für jedes Schleifensegment maximal zulässige Geschwindigkeit ermittelt. Die Geschwindigkeit ist dann zu hoch, wenn der Wagen rausfliegt.
Hardware
Damit der PC keinen Vorteil besitzt, musste auf jeden Fall der Standard-“Gasgriff” angesteuert werden. Deshalb erwarb ich ein über USB ansteuerbares Experimentierboard mit zwei 0-5 Volt Analogausgängen.
In meiner Naivität ging ich davon aus, dass man damit ein Servo, wie es aus dem RC-Bereich bekannt ist, ansteuern könne. Nun brauchen diese Servos aber ein PWM(Pulsweitenmodulation)-Signal. Deshalb musste ich noch einen Bausatz für einen “Servotester” ranflicken.
Damit liess sich das Servo jetzt vom PC aus ansteuern. Der Winkel war nicht unbedingt proportional zum an die USB-Karte angelegten Wert, aber es würde reichen.
Jetzt mussten Gasgriff und Servo zusammengebracht werden. Laubsäge raus und eine entsprechende Halterung gebastelt.
Damit war an Hardware alles Nötige verfügbar.
Software
Zunächst für jeden Teil erst einmal Prototypen erstellt. Das Übertragen der jeweils gewünschten Servostellung an die USB-Karte, das Einlesen der Bilder von der Webcam. Die einzelnen Komponenten kommunizieren dabei über Sockets miteinander. Es stellte sich dabei heraus, dass die Bilder von der Webcam mit einer Verzögerung von ungefähr einer halben Sekunde eintrafen. Das ist ein Problem, welches man sich sehr gut für später aufbewahren kann.
Hier ein Screenshot des Prototypen für den Zugriff auf die Webcam und die Bewegungserkennung:
Wieder einmal zeigte sich, dass die grobe Vorstellung eines Algorithmus noch kein fertiges Programm ergibt. Und wieder einmal musste ich mich jedes kleinen Problemchens annehmen (Alter: 39, gelöste EDV-Probleme: 18.250, gefühlt: 3 Milliarden). Bezeichnenderweise waren die Erkennung der Fahrzeugposition und auch die Beschränkung der Bewegungserkennung auf die Fahrzeugspur ein Klacks. Schwer getan habe ich mich dann aber mit dem Aufbau der Sektorenliste. Wie sollten die über mehrere Runden gesammelten X,Y-Positionen zu einer gerichteten Liste konsolidiert werden? Was ist mit Fahrbahnkreuzungen? Viel Gefummel, aber irgendwann ging auch das.
Als Nächstes war die Erkennung zu langsam, d.h. die eingehenden Frames konnten nicht in Echtzeit verarbeitet werden.
Da bin ich noch bei.