Die Robotersimulation in Unity ist so einfach wie 1, 2, 3

Arbeitsabläufe bei der Roboterentwicklung basieren beim Testen und Trainieren auf Simulationen. Wir möchten Ihnen zeigen, wie Robotiker Unity zur Robotersimulation nutzen können. In diesem ersten Blogbeitrag einer neuen Reihe beschreiben wir einen gängigen Arbeitsablauf bei der Robotikentwicklung. Außerdem stellen wir eine Reihe neuer Tools vor, die die Robotersimulation in Unity schneller, effektiver und einfacher als je zuvor machen.
Da das Entwickeln und Testen von Anwendungen mit einem echten Roboter teuer und zeitaufwändig ist, wird die Simulation zu einem immer wichtigeren Bestandteil der Entwicklung von Roboteranwendungen. Durch die Validierung der Anwendung in einer Simulation vor der Bereitstellung auf dem Roboter können Sie die Iterationszeit verkürzen, indem potenzielle Probleme frühzeitig erkannt werden. Durch die Simulation können auch Randfälle oder Szenarien einfacher getestet werden, deren Test in der realen Welt zu gefährlich sein könnte.
Zu den Schlüsselelementen einer effektiven Robotersimulation gehören die physikalischen Eigenschaften des Roboters, die Szene oder Umgebung, in der der Roboter arbeitet, und die Software, die in der realen Welt auf dem Roboter läuft. Um valide Tests und Schulungen durchführen zu können, muss sichergestellt werden, dass diese drei Elemente der Simulation der realen Welt so nahe wie möglich kommen.
Eines der gängigsten Frameworks für die Entwicklung von Robotersoftware ist das Robot Operating System (ROS). Es bietet Standardformate für Roboterbeschreibungen, Nachrichten und Datentypen, die von Tausenden Robotikern weltweit für so unterschiedliche Anwendungsfälle wie die industrielle Montage, autonome Fahrzeuge und sogar Unterhaltung verwendet werden. Eine aktive Benutzer-Community steuert viele Open-Source-Pakete für allgemeine Funktionen bei, die die Entwicklung neuer Systeme vorantreiben können.
Robotiker entwerfen eine Roboteranwendung häufig als modularen Satz von ROS-Knoten, die sowohl auf echten Robotern als auch auf Computern eingesetzt werden können, die mit Simulatoren verbunden sind. In einer Simulation erstellen Entwickler eine virtuelle Welt, die den Zielanwendungsfall des realen Roboters widerspiegelt. Durch das Testen in diesem simulierten Ökosystem können Benutzer Designs schnell iterieren, bevor sie sie in der realen Welt testen und schließlich in der Produktion einsetzen.

Ein gängiger Workflow für die Robotik-Entwicklung, bei dem vor den Tests in der realen Welt Tests in der Simulation stattfinden.
Dieser Blogbeitrag veranschaulicht am Beispiel einer einfachen Pick-and-Place-Manipulationsaufgabe, wie Benutzer Unity für diesen Simulationsworkflow nutzen können.
Gemäß dem oben beschriebenen Arbeitsablauf besteht die Aufgabe unseres Roboters nun darin, einen Gegenstand aufzunehmen und an einem bestimmten Ort abzulegen. Als Roboterarm dient der sechsachsige Lernroboter Niryo One . Die Umgebung ist minimal: ein leerer Raum, ein Tisch, auf dem der Roboter sitzt, und ein Würfel (also das Zielobjekt). Um den Bewegungsplanungsteil der Aufgabe zu erfüllen, verwenden wir einen beliebten Satz von Bewegungsplanungs-ROS-Paketen mit dem gemeinsamen Namen MoveIt. Wenn wir bereit sind, mit der Aufgabe zu beginnen, senden wir eine Planungsanfrage vom Simulator an MoveIt. Die Anfrage enthält die Posen aller Gelenke des Roboters, die Pose des Würfels und die Zielposition des Würfels. MoveIt berechnet dann einen Bewegungsplan und sendet diesen Plan zur Ausführung an den Simulator zurück.
Nachdem wir nun das Problem definiert haben, gehen wir durch, wie Unity in diesem Simulations-Workflow verwendet wird.
Bei einer Robotersimulation wird eine virtuelle Umgebung eingerichtet – ein einfacher Raum wie in diesem Beispiel oder etwas Komplexeres wie eine Fabrikhalle mit Förderbändern, Behältern, Werkzeugen und Teilen – und dieser Umgebung wird eine virtuelle Darstellung des Roboters hinzugefügt, der trainiert oder getestet werden soll. Mit dem Unity Editor können endlose Permutationen virtueller Umgebungen erstellt werden. Aber wie können wir unsere Roboter in diese Umgebungen bringen?
Wenn wir einen Roboter in einer Simulation modellieren, müssen wir seine visuellen Netze, Kollisionsnetze und physikalischen Eigenschaften darstellen. Die visuellen Meshes sind erforderlich, um den Roboter realistisch darzustellen. Kollisionsnetze werden benötigt, um Kollisionen zwischen den „Verbindungen“ des Roboters – den starren Elementen, die Gelenke verbinden – und anderen Objekten in der Umgebung sowie mit sich selbst zu berechnen. Diese Netze sind normalerweise weniger komplex als visuelle Netze, um eine schnellere Kollisionsprüfung zu ermöglichen, die rechenintensiv sein kann. Schließlich werden physikalische Eigenschaften wie Trägheit, Kontaktkoeffizienten und Gelenkdynamik für eine genaue Physiksimulation benötigt, d. h. für die Berechnung, wie Kräfte auf die Verbindungen zu Änderungen des Roboterzustands, z. B. Haltung, Geschwindigkeit oder Beschleunigung, führen.
Zum Glück gibt es beim ROS-Entwicklungsworkflow eine standardisierte Möglichkeit, all diese Eigenschaften zu beschreiben: Universelles Roboterbeschreibungsformat (URDF). URDF-Dateien sind XML-Dateien, die es uns ermöglichen, diese visuellen, Kollisions- und physikalischen Eigenschaften in einer für Menschen lesbaren Auszeichnungssprache anzugeben. URDF-Dateien können auch Mesh-Dateien zum Festlegen komplexer Geometrien enthalten. Das folgende Beispiel zeigt einen Auszug aus der URDF-Datei für den Niryo One-Roboter.

URDF des Niryo One-Roboters
Um Robotikern das Importieren ihrer Roboter in Unity zu erleichtern, veröffentlichen wir URDF Importer, ein Open-Source-Unity-Paket zum Importieren eines Roboters in eine Unity-Szene mithilfe seiner URDF-Datei. Dieses Paket nutzt unsere neue Unterstützung für „Artikulationen“ in Unity, die durch Verbesserungen in PhysX 4.1 möglich wurde. Dieses Update ermöglicht es uns, die physikalischen Eigenschaften eines Roboters genau zu modellieren, um realistischere kinematische Simulationen zu erreichen.
Wenn dieses Paket im Unity Editor installiert ist, kann der Benutzer eine zu importierende URDF-Datei auswählen. Es analysiert die XML-Datei im Hintergrund und speichert die Links und Verbindungen in den entsprechenden C#-Klassen. Anschließend wird eine Hierarchie von GameObjects erstellt, wobei jedes GameObject eine ArticulationBody- Komponente ist, die eine bestimmte Verbindung im Roboter darstellt. Es weist Eigenschaften aus dem URDF den entsprechenden Feldern in ArticulationBody zu. Wenn Benutzer einen Roboter zu Unity hinzufügen, erstellt der URDF-Importer automatisch einen rudimentären Tastaturgelenk-Controller. Benutzer können diesen Controller mithilfe der ArticulationBody-APIs durch einen benutzerdefinierten Controller ersetzen.
Hier ist beispielsweise das Niryo One Unity-Asset, das nach dem Importieren der obigen URDF-Datei erstellt wurde.

Ein virtueller Niryo One-Roboter in Unity, importiert über URDF Importer
Nachdem sich der Roboter nun im Unity Editor befindet, sollten wir unseren Bewegungsplanungsalgorithmus testen, der in einer Reihe von ROS-Knoten ausgeführt wird. Um dies zu unterstützen, müssen wir eine Kommunikationsschnittstelle zwischen Unity und ROS einrichten. Unity muss Nachrichten an ROS weitergeben, die Statusinformationen enthalten – nämlich die Posen des Roboters, des Zielobjekts und des Zielorts – zusammen mit einer Planungsanforderung an den Mover-Dienst. Im Gegenzug muss ROS eine Trajektoriennachricht an Unity zurücksenden, die dem Bewegungsplan entspricht (also der Abfolge der Gelenkpositionen, die zum Abschließen der Pick-and-Place-Aufgabe erforderlich sind).
Zwei neue ROS-Unity-Integrationspakete erleichtern jetzt die Verbindung von Unity und ROS. Diese Pakete ermöglichen die Übermittlung von ROS-Nachrichten zwischen ROS-Knoten und Unity mit geringer Latenz. Bei einem Test auf einer einzelnen Maschine legte eine einfache textbasierte Nachricht die Reise von Unity zu einem ROS-Abonnenten in Millisekunden zurück und ein Bild im Format 1036 x 1698 in einigen hundert Millisekunden.
Da die Kommunikation in ROS ein Pub/Sub-Modell verwendet, besteht die erste Voraussetzung für die ROS-Unity-Kommunikation darin, dass in Unity Klassen vorhanden sind, die den ROS-Nachrichtentypen entsprechen. Wenn Benutzer das ROS-TCP-Connector Unity-Paket zum Unity-Editor hinzufügen, können sie mit dem MessageGeneration-Plugin C#-Klassen, einschließlich Serialisierungs- und Deserialisierungsfunktionen, aus ROS-MSG- und SRV-Dateien generieren. Das ROS-TCP-Connector-Paket enthält auch Skripte, die der Benutzer erweitern kann, um Nachrichten von Unity in einem ROS-Thema zu veröffentlichen, in Unity Nachrichten zu einem ROS-Thema zu abonnieren und ROS-Dienstanforderungen und -antworten zu erstellen. Auf der ROS-Seite kann ein ROS-Paket namens ROS-TCP-Endpoint einen Endpunkt erstellen, um die Kommunikation zwischen ROS-Knoten und einer Unity-Szene mithilfe dieser ROS-TCP-Connector-Skripte zu ermöglichen.
Sehen wir uns nun an, wie diese ROS-Unity-Integrationspakete für die anstehende Aufgabe verwendet werden. Zuerst verwenden wir die ROS-Unity-Integrationspakete, um einen Publisher in Unity zu erstellen, der die Pose-Daten über TCP an ROS sendet. Auf der ROS-Seite müssen wir einen ROS-TCP-Endpunkt einrichten, um diese Pose-Nachrichten zu abonnieren.
Als Nächstes erstellen wir in der Unity-Szene eine Schaltfläche „Veröffentlichen“ zusammen mit einem OnClick-Rückruf. Diese Rückruffunktion stellt eine Serviceanfrage an den MoveIt-Bewegungsplaner. Die Serviceanfrage umfasst die aktuelle Pose des Roboters, die Pose des Zielobjekts und den Zielstandort. Wenn MoveIt die Planungsanforderung erhält, versucht es, einen Bewegungsplan zu berechnen. Bei Erfolg gibt der Dienst den Plan zurück, d. h. eine Abfolge von Gelenkpositionen, und ein Unity-Skript führt die Flugbahn unter Verwendung der ArticulationBody-APIsaus. Andernfalls wird eine Fehlermeldung zurückgegeben.
Das folgende GIF zeigt eine Unity-Simulation des Niryo One-Arms, der die Pick-and-Place-Aufgabe erfolgreich ausführt.

Simulation einer Pick-and-Place-Aufgabe auf einem Niryo One-Roboter in Unity unter Verwendung von ROS und MoveIt zur Bewegungsplanung
Dieses Beispiel ist nur der Anfang. Entwickler können diese Demo als Grundlage verwenden, um komplexere Unity-Szenen zu erstellen, verschiedene Roboter hinzuzufügen und andere ROS-Pakete zu integrieren. Seien Sie gespannt auf zukünftige Beiträge, in denen es um die Integration von Computer Vision und maschinenlernorientierten Aufgaben in ein Framework für die Robotersimulation geht.
Diese Tools legen den Grundstein für eine neue Generation von Tests und Schulungen in der Simulation und machen die Verwendung von Unity für die Robotersimulation einfacher als je zuvor. Unser Team arbeitet hart daran, diese Anwendungsfälle der nächsten Generation zu ermöglichen, darunter maschinelles Lernen für Robotik, Sensormodellierung, Tests im großen Maßstab und mehr. Seien Sie gespannt auf unseren nächsten Blogbeitrag in dieser Reihe. Darin erfahren Sie, wie Sie ein visuelles maschinelles Lernmodell trainieren, um die Position des Zielobjekts bei der Pick-and-Place-Aufgabe abzuschätzen.
Beginnen Sie kostenlos mit unseren Robotersimulationstools. Schauen Sie sich unser Pick-and-Place-Tutorial auf GitHuban.
Weitere Robotikprojekte finden Sie im Unity Robotics Hub auf GitHub. Um zu sehen, wie unser Team das Trainieren von Computer-Vision-Systemen mit Unity vereinfacht, lesen Sie unsereComputer-Vision-Blogserie.
Weitere Informationen dazu, wie Sie mit Unity Ihre Anforderungen an die Robotersimulation erfüllen können, finden Sie auf unserer offiziellen Robotikseite.
Wenn Sie unser Team direkt mit Fragen, Feedback oder Vorschlägen kontaktieren möchten, senden Sie uns eine E-Mail an unity-robotics@unity3d.com.
