Sandkasten 2.0 – Ein Augmented Reality Praxisbeispiel
Nach Virtual Reality kommt Augmented Reality
Nach dem großen Hype um Oculus Quest und HTC Vive Pro scheint die Technologie endlich angekommen. Jeder, der sich schon fuchtelnd mit einer VR-Brille durch den Raum bewegt hat, kennt das Problem: Nur man selbst kann mit der virtuellen Welt interagieren. Darüber hinaus sind die Veränderungen innerhalb dieser Welt für Außenstehende nicht wahrnehmbar. Will man nun mit anderen Personen außerhalb der virtuellen Welt zusammenarbeiten oder bestimmte Fortschritte sichtbar machen, gibt es nur zwei Wege: Entweder, man reicht die VR-Brille reihum oder man hat mehrere der über 400€ teuren Gadgets zu Hand. Eine Alternative bietet dabei Augmented Reality (kurz AR oder auch erweiterte Realität). Doch gibt es in diesem noch sehr jungen Feld mehr als nur Pokémon Go? Tim Cook, CEO und Nachfolger von Steve Jobs, ist sich da sicher. Er bezeichnet es als das „next big thing“ (siehe VRGear).
Augmented Reality Sandbox
Die TH-Rosenheim hat bereits 2017 eine Augmented Reality Sandbox innerhalb eines Studentenprojekts realisiert. Das Konzept dahinter lässt sich wie folgt beschreiben:
Eine Box gefüllt mit Quarzsand nimmt mittels einer 3D Kamera (damals Microsoft XBOX Kinect) die Topologie des Sandes auf und verarbeitet die Höhendaten mithilfe der Spiele-Engine Unity zu einem eingefärbten Terrain. Daraufhin wird alles mittels eines Beamers wieder auf den Sand projiziert und reagiert auf die Manipulation des Sandes durch ständige Neuberechnungen.
In Version 2.0 sollte nun das Studentenprojekt mit State of the Art Hardware und Softwarelösungen überarbeitet werden (Anm. innFactory – Patrick Stadler, unser derzeitiger Bachelorand und ab März festangestellter Programmierer, war einer der Hauptentwickler der Version 2.0 – Im Team befanden sich außerdem Alexander Gebhardt, Johannes Nowack und Christian Kink. Das Projekt wurde von Tobias Gerteis, dem Leiter des Ro-lip an der TH Rosenheim, in Auftrag gegeben.). Als Ziel wurde der Austausch und Ersatz der XBOX Kinect angegeben, da diese nur ein 11-bit Tiefenbild mit einer maximalen Auflösung von 640×480 Pixel liefert. (Open Kinect Protocol_Documentation)
Das zweite Problem war die Verarbeitung der Tiefeninformation in ein von Unity lesbares Format, was zu starken Performanceproblemen und starken Verzögerungen nach Veränderungen des Sandes geführt hat. Als Lösung bat sich die D415 Intel RealSense Tiefenkamera an.
Diese bietet ein Stereo Tiefenbild mit einem minimalen Abstand von 16cm mit maximaler Reichweite von 10 Metern. Durch den Stereo IR-Sensor kann das 16-bit Tiefenbild mit einer Auflösung von bis zu 1280×720 Pixeln und einer Bildwiederholrate von bis zu 90 FPS ausgegeben werden. Ebenso wird ein Farbbild mit 1920×1080 Pixeln und einer Bildrate von 30 FPS zur Verfügung gestellt.
Unity Integration
Intel bietet für die D400er Kamera Serie einen Wrapper um das SDK, sodass eine direkte Unity Integration erreicht wird. Dieser Wrapper bietet mehrere Game Objekte, die per drag and drop in die gewünschte Szene in Unity gezogen werden können. Nachdem diese mit den eigenen Scripten verbunden wurden, kann in diesen Scripten wiederum mit dem Tiefen- und RGB Stream gearbeitet werden. Im folgenden Codebeispiel wird die rudimentäre Einbindung in ein Script gezeigt. Dabei wird dem Script das GameObjekt der Realsense in die Variable „RsDevice rsDevice“ von außen übergeben. Die Start() funktion wird von Unity beim Start des Scripts automatisch aufgerufen und bindet hier die „OnNewSample“ Funktion als Callback auf das „rsDevice“. Dadurch wird bei jedem neuen Tiefenbild diese Funktion mit selbigen als Argument aufgerufen.
Codesample:
Nach der Verarbeitung werden die Tiefeninformationen über eine Queue in den Haupthread von Unity übergeben, um die Heightmap auf das Terrain anwenden zu können.
Nachdem die Tiefenkamera ausgetauscht war, wurden folgende Punkte als erweiterte Ziele festgelegt:
- Computer Vision
- Dynamische Wegfindung
- Performanceoptimierung mittels Shader
Computer Vision
Mittels OpenCV wurde die Möglichkeit integriert, QR-Codes über den Farbbild Stream der Intel RealSense zu erkennen. Dies funktioniert über die Einbindung der C# Library von OpenCV in ein Script, das ähnlich wie oben im Codebeispiel gezeigt auf einen Stream zugreift, der dieses Mal jedoch das Farbbild und nicht das Tiefenbild liefern soll. Die OpenCV Library stellt eine QR Code Detektor Klasse zur Verfügung, welche den jeweiligen QR-Code auf dem Farbbild erkennt. Danach wird das erkannte Event zum QR Code über eine Queue an den Hauptthread übergeben, der daraufhin den Events zugehörige Aktionen ausführt.
Dynamic Pathfinding (Dynamische Wegfindung):
Für das Pathfinding stellt Unity als Game-Engine schon einige Bausteine, wie die Wegfindung und Navigation Agents (Gameobjekte, die selbst den Weg zu ihrem Ziel finden), zur Verfügung. Durch die ständige Änderung des Terrains reicht es nicht, wie andere Anwendungen ein statisches NavMesh zu erzeugen. Dies muss ständig aktualisiert werden, um auf die Verformung des Terrains reagieren zu können und den Navigation Agents eine Möglichkeit zu bieten einen Weg durch die aktuellste Version des Terrains zu finden. Das Navigation Mesh ist in der unteren Abbildung zu sehen. Es besteht aus einer Traversable Area also begehbaren (blau) und einer nichtbegehbaren (nicht gekennzeichnet) Fläche. Die begehbare Fläche wird für jeden Navigation Agent aufgrund seiner Parameter wie Radius, Höhe, Maximalem Anstieg des Terrains und maximaler Stufenhöhe berechnet. Das Video darunter zeigt ein Tiger Objekt, das einen Navigation Agent besitzt und sich auf dem Terrain in der Sandbox per dynamischer Wegfindung bewegt.
Performance Optimierung mittels Shader
Shader bieten die Möglichkeit, die Berechnung für Farbe, Position, etc. der einzelnen Polygone (in Unity Vertices genannt) von der CPU auf die GPU auszulagern. Die GPU bietet dank ihrer Fähigkeit parallele Berechnungen sehr effizient durchzuführen eine gute Möglichkeit die Performance bei der Einfärbung des Terrains stark zu erhöhen.
Unity stellt den Shader-Graph zur Verfügung, eine Graphische Oberfläche zur Bearbeitung des sonst sehr komplexen Shader Codes. Der Shader für die Einfärbung des Terrains kann in der unteren Abbildung betrachtet werden. Durch die Position (grüner Bereich) und der Texturen (blauer Bereich), die der LERP (Lineare Interpolation) Funktion als Eingangsparameter übergeben wird (roter Bereich) und durch diese Kombiniert werden, wird eine der Höhe entsprechende Ausgangstextur erzeugt, die auch fließende Übergänge zwischen den Texturen ermöglicht.
Augmented Reality – Ein Ausblick
Mit den Bauteilen, die dieses Projekt zur Verfügung stellt, können sehr viel komplexere Augmented Reality Themen in der Sandbox dargestellt werden. Als Beispiele können hier genannt werden:
- Visuelle Darstellung von Überschwemmungsgebieten
- Windsimulation
- Planung und Visualisierung von Terrainveränderungen in der Sandbox
- Spielebox für Kinder und Schulklassen, um Erdkunde interessanter zu gestalten
Augmented Reality bietet ein hohes Potential, da sie es ermöglicht kollaborativ in der realen Welt an virtuellen Dingen zu arbeiten und diese Veränderungen sofort wieder visuell darzustellen, ohne Brillen oder sonstige technische Geräte für jeden Nutzer kaufen zu müssen. Dazu bietet Unity eine exzellente Grundlage, um Projekte in diesem Feld umsetzen zu können.