Chrono in Unreal, Teil 3: Die Fallen

Software Projekte Agentic Engineering

Teil 2 hat die Architektur beschrieben. Dieser Teil ist die Liste der Dinge, die trotzdem schiefgingen, sortiert nach Thema, nicht nach Zeit. Jede Falle hat eine Ursache, die man verstehen kann, und die meisten hätten sich mit dem Wissen von jetzt vermeiden lassen. Das ist der Zweck der Liste.

Die Demo, um die es in der Serie geht. Auf YouTube in 1080p ist die Konsole lesbar.

Die Räder

Beim Schwimmen kippte das linke Vorderrad plötzlich auf 50 Grad Vorspur. Im Chrono® Zustand genauso wie im Bild, also kein Darstellungsproblem. Es waren zwei Ursachen übereinander.

Die erste: der Schaufelradschub der drehenden Räder griff entlang der X Achse der Radspindel an. Die Spindel dreht sich mit dem Rad, der Schub lief also einmal pro Umdrehung im Kreis und hebelte den Achsschenkel über den Totpunkt der Spurstange. Ein Vorzeichen oder eine Achse falsch gewählt, und die Kraft ist keine Kraft mehr, sondern ein Rührwerk. Jetzt ist die Schubrichtung das Kreuzprodukt aus Achsrichtung und Hochachse, unabhängig von der Raddrehung.

Die zweite: das Chrono Fahrzeug hat keinen Zuganschlag in der Federung und keinen Lenkanschlag am Achsschenkel, weil das Modell für Fahrten auf dem Boden gedacht ist, wo beides nie erreicht wird. Ein entlastetes Rad im Wasser hängt voll aus, und in dieser Stellung reicht eine kleine Störung, um die Lenkung durchschlagen zu lassen. Beides ist nachgerüstet: ein Zuganschlag als begrenzte Federkraft ab 41 cm Ausfederung, ein Lenkanschlag als begrenztes Drehmoment um den Achsschenkelbolzen ab 45 Grad, mit Dämpfung. Der Anschlag musste einmal von 35 auf 45 Grad, weil das kurveninnere Rad bei vollem Einschlag schon 45 Grad erreicht. Ein Anschlag, der die normale Fahrt einschränkt, ist kein Anschlag, sondern ein Fehler.

Und ein Versuch dazwischen, der die wichtigste Lektion des Tages war: ein Wasserwiderstand gegen das Raddrehen, als quadratisches Drehmoment auf die Spindel, liess die Simulation in Sekunden explodieren. Die Spindel ist leicht, das Moment war gross, bei 2 ms Schrittweite ist das ein steifer Term, den der Solver nicht hält. Regel seitdem: eigene Kräfte klein und mit Obergrenze, Drehmomente auf leichte Körper nur gedeckelt, und jede neue Kraft zuerst im Debugstart schwimmend prüfen.

Zuletzt ein Reset Absturz: die Akkumulatoren, über die eigene Kräfte auf Chrono Körper gehen, haben Indizes. Nach dem Neuanlegen des Systems zeigten die alten Indizes auf Körper, die es nicht mehr gab. Indizes zurücksetzen, wo das System zurückgesetzt wird.

Mit der Nase im Wasser: hier hing das entlastete Vorderrad voll aus und die Lenkung schlug durch

Die Automatik

Die Automatik in Chrono schaltet nach der Turbinendrehzahl hinter dem Drehmomentwandler. Auf losem Sand haben die Räder starken Schlupf und graben sich ein. Der Wandler sieht dabei kaum Last, aber hohe Eingangsdrehzahl vom Motor. Die Turbine erreicht den Schaltpunkt nie, der Motor hängt am Begrenzer bei 2570 Umdrehungen mit wenig Moment, das Fahrzeug bleibt stehen und wühlt sich tiefer. Erste Lösung: Getriebe im manuellen Modus, der Pawn schaltet nach Motordrehzahl.

Zweite Falle, umgekehrt: drehen die Räder auf der Düne frei durch, dreht die Turbine mit, und nach Motordrehzahl geschaltet geht es in den zweiten Gang. Dort fehlt die Untersetzung, die Turbine fällt unter den Rückschaltpunkt, und nach 0.8 Sekunden Sperrzeit kommt der erste Gang zurück. Das Log zeigte ein Pendeln zwischen erstem und zweitem Gang alle 0.8 Sekunden. Zwei Regeln haben es beendet: hochschalten nur, wenn die Turbine mindestens 90 Prozent des Schaltpunkts dreht, denn der nächste Gang hat 53 bis 75 Prozent der Übersetzung, und nur, wenn die Fahrgeschwindigkeit zum nächsten Gang passt, 16 km/h für den zweiten, 30 für den dritten. Das ist das Kickdown Verhalten eines realen Automaten.

Dritte: Wählhebelstellung 2. Auf dem Aufstieg begrenzt der Autopilot auf den zweiten Gang, wie ein Fahrer im Gelände. Die erste Version schaltete die Begrenzung nach dem Nickwinkel ein und griff damit auch auf der Sprungrampe, wo das Fahrzeug beschleunigen soll. Jetzt gilt sie nach Position, 25 Meter nach dem Dünenfuss bis kurz vor den Kamm. Eine Regel, die an einer Messgrösse hängt, die auch anderswo vorkommt, greift auch anderswo.

Dritte Falle, erst am zweiten Tag bemerkt: bei der Vollbremsung stand der Motor im HUD auf 75 Umdrehungen, während der Klang im Leerlauf weiterlief. Der Wandler zog den Motor mit den blockierten Rädern herunter, und der Wellenmotor von Chrono hat keinen Leerlaufregler; mit dem Pedal oben dreht er einfach aus. Ein proportionaler Gasanteil unter 900 Umdrehungen, höchstens 30 Prozent, hält den Leerlauf, und seit das ABS die Räder rollen lässt, kommt der Wandler gar nicht mehr in diese Lage.

Der Hang, auf dem die Automatik zwischen erstem und zweitem Gang pendelte

Trigger und Zeitbasen

Die Demo hat drei Uhren: die Weltzeit der Engine, die Simulationszeit von Chrono, die während des Startcountdowns steht, und das Alter der Drohne, das ebenfalls wartet. Drei Uhren sind zwei zu viel, aber jede hat einen Grund, und jede Falle in diesem Abschnitt kommt daher, dass ein Trigger an der falschen hing oder gar nicht sichtbar war.

Der Autopilot

Die Felsreihe unter dem Dünenkamm: der Autopilot muss links vorbei

Die Kamera

Die Verfolgerkamera stotterte über der Buckelpiste. Der erste Verdacht war die Bildrate, das Log sagte 17 ms Mittel, 20 ms Maximum, keine Ausreisser. Die Ursache war der Bodenabstand der Kamera: ein harter Mindestabstand, und jede Bodenwelle, die unter der Kamera durchlief, hob sie sofort an und liess sie wenige Bilder später wieder fallen. Jetzt ist der Anhebewert geglättet, schnell hinauf, langsam hinunter. Eine frühere Version derselben Kamera addierte den Bodenabstand jedes Bild erneut auf, bis sie im Orbit stand. Zwei Fehler, ein Mechanismus.

Die Buckelpiste: hier stotterte die Verfolgerkamera

Die Drohnenkamera zeigte immer wieder einen Ring im Bild. Vermutung des Kunden: der gefälschte Gimbal, und die Drohne hat den eigenen Rotor im Bild. Genau so war es. Der Rumpf neigt sich unter der fest auf dem Rumpf montierten Kamera, und bei Nick oder Roll schwenkte die halbdurchsichtige Rotorscheibe von oben ins Bild. Zwei Korrekturen: die Drohne filmt sich nicht mehr selbst, ihr eigener Actor ist für ihre Kamera ausgeblendet. Und der Gimbal hat jetzt Anschläge wie ein echter: er gleicht die Rumpfneigung nur bis 20 Grad Nick und 15 Grad Roll aus, darüber kippt das Bild mit dem Rumpf mit. Beim Backflip dreht sich das Bild einmal über Kopf, und das ist richtig so.

Der Steg

Auf dem Steg ruckelte es, nicht nach dem Eintauchen, sondern während der ganzen Auffahrt. Die Logzeile zeigte die Physik bei 15 ms pro Bild statt 8, die Grafikkarte unbeteiligt. Der Steg bestand aus 38 Planken, jede ein eigener starrer Körper mit Kollisionsbox, und die Reifen waren Dreiecksnetze mit einigen tausend Dreiecken. Vier Netze gegen 38 Boxen, jeden Schritt.

Der Vorschlag des Kunden war der richtige: etwas Unsichtbares drunter. Die Planken sind jetzt nur noch Bild. Gefahren wird auf einem einzigen unsichtbaren, festen Körper mit 18 langen Boxen entlang des Profils, 4.5 Meter, wo der Steg fast gerade ist, 1.5 Meter in der gebogenen Kante. Und die Reifen sind Zylinder statt Netze. Das Bodenmodell rechnet seine Strahlen gegen beides gleich, Einsinken und Traktion im Sand sind unverändert, die Physik liegt jetzt bei 7 ms. Sichtbare Geometrie und Kollisionsgeometrie sind zwei verschiedene Dinge, und die zweite darf so grob sein, wie es die Fahrt erlaubt.

Die Engine

Das Finale

Die zweite Hälfte der Demo, Nacht, Parasail und Drohne als Körper, hatte ihre eigenen Fallen. Die Modelle stehen in Teil 6, Teil 7 und Teil 8, hier nur, was schiefging.

Was daraus folgt

Drei Regeln, die den Tag überlebt haben:

  1. Jede eigene Kraft wird in Chrono Koordinaten formuliert, ist klein, hat eine Obergrenze und wird zuerst im Debugstart geprüft, der sie am härtesten trifft.
  2. Jeder Trigger hat eine Logzeile mit Start und Ende, und er gilt erst als funktionierend, wenn ein Screenshot zu seiner Zeit das zeigt, was gemeint war.
  3. Bei Ruckeln zuerst das Log lesen. Die Bildzeit sagt, ob es die Engine ist, und wenn sie es nicht ist, ist es fast immer eine Kamera oder eine Zeitbasis.

Der Klang, der nach anderen Regeln entsteht, ist Teil 4, die Modelle des Finales sind Teil 6 und Teil 7.

Schlüsselwörter: Project Chrono Unreal Fallen, Lenkanschlag Mehrkörpersimulation, Automatikgetriebe Simulation Sand, Wählhebel 2, Trigger Zeitbasis Simulation, Autopilot Fussgängererkennung, Kamera Stottern Bodenabstand, Unreal Engine 5.8 Plugin, Serious Gaming, Simulation Beratung Schweiz, swissEmbedded

Steckt eure Simulation in einer dieser Fallen? Wir finden die Ursache im Modell, nicht im Zufall, und bauen die Regeln ein, die sie beim nächsten Mal verhindern.

Kontaktieren Sie uns →

Unreal® und Unreal Engine® sind Marken oder eingetragene Marken von Epic Games, Inc. in den USA und anderswo; diese Artikel sind von Epic Games weder unterstützt noch geprüft. Project Chrono ist ein Open-Source-Projekt der University of Wisconsin-Madison und des Politecnico di Milano unter BSD-3-Lizenz.