Erweiterung des Werkzeugkastens der Robotik: Physikalische Änderungen in Unity 2022.1


Simulieren Sie anspruchsvolle, umweltbewusste Roboter mit den neuen Tools für inverse Dynamik und Kraftsensoren. Erforschen Sie die Dynamik mit dem völlig neu gestalteten Physik-Debugger. Profitieren Sie von den Leistungsverbesserungen bei Interpolation, Batch-Abfragen und vielem mehr.
Der Physik-Debugger ist ein unverzichtbares Werkzeug, um das Innenleben der Physik-Engine zu verstehen und ein bestimmtes Verhalten in einem Projekt nachvollziehen zu können. Ein guter Debugger ist ein entscheidendes Werkzeug für die Erstellung überzeugender, moderner und reichhaltiger Physik. Zu diesem Zweck haben wir die Benutzeroberfläche (UI) komplett überarbeitet und einige interessante Funktionen hinzugefügt.
Um mehr Informationen auf demselben Platz unterzubringen, haben wir die Eigenschaften in Registerkarten gruppiert und diese dann um die neu hinzugefügten Eigenschaften erweitert.

Zuvor hatten sowohl Rigidbody- als auch ArticulationBody-Komponenten einen ausklappbaren "Info"-Abschnitt im Inspektor, den Sie erweitern konnten, um zusätzliche Informationen anzuzeigen, z. B. die aktuelle lineare Geschwindigkeit. Nach der Erweiterung verschlechterte sich jedoch die Gesamtleistung des Editors erheblich. Außerdem war es bisher kompliziert, die Parameter verschiedener Körper zu vergleichen, da man zwei Inspektorfenster öffnen musste. Um diese Probleme zu lösen, haben wir alle Eigenschaften auf die Registerkarte "Info" des Fensters "Physik-Debugger" verschoben, wo die Eigenschaften für jedes der ausgewählten Objekte angezeigt werden, so dass Sie sie leicht nebeneinander vergleichen können.

Die Kontaktpunkte können nun zusammen mit der Kontaktnormalen und dem Trennungsabstand visualisiert werden.

Physik-Abfragen wie Physics.Raycast oder Physics.CastSphere sind normalerweise Teil eines benutzerdefinierten Physik-Verhaltens, wie z. B. benutzerdefinierte Charakter-Controller oder Fahrzeug-Controller. Sie sind unsichtbar und schwer zu beheben. Zu diesem Zweck bietet diese Version eine optionale Visualisierung der Physikabfragen.

Bisher gab es in Unity Tools, die nur die so genannte Vorwärtsdynamik unterstützten: Bei einer Menge von Objekten und den auf sie wirkenden Kräften werden ihre Flugbahnen berechnet. Das ist zwar unglaublich nützlich, aber wir wollten unseren Robotik-Werkzeugkasten erweitern. Unity 2022.1 bietet nun Unterstützung für inverse Dynamiken: Bei einem Objekt und einer gewünschten Flugbahn können die Kräfte berechnet werden, die diese Flugbahn bei der Simulation verursachen.
Diese Arbeit wird sich über mehrere Versionen erstrecken, da wir sie iterativ ausbauen. In Unity 2022.1 stellen wir eine Reihe von Funktionen zur Verfügung, um die Komponenten der aktuellen Gesamtkraft zu berechnen, die auf ArticulationBodies ausgeübt werden und denen entgegengewirkt werden sollte, bevor die externe Kraft angewendet wird, um sie entlang der gewünschten Trajektorie zu bewegen. Weitere interessante Konzepte werden in späteren Versionen vorgestellt, wie z. B. die Gelenkkraft, die erforderlich ist, um dem vom Löser aufgebrachten Impuls entgegenzuwirken. Wir laden Sie ein, dies auszuprobieren und uns Ihre Meinung im Forum mitzuteilen.
Im Einzelnen handelt es sich um folgende neue Funktionen:
- die aktuelle Kraft, die der Antrieb auf den Körper ausübt. Es ist ein Indikator dafür, wie sehr ein Laufwerk versucht, das gewünschte Ziel zu erreichen. Sie hängt von der Steifigkeit und Dämpfung des Antriebs sowie von der aktuellen Delta-Zielposition und Delta-Zielgeschwindigkeit ab;
- die Gelenkkräfte zu ermitteln, die erforderlich sind, um den auf den Körper wirkenden Schwerkraft-, Coriolis- und Zentrifugalkräften entgegenzuwirken, und
- die zum Erreichen der gewünschten Beschleunigung erforderliche Gelenkkraft zu ermitteln.

Rigidbody verwendet sowohl Interpolation als auch Extrapolation, um den Eindruck einer gleichmäßigen Bewegung zu vermitteln, während die Simulation mit einer vergleichsweise niedrigen Frequenz erfolgt. Intern wird dies durch die Berechnung der Transform-Posen bei jeder Aktualisierung umgesetzt. Im Falle der Interpolation werden die letzten beiden simulierten Posen verwendet, um eine neue Transformationspose für dieses Bild zu berechnen. Im Falle der Extrapolation werden stattdessen die zuletzt simulierte Position und Geschwindigkeit verwendet. Da das System jedoch leichtgewichtig sein soll, geben wir diese Posen nicht an die Physik-Engine weiter. Die Posen werden nur den Systemen außerhalb der Physik (z. B. Grafik und Animation) präsentiert. Aus diesem Grund wird ein Raycast zum Beispiel einen Körper in der interpolierten Pose nicht erkennen.
Um zu verhindern, dass die Physik die Transformationsänderungen bemerkt, bestand der Mechanismus darin, dass ein Physics.SyncTransforms()-Aufruf jede Aktualisierung direkt vor dem Schreiben der Pose durchführt, gefolgt von einem internen Methodenaufruf, um alle Transformationsaktualisierungen für die Physik zu löschen. Dies führte zu zwei Arten von Problemen:
Wenn eine Szene mindestens einen interpolierten Körper hat, wurden alle Transformationsänderungen an allen Physik-Komponenten bei jedem Update mit der Physik-Engine synchronisiert (auch wenn sie meist nur einmal pro FixedUpdate benötigt werden); und
Wenn eine Änderung an einer Transformation vorgenommen wurde, die eine Rigidbody-Komponente mit Interpolation enthielt, brach die Interpolation für dieses Objekt ab, da die vom Benutzer vorgenommene Transformationsänderung an die Physik-Engine weitergegeben wurde und effektiv die zuletzt simulierte Pose änderte (die Pose wird nicht separat gespeichert - es ist nur die Pose, die die Physik-Engine derzeit verwendet).
Um diese Probleme zu beheben, haben wir den Interpolationscode so aktualisiert, dass er nicht alle Transformationen für jedes Bild synchronisieren muss. Diese Änderung verbessert auch die Leistung; der neue Interpolationscode läuft schneller als zuvor (abhängig von der Komplexität der Szene).
Ein Bereich des Forums ist der Diskussion verschiedener experimenteller Vorschauen von Physiktechnologien gewidmet, und einige der in dieser Version implementierten Änderungen stammen von dort:
- Viele Projekte, vor allem größere, verwenden oft viele GameObject-Ebenen, so dass die Matrix, die die Ebenenkombinationen beschreibt und Kontaktpaare für die Physik erzeugt, ebenfalls recht groß wird. In dieser Version werden die aktuell ausgewählte Zeile und Spalte hervorgehoben, um die Verwendung zu erleichtern.

- Ein Gelenk wird verwendet, um zwei Rigidbodies zu verbinden, und es definiert die Beschränkungen für ihre relative Bewegung. Ab Unity 2020.2 kann ein Gelenk auch verwendet werden, um einen Rigidbody mit einem ArticulationBody zu verbinden. Um dies zu ermöglichen, erhielt jede Joint-Klasse eine zusätzliche Eigenschaft, die im Inspector angezeigt wird. Die gleichzeitige Verknüpfung mit Rigidbody und ArticulationBody ist nicht möglich, so dass die Anzeige beider Optionen, wenn eine bereits festgelegt wurde, unnötig vertikalen Platz beansprucht. Jetzt wird nur noch die Eigenschaft angezeigt, die eingestellt wurde.

- Ein kinematischer Starrkörper ist eine besondere Art von Körper, der andere Körper beeinflussen kann, während er sich von anderen Körpern nicht beeinflussen lässt. In dieser Hinsicht ist er mit einem statischen Collider vergleichbar, mit der Ausnahme, dass er häufig bewegt werden soll. Typische Anwendungsfälle sind Figurensteuerungen, animationsgesteuerte Physik, Virtual-Reality (VR)-Simulationen von Handgelenken usw. Sie wird durch die Festlegung eines kinematischen Ziels gesteuert, das der Körper in nur einem Simulationsrahmen erreicht. Der Hauptunterschied zum statischen Collider besteht darin, dass das kinematische Ziel nicht durch sofortige Teleportation (Posenwechsel) erreicht wird, sondern durch die Berechnung der linearen und winkligen Geschwindigkeiten, die erforderlich sind, um das Ziel in einem Frame zu erreichen, und deren anschließende Übergabe an den Solver. Auf diese Weise kann die Bewegung korrekt zu den Zwangsbedingungs-Jakob-Matrizen beitragen, so dass jede angeschlossene Gelenkkette korrekt reagiert (keine Störungen). In dieser Unity-Version gibt es eine neue Methode, um sowohl die Position als auch die Rotation des kinematischen Ziels in einem Arbeitsgang zu setzen.
- Die Kontaktmodifikation, die in Unity 2021.2 eingeführt wurde, ermöglicht es, die Details der Kontaktpunkte zu ändern, die in der schmalen Phase generiert wurden, bevor sie zur Erstellung von Kontaktbeschränkungen für den Solver verwendet werden. In dieser Version fügen wir neue Getter für Körpergeschwindigkeiten in einem Kontaktpaar hinzu, für fortgeschrittene Anwendungsfälle wie dieses Beispiel der benutzerdefinierten anisotropen Reibung.
- Die PhysX-Version wurde auf 4.1.2 aktualisiert, die bisher letzte der 4.x-Reihe. Es handelt sich um eine kleinere Version, die nur kritische Fehler und Abstürze behebt. Die Versionshinweise sind hier verfügbar.
- Wenn sich ein dynamischer Körper mit einem Kollisionskörper überschneidet, versucht der Löser, einen korrigierenden Impuls zu finden, der die beiden Körper auseinander zieht und dabei alle Nebenbedingungen erfüllt. Intern wird dieser Impuls für jeden Kontaktpunkt eines Paares berechnet, aber wir hatten nur einen aggregierten Wert, der eine Gesamtsumme über alle Punkte ergab. Mit dieser Version stellen wir eine neue Eigenschaft der ContactPoint-Struktur zur Verfügung, die das Abrufen von Impulsen für jeden Kontaktpunkt ermöglicht.
- Wir beobachten aufmerksam das Feedback der Robotik-Community zur ArticulationBody-Komponente. Um die Erstellung und Anpassung des Verhaltens einiger kleinerer Roboterteile zu erleichtern, haben wir die Gelenkbegrenzungsgriffe im Bildschirmraum verankert, so dass sie nicht mehr die Kollisionspartner in der Szene verdecken.

- Physik-Batch-Abfragen waren das Ergebnis einer Unity-Hackweek und wurden direkt ausgeliefert, um bestimmte Anwendungsfälle zu ermöglichen, allerdings mit minimaler Funktionalität. Sie entwickeln sich weiter und bieten neue Funktionen, um noch mehr Anwendungsfälle zu ermöglichen, z. B. solche mit ausgefeilteren Threading-Mustern, und die Abfragetypen sind noch vielfältiger. In dieser Version können die Batch-Abfragen in jeder beliebigen Physikszene ausgeführt werden, und wir fügen einen neuen Batch-Abfragetyp hinzu(Physics.ClosestPointCommand).
- Damit ein Mesh mit MeshCollider verwendet werden kann, muss es zuerst gebacken werden. Das Backen ist ein teurer Prozess zur Herstellung der für die Kollisionserkennung erforderlichen räumlichen Suchstrukturen. Normalerweise geschieht dies implizit jedes Mal, wenn die Mesh-Eigenschaft eines MeshColliders geändert wird, und es läuft auf dem Haupt-Thread und blockiert jede weitere Arbeit, bis sie abgeschlossen ist. In Unity 2019.3 haben wir eine thread-sichere Methode eingeführt, um bei Bedarf das Backen außerhalb des Hauptthreads durchzuführen. Die Absicht war, anspruchsvollere prozedural generierte Meshes zu ermöglichen, da man nun die Inhaltsgenerierung und das Backen von Meshes jobben konnte, wodurch eine viel höhere Thread-Auslastung erreicht wurde. Ein besonderer Nachteil dieser Funktion war jedoch, dass sie nur das Backen mit den Standard-Garoptionen unterstützte. In dieser Version korrigieren wir dies, indem wir eine neue Variante von Physics.BakeMesh bereitstellen, die das Backen mit beliebigen Kochoptionen unterstützt.
Wir können es kaum erwarten zu sehen, was Sie mit den neuen Inverse Dynamics APIs und dem überarbeiteten Physics Debugger erschaffen! Laden Sie noch heute den neuesten Unity 2022.1-Build herunter und beteiligen Sie sich an der Diskussion im Robotik-Forum und im Forum für Physik-Vorschauen.
