Racing Simulation - Embedded Electronics - Programming
Ziel unseres Projektes war es eine Bewegungsplattform zu entwickeln, welche in der Lage ist G-Kräfte auf den Aufbau zu simulieren. Solche Platformen werden vor allem zum Testen in Rennteams und zur Ausbildung von Piloten verwendet. Da diese Systeme jedoch oft sehr groß und extrem kostspielig sind, war es unser Ziel eine solche Bewegungsplatform für einen Rennsimulator zu entwickeln, die kompakt genug ist um diese in einem Wohnzimmer unterzubringen. Die Kosten sollten dabei ebenfalls in einem für Enthusiasten erschwinglichen Rahmen bleiben.
Um die maximale Neigung von 20 Grad und die nötigen Beschleunigungen, bei minimalen Lärm für einen authentische Simulation zu erreichen, basiert dies Plattform auf Elektromotoren, welche über Hebel und Gestänge die Plattform in Bewegung setzen. Alle für die Bewegungsplatform benötigten Daten werden aus der verwendeten Simulation ausgelesen und errechnet. Somit ist die Plattform in der Lagen mit wenigen Daten der Rennsimulation den vollen Bewegungsumfang von 6 Freiheitsgraden (6DOF) zu nutzen.
Ziel des Projektes war es Fahrdaten aus mehreren Rennsimulationen wie ProjectCars2, Assetto Corsa oder Dirt Rally auszulesen und durch diese die Lage und
Beschleunigungen des Fahrzeugs zu errechnen, um dadurch die Bewegungsplattform so zu bewegen, dass alle auftretenden G-Kräfte simuliert werden können. Dazu
wurde ein Konzept mit 6 Freiheitsgraden gewählt, welches Rotation und Translation um alle 3 räumlichen Achsen ermöglicht und so alle auf das Fahrzeug wirkenden
Kräfte nachstellen kann.
Um die Daten aus den Rennsimulationen auszulesen und weiter verarbeiten zu können, wurden das Konzept aus Grafik 1 realisiert. Alle Blöcke einer Farbe werden
dabei auf einen eigenen Rechner oder einem Mikrocontroller oder FPGA ausgeführt, da die Simulation des Rennwagens und die Umrechnung auf Beinlängen und Motorpositionen
sehr viel Rechenleistung benötigt.
Wie in Grafik 1 zu erkennen, werden die Fahrdaten, wie Beschleunigungen, Gas- und Bremspedalstellungen, Reifentemperaturen usw. über MQTT an den Visualisierungsrechner
über tragen, welcher ein C# und eine QT Darstellung ermöglicht. Diese beiden Möglichkeiten zur Visualisierung werden im Punkt Visualisierung noch detailierter
beschrieben. Das Modell der Plattform, welches wir was Prototyp und 'Proof of Concept' entwickelt haben, besteht aus 6 Modellbau-Servomotoren und einer 3D gedruckten
Plattform und ist maßstabsgetreu zu den Plänen der großen Plattform. Diese Plattform wird über eine serielle Schnittstelle angesteuert und basiert auf einem STM32 M0
Mikrocontroller, der die Servomotoren ansteuert. Auf der großen Plattform ist für die Kommunikiation UDP vorgesehen.
Somit wird es möglich für jeden Frame des Bildes der Simulation alle Daten auszulesen, zu verarbeiten und die Plattform entsprechend der errechneten Daten zu positionieren.
3 Freiheitsgrade erlauben nur drei der sechs, in der Grafik gezeigten Bewegungen. Somit können nur die rotatorischen Bewegungen genutzt werden. Diese eignen sich zwar gut um
dauerhafte G-Kräfte zu simulieren, jedoch können keine Stöße (z.B. Kollisionen) simuliert werden. Da die Simulation der Bewegung mit 6 Freiheitsgraden um einiges realistischer ist,
wurde dieser Ansatz gewählt.
Es gibt zwei Möglichkeiten die Motion Platform zu bewegen :
Pneumatik und Hydraulik wurden ausgeschlossen, da beide einen Kompressor benötigen, der in einem Innenraum eine große Lärmbelästigung bedeuten würde, während Linearaktoren entweder zu langsam oder zu teuer sind.
Zu Beginn des Projekts wurden Implementierungen von Plattformen mit Motoren analysiert um Eckdaten wie die Länge der Exzenter sowie die Kräfte und Geschwindigkeit der Motoren zu ermitteln.
Für eine realistische Simulation sollten die Beine ihre Länge um 20cm in beide Richtungen verändern können. Die Bewegung von der minimalen auf die maximale Länge sollte innerhalb
einer Sekunde abgeschlossen sein. Aufgrund dieser Anforderungen wurde eine Exzenterlänge von 20cm gewählt. Aus der Geschwindigkeitsanforderung wurde eine Motorgeschwindigkeit von
30RPM abgeleitet. Da durch die Bewegung der Plattform Kräfte von bis zu einem Kilonewton entstehen können, werden Motoren mit einem Drehmoment von 200Nm benötigt. Da die geforderte
Drehzahl jedoch relativ gering ist können Getriebe gemeinsam mit einem schnelleren schwächerem Motor genutzt werden. Um die Rückwirkung der Platform auf die Motoren, durch schnelles
Abstoppen oder langes Stillstehen, zu minimieren eignen sich hier Schneckengetriebe am besten. Mit einer Übersetzung von 1 zu 100 würde ein Motor mit 20Nm und bis zu 3000RPM benötigt.
Bei diesen Kräften ist es wichtig, dass der Ausgang des Getriebes einen Flansch bietet um die rotatorische Energie bestmöglich von der Achse abnehmen zu können. Weiters ist darauf zu
achten, dass der Ausgang des Lagers mit einem Axiallager versehen ist, da durch den Exzenter ebenfalls Kräfte in diese Richtung wirken.
Die Plattform sollte mithilfe von Aluprofilen und gefrästen Teilen gebaut werden, die Exzenter würden ebenso aus Aluminium gefräst.
Für das Testen der Anwendung wurde eine Modellplattform entwickelt, welche sich mechanisch möglichst maßstabsgetreu an die Spezifikation der späteren
Plattform hält. Um möglichst schnell ein Proof of Concept zu erzielen, wurde zunächst ein recht simples Modell bestehen aus einer Metallplatte
als Basis und einer Holzplatte als Plattform konstruiert. Die anfangs verwendeten Servomotoren wurden dabei lediglich mit
Kabelbindern an der Basis befestigt und wurde über eine selbst gelötete Platine mit Strom versorgt.
Da die Simulation von Bewegungen nur möglich ist wenn Bewegungsdaten ausgelesen werden können, ist es essenziell mehrere vielfältige Anwendungsbereiche zu unterstützen. Wir haben uns auf den Motorsport eingeschränkt, es ist aber durch den modularen Aufbau leicht möglich auch Flugsimulationen oder ähnliches anzubinden. Um trotz der Einschränkung auf den Motorsportsektor nicht zu Disziplinen abhängig zu sein und für jeden Hobby-Rennfahrer etwas zu bieten, ist die Plattform für die folgenden drei Simulationen-/Spiele-Typ.
ProjectCars und sein Nachfolger ProjectCars2 bieten optisch atemberaubendes Rennfahren mit zahlreichen verschiedenen original modellierten Fahrzeugklassen und Strecken. Obwohl dieses Spiel zwar eher als Mischung zwischen Simulation und Spiel gilt, sind viele wichtige Aspekte des Rennsports, wie Schadenssimulationen, Temperatursimulation der Reifen, Benzinverbrauch und Wettereinflüsse sowie Tag- und Nachtwechsel mitsimuliert. Das meiste Renngeschehen spielt sich jedoch auf dem Asphalt ab, da das Reifen- und Gripmodell nicht hundertprozentig realistisch ist.
Assetto Corsa ermöglicht es dem Fahrer wie in ProjectCars2 in viele Straßen- und Rennwägen seine Runden zu drehen, das Spiel baut aber statt zahlreichen Strecken und Fahtzeugen eher auf ein realistisches Reifenmodell und extrem realistische Fahrdynamik auf der Rennstrecke. Assetto Corsa ist deswegen eher für die fortgeschritteneren Hobbyrennfahrer geeignet, welche mehr Wert auf akkurate Simulation, als optische Effekte und Vielfalt legen.
Dirt Rally im Gegensatz zu den anderen Beiden Simulationen ist das perfekte Spiel für jeden Offroad Enthusiasten, der schon immer davon geträumt hat einmal bei einer Rally mit seinem
Co-Pilot über schwierige meist dreckige und verwinkelte Wege zu rasen. Hier wird großteils im Gelände mit originale Rally-Ikonen Gas gegeben.
Außerdem ist es mit der Schnittstelle von Dirt Rally möglich auch den Nachfolger Dirt Rally 2 und alle anderen Spiele des Herstellers Codemasters zu verwenden. Zu diesen anderen
Spielen zählt unter anderem die Formel 1 Kultserie des Herstellers mit der neusten Version 'F1 2019'.
Bei dieser Form der API erzeugt die Simulation einen Shared-Memory-Bereich, der in unserer Datenverarbeitung geöffnet werden kann. Dadurch hat das Programm direkten Zugriff auf alle Parameter
der Simulation. Um jedoch die Felder und den Aufbau dieses Bereichs korrekt identifizieren zu können, wird eine Schnittstellendefinition von Hersteller der API benötigt, welche meist nur schwer
oder nicht vorhanden für private Kunden erhältlich ist.
Im Fall von ProjectCars2 ist diese Schnittstelle jedoch öffentlich zugänglich, was sehr effizientes Auslesen aller Fahrdaten ermöglicht. Die Synchronisation des gemeinsamen Speicherbereichs
wird über eine Variable erreicht, welche auf einem ungeraden Wert steht solange die Simulation die Daten bearbeitet.
Die meisten Simulationen/Spiele bieten ein UDP API, wobei die Simulation den UDP-Server-Socket erzeugt und auf Anfrage des Clients, also der Positionsberechnung Datenpackete mit Fahrdaten sendet.
Diese Form der API ist weit verbreitet, da eine solche API unabhängig von Plattform, Architektur und Programmiersprache des Clients ist. Ein wesentlicher Nachteil jedoch ist die zusätzliche Latenz,
welche durch das Ver- und Entpacken von UDP Packeten zustande kommt. Zusätzlich können nur die Daten ausgelesen werden, die vom Hersteller für den Versand in fixen UDP Packetstruckturen vorgesehen
worden sind.
Ein wesentlicher Vorteil ist jedoch, dass sich der Client nicht am selben Host befinden muss und die Datenauswertung somit auch auf einem anderen Rechner stattfinden kann. Dadurch kann der Simulationsrechner
entlastet werden.
Solche eine UDP API wird von den Spielen Dirt Rally und Assetto Corsa verwendet.
Im Zuge des Debuggings der Modellplattform war es notwendig, die Bewegungsdaten aus dem Spiel mit den echten Bewegungen der Plattform zu vergleichen. Da sich die Daten jedoch mit 60 Herz aktualisiert werden und eine Unterbrechung der Berechnung, um die aktuellen Werte auszulesen, die Bewegung der Plattform verfälschen würde, wurde eine Qt Anwendung geschrieben, welche die relevanten Werte visualisiert. Die Daten werden dabei über MQTT von der Berechnung gesendet und von der Qt Anwendung empfangen. Konkret wurden, wie in der Grafik zu sehen, vier Liniendiagramme verwendet um die Beschleunigung, die Winkelgeschwindigkeit, die Orientierung des Fahrzeugs sowie die Benutzereingaben anzuzeigen. Im Zuge des Tages der offenen Tür wurde zusätzlich noch eine Bestenlistenfunktion implementiert. Die Rundenzeiten werden dabei ebenfalls über MQTT übertragen.
Die zweite Version der Visualisierung ist im Zuge der Lehrveranstaltung SAV (Softwarekonzepte und angewandte Visualisierung) und konzentriert sich, im Gegensatz zur Qt Implementierung, mehr auf die Anzeige jener Daten, die für den Benutzer interessant sind. Die Daten werden dabei, gleich wie bei der Qt Version, über MQTT übertragen und mittels WPF visualisiert. Dabei wurde, wie in der Grafik unten zu sehen, mehr auf die Visualisierung der relevanten Daten für den Benutzer geachtet. Im linken unteren Bereich der Applikation werden die aktuellen Benutzereingaben wie Gas- und Bremspedalstellung sowie der aktuelle Lenkeinschlag angezeigt. Daneben werden die farblich visualisierten Reifentemperaturen und der aktuelle Treibstoff angezeigt. Die beiden Diagramme darüber dienen zusätzlich zur Analyse der gefahrenen Runden. In der oberen Hälfte werden die Daten, welche von der MQTT Schnittstelle empfangen wurden, direkt angezeigt und aktualisiert. Diese Daten werden, nach dem Beenden einer Runde, in eine CSV Datei gespeichert und können statisch im unteren Diagrammbereich angezeigt werden. Dabei werden die Werte von Gas, Bremse, Lenkung sowie aktueller Gang und Geschwindigkeit visualisiert.
Microsoft Visual Studio war unser Hauptwerkzeug zum entwickeln der Software und wurde verwendet um das Datenauslesen aus den Spiele APIs zu implementieren(C++) und die Motorpositionen zu berechnen(C++).
Außerdem wurde Visual Studio eingesetzt um die C# Visualisierung der Fahrdaten zu entwickeln.
Um Simulationen der Stewart-Plattform mit verschiedenen Geometrien und Dimensionen durchzuführen, wurde MATLAB Simulink eingesetzt.
Vivado war das Tool unserer Wahl für die High-Level-Synthese für das Minized Board von Avnet, welches mit einem Xilinx FPGA ausgestattet ist. Dabei wurde die komplette Berechnung der Motorpositionen erfolgreich ins FPGA ausgelagert, was viel Rechenleistung und die Verwendung eines separaten Microcontrollers in der Plattform spart.
Fusion360 ist ein CAD Programm, welches verwendet wurde um die Modellplattform dreidimensional zu modellieren und später mit Hilfe von 3D-Druck zu fertigen. Mit Fusion360 wurden bis auf die Servos und alle mechanischen Befestigungsteile, wie Schrauben und Muttern, alle Teile der Plattform konstruiert.
Der QT-Creator wurde eingesetzt um die erste Version der Fahrdaten-Visualiserung zu entwickeln. Aufgrund von Synergien mit einem anderen Unterrichtsfach und größerem Wissen im Bereich C# und WPF wurde ab Version 2 auf Visual Studio umgestellt.
Um die Ansteuerung der sechs Servos in der Plattform zum bewerkstelligen, welche von einem STM32 M0 übernommen wird, wurde uVision von Keil verwendet.
Nachdem die 3D-Modelle von Fusion360 nicht direkt gedruckt werden können, wird eine Übersetzung auf Drucker-Code benötigt. Dafür wurde der Slic3r PE von Prusa verwendet, da auch auf einem Prusa 3D-Drucker gedruckt wurde.
KiCad wurde verwendet um eine Platine zu designen, welche alle nötigen Pins des Microcontroller Boards und des MiniZed FPGA Boards enthält und somit die Ansteuerung und Versorgung der Servos für beide Hardware Varianten bietet.
Als Versionierungssoftware wurde GitLab verwendet, welches auch gleichzeitig zum Organisieren des Teams, zum Planen des Projekts und zum Issue-Tracking verwendet wurde.