Arma 3 Self Driving

Das Ziel war es eine Clientseitige Anwendung zu erstellen die LKW in Arma3 (HEMTT) fahren kann. Hierbei sollte nur die Spur gehalten werden. Features wie automatisches abbremsen in Kurven, Distanz zum Fahrzeug vor einem halten und an Kreuzungen abbiegen, habe ich bisher noch nicht weiter verfolgt.

Eine Inspiration und auch der Code für die erste Version stammt aus der Tutorial Reihe „Python Plays: Grand Theft Auto V“ von Sentdex auf Youtube https://www.youtube.com/playlist?list=PLQVvvaa0QuDeETZEOy4VdocT7TOjfSA8a

Da ich aber für Arma3 Programmiert habe und mein PC bei weitem nicht so gut wie seiner ist, habe ich den Code stark verändert und mich auch bei der zweiten Version für andere Bibliotheken und Herangehensweisen entschieden.

Die KI Das Neuronale Netzwerk

Die Grundstruktur ist ein „Deep Convolutional Neural Network“ Anfang habe ich eine Struktur eines image classifier genommen, dann aber recht schnell ein Script geschrieben, welches kleine teile des Datensets auf verschiedensten Variationen an Netzwerken Trainiert und so die Optimale Struktur für meinen Anwendungsfall raus findet.

UI

Die UI besteht aus einer Simplen GUI die ein paar hilfreiche Infos anzeigen.

  • Lenkrad
    • Dreh sich, um den aktuellen Lenk-Winkel anzuzeigen
    • Wird blau bei aktiviertem Autopilot
  • Balkendiagramm
    • Ist die „Confidence“ des Neuronalen Netzwerks für die jeweilige Lenkstellung, ganz oben heißt 100%, ganz unten 0%
    • Der Hell blaue Balken ist der mit der höchsten Confidence
    • Der Gelbe Punkt ist der Durchschnitt aller Lenkstellungen anhand der jeweiligen Confidence (weighted average)
    • Der Lila Punkt gibt die Aktuelle Lenkstellung an

Interface mit Arma 3

Eingabe:
Das Programm macht einen Screenshot vom Primärmonitor wo dann hoffentlich Arma3 zu sehen ist. Dieser Screenshot wird mit der CV2 Bibliothek runter skaliert, auf Graustufen reduziert und dann an das Neuronale Netzwerk weiter gegeben.

Ausgabe:
im Mangel einer besseren Lösung habe ich mich dazu entschieden einen virtuellen Controller zu Simulieren, hierfür gibt es eine Reihe an Möglichkeiten, ich habe mich für „VJoy“ (https://github.com/shauleiz/vJoy) entschieden. Nach der Installation des Programms, habe ich über die Python Bibliothek (https://github.com/tidzo/pyvjoy) die jeweiligen Inputs weiter gegeben.

Da ich Arma3 mit Maus und Tastatur spiele war es kein Problem einen Controller der Steuerung hinzu zufügen ohne mein normales Spielerlebnis zu beeinflussen.

Training

Ich zeichne einfach nur ganz normales Fahren auf, nutze dabei den Gleichen Bildausschnitt und die Inputs des Fahrers.

Beim normalen spielen nutze ich WASD zum fahren. Da die AI aber in „Schritten“ Lenkt, nutze ich einen Analogen Input. WASD Inputs zum Fahren zu simulieren, würde präzises Timing benötigen, was ich mir so sparen konnte.

Durch die Menge an Trainingsdaten die man benötigt, hat mir ein Freund beim aufnehmen geholfen. Hierfür mussten wir beide mit Controller fahren lernen, weshalb wahrscheinlich auch die Trainingsdaten nicht all zu perfekt sind.

Zwischenzeitig haben wir an einem Video Editor gearbeitet welcher die Trainingsdaten visuell darstellt und uns erlaubt bestimmte Segmente aus zu schneiden die uns nicht gefallen. Schlussendlich haben wir aber einfach nur ganz viel aufgenommen und gehofft, dass die Unreinheit der Daten, durch die große Menge kompensiert wird.