Faller AMS-Computeranbindung

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.

Faller AMS-Steuerung

Gestelltes Problem
Seit meinem 12. Lebensjahr bin ich begeisterter Besitzer einer Faller-AMS-Auto-Rennbahn. Ich hatte jedoch immer Probleme, Gegner zu finden, da sich meine Freunde meistens nur auf ein Rennen einliessen. Letztes Jahr habe ich eine Webcam erworben. Nun stellte sich mir die Frage, wie man eine PC-Steuerung eines Rennautos bewerkstelligen könnte.

Algorithmus
Mir schwebt vor, mehrmals pro Sekunde eine Aufnahme der Rennstrecke zu erzeugen. Durch Differenzbildung zwischen der aktuellen und der vorherigen Aufnahmen würde eine schwarze Bitmap entstehen, die an zwei Stellen weiss wäre, dem Standort des Fahrzeuges zum Zeitpunkt der ersten Aufnahme und dem Standpunkt des Fahrzeuges zum Zeitpunkt der zweiten Aufnahme. In einer Kalibrierungsphase wäre es möglich, den Bereich zu bestimmen, in dem sich das computer-gelenkte Fahrzeug bewegt. Dadurch entfällt also eine separate Erfassung der Streckenparameter, sicherlich könnte man eine Anwendung erstellen, bei der dem Computer die einzelnen Streckenabschnitte, enge Kurve 90 Grad, Gerade, normale Kurve, 45 Grad… bekannt gemacht würden, aber dieser Ansatz erscheint mir nicht sehr elegant. Stattdessen soll der Rechner seinen Wagen einige langsame Runden drehen lassen und so ein Abbild der durchfahrenen Strecke erstellen. Die so erfasste Strecke wird dann in Sektoren eingeteilt, die Länge eines solchen Sektors ergibt sich aus dem zeitlichen Abstand zwischen zwei Aufnahmen. Nun muss für jeden Sektor die Maximalgeschwindigkeit bestimmt werden. Diese ist nur experimentell zu erfassen. Das bedeutet, dass der Rechner den Wagen schrittweise immer schneller fahren lassen muss, bis er an einer bestimmten Stelle “rausfliegt”. Anhand der so erfassten Sektorparameter kann dann ein sicheres und schnelles Rennen gefahren werden. Bevor ich nun die erforderliche Hardware für die Geschwindigkeitssteuerung des Fahrzeugs besorge, mir schwebt eine Steuerung durch ein am Gasgriff angebrachtes Servo vor, ist zunächst einmal ein Prototyp zu erstellen, der die Machbarkeit belegt. Dabei ist der komplette Ablauf im Rechner zu simulieren. Einen ersten Schritt stellt ein Streckeneditor dar. Hier habe ich alle bekannten zweispurigen AMS-Schienen in Form eigener Klassen realisiert. Bis jetzt kann er die jeweilige Strecke nur darstellen. Der nächste Schritt wird sein, Fahrzeuge hinzuzufügen und diese dann auf der Strecke fahren zu lassen. Die dabei entstehenden Streckenbilder werden dem zuvor erklärten Programm zugeführt. Wenn sich zeigt, dass eine Echtzeitsteuerung möglich ist, werden als Input die Aufnahmen der Digitalkamera verwendet.
Mehr zu diesem Projekt hier.

Screenshot: