Du hast das Kick-Off-Meeting verpasst oder möchtest bei den luhbots starten? Komm zum Teamtreffen: Soccer Mi 18:30Uhr, @Work: Mo 18:30 Uhr [Anfahrt]

Software

Das Team hinter der Softwareentwicklung

lasse

Sebastian Knackstedt

Firmware and Software Leader
IMG_3219

Fabrice Zeug

Navigation
final_version

Larissa Seegemann

Strategy
IMG_9036-2

Max Westermann

Strategy and AI
lasse

Tobias Pahl

Graphics
lasse

Robert Hart

Visualization
IMG_9050-2

Tim Füchsel

Tooling
Leon

Leon Koch

Interface
lasse

Oktay Heizmann

Analyzing

Übersicht

Die Software ist neben der Elektronik- und Hardwareabteilung der dritte Hauptbestandteil unseres Teams. Das allgemeine Ziel der Software ist einfach: Alle Informationen über den aktuellen Spielstand sammeln und die richtigen Befehle an den Roboter senden, um ein Tor zu erzielen. Aber wie kann ein Computerprogramm diese Funktionalität erfüllen? Um dies zu erreichen, ist unsere Software in verschiedene Module unterteilt, die jeweils unterschiedliche Ein- und Ausgänge haben.
Bevor wir zu den Modulen kommen, einige Informationen über die Software-Sprache und die Erstellungswerkzeuge: Derzeit verwenden wir C++20 ohne ein größeres Framework, um unsere Module zu implementieren. Wir bauen unsere Software mit CMake und Conan als Abhängigkeitsmanagement. Für die Grafik verwenden wir ein eigenes OpenGL-Rendering mit ImGui als GUI-Backend. Abgesehen von einigen externen Abhängigkeiten (wie protobuf oder asio) versuchen wir alles von Grund auf neu zu schreiben.
Um mit der Außenwelt (den Robotern und Kameras) zu kommunizieren, haben wir die Module „ssl_interface“ und „robot_interface“. Das „ssl_interface“-Modul empfängt die Daten der mitgelieferten Kameras und übersetzt die Bilder in unser eigenes Format. Außerdem liest es den Spielstatus und die Nachrichten von den Schiedsrichtern. Das Modul „robot_interface“ wiederum übersetzt Softwarebefehle in ein Format, das von unserer RF-Basisstation gelesen werden kann. Dies ist notwendig, um Daten direkt zu den Robotern zu schreiben und zu lesen.
Alle Informationen, die von verschiedenen Stellen kommen, müssen an einem einzigen Ort gesammelt werden. Dieser Ort ist der „game_data_provider“. Er enthält Methoden zum Filtern der eingehenden Daten und andere Funktionen, die es den anderen Modulen erleichtern, mit den Daten zu arbeiten. Für die Analyse der Daten gibt es den „Observer“, ein Analysewerkzeug, welches Informationen über den aktuellen Zustand des Spiels (Ballbesitz, Risikofaktor, Zielwahrscheinlichkeit) liefert.
Um zu berechnen, was jeder Roboter als nächstes tun sollte, verwenden wir eine künstliche Intelligenz (KI), die mit Hilfe von Reinforcement Learning trainiert wird. Dies geschieht im Modul „task_manager“. Das Modell erhält alle Informationen über das Spiel als Eingabeparameter und versucht, die beste Aufgabe für jeden Roboter zu finden, um das bestmögliche Ergebnis zu erzielen (d.h. das Spiel zu gewinnen). Das trainierte Modell wird in ein einsatzfähiges Format konvertiert und in der endgültigen Software in einer Tensor-Laufzeitumgebung verwendet.
Die Ergebnisse der KI sind Aufgaben, die dann ausgeführt werden. Das Hauptproblem hierbei ist die Bewegung, da die Roboter nicht miteinander kollidieren sollen. Dies wird im „localplanner“-Modell implementiert, welches die Bewegungen und das Verhalten des Roboters steuert.
Diese endgültigen Befehle werden wieder an den Roboter zurückgeschickt und das Grundgerüst ist fertig. Natürlich wäre es sehr schwierig eine solche Anwendung zu debuggen und deshalb schreiben wir gleichzeitig unser eigenes Visualisierungstool namens „luhviz“. „luhviz“kann alle möglichen Informationen über jedes Modul und jede Entscheidung der Software anzeigen.

Software Module

Strategie

Die Strategie ist der „intelligente“ Teil des Netzwerks und entscheidet, was als nächstes zu tun ist. Damit die Strategie entscheiden kann, was am besten getan werden soll, benötigt sie viele Daten. Diese Daten müssen aus allen am Netz anliegenden Eingaben gefiltert oder berechnet werden. Dafür haben wir ein Konzept zum Bewerten der Bedrohungsstufe entwickelt. Dieses "threat level" wägt ab, wie wahrscheinlich ein Gegentor oder ein Sieg des Gegners ist. Wenn der Gegner führt, ist die Bedrohungsstufe generell etwas höher und wenn wir führen dementsprechend niedriger. Ausgehend von dieser Bedrohungsstufe entscheiden wir, ob wir eher offensiv oder defensiv agieren.

Navigation

Die Navigation lokalisiert sowohl die Roboter als auch den Ball auf dem Spielfeld. Dazu werden sie als einzelne Koordinatensysteme in einem globalen Koordinatensystem gehandhabt. Diese Vorgehensweise erleichtert die Berechnung der Orientierung und Position zweier Roboter zueinander. Diese Daten können dann gleichermaßen von den Strategie- und den Navigationsmodulen verwendet werden. Das Hauptziel des Navigationssystems ist die Planung der bestmöglichen Route für einen Roboter, um das gewünschte Ziel zu erreichen.

Kommunikation

Das Kommunikationsmodul übernimmt die Kommunikation mit allen Instanzen außerhalb des Netzwerks. Es empfängt Daten und formatiert diese für die weitere Verwendung in unser netzwerkinternes Nachrichtenformat. Auf ähnlicher Weise konvertiert es auch interne Daten in das extern vorgegebene Format. Darüber hinaus fällt das Herstellen und Aufrechterhalten der Verbindung zu externen Geräten ebenfalls in den Aufgabenbereich des Verbindungsmoduls.