Softwarepraktikum Oculus Rift und Copter WS 15/16

Ziel dieses Anfängerpraktikums war es, Aufnahmen von an einem Quadrocopter montierten Kameras möglichst in Echtzeit auf der Oculus Rift, einer Virtual-Reality-Brille, darzustellen. Betreut wurde das Praktikum von Christian Seitz und Dr. Susanne Krömker.

Motivation

Ein Stichwort in diesem Zusammenhang ist der sogennante „First Person View“ (FPV), welcher mit oben genannter Zielsetzung realisiert werden kann. An dieser Stelle muss jedoch ganz klar gesagt werden, dass das Tragen einer Videobrille bei der Steuerung eines Flugobjekts in Deutschland NICHT erlaubt ist, da so der direkte Sichtkontakt zum Flugobjekt nicht mehr gegeben ist.

Unser Gedanke war es, Stereo-Videosignale zu erzeugen und so Stereo-Vision zu ermöglichen.

Dabei soll Tiefeninformation aus digitalen Bildern gewonnen werden, indem die Szene von zwei verschiedenen Punkten betrachtet wird. Es werden zwei Kameras horizontal versetzt verwendet und die Differenz in horizontaler Koordinate der entsprechenden Bildpunkte ermittelt. Damit unser Gehirn die 3D-Information aus den beiden Bildern ermitteln kann, müssen diese überlagert werden. [Vgl.1]

Vorgehensweise

Der Ansatz: Stereo-Vision erreichen wir durch die Verwendung von zwei Kameras und einem Signal für jedes Auge. Dabei ist das Bild der linken Kamera für das linke Auge und das Bild der rechten Kamera entsprechend für das rechte Auge bestimmt.

Mit diesem Ansatz ging es zunächst um die Sichtung des benötigten Materials und die Frage, wie die Übertragung konkret realisiert werden soll. Es folgte die Aufstellung eines Kostenplans. Neben der Aktualisierung dieses Plans kam es noch zu weiteren Anpassungen. Darunter fielen besipielsweise Lötabeiten, um noch benötigte Kabelverbindungen herzustellen. Im nächsten Schritt ging es um die Programmierung und anschließende Tests. Testflüge haben zum jetzigen Zeitpunkt noch keine stattgefunden. Aus diesem Grund ist auf dem Titelbild (Quelle: Christian Seitz) nicht mein eigener Flug zu sehen.

Equipment

    copt cam rectrans grab oculus

Benötigt wurden...

  • Quadrocopter
  • 2 Kameras
  • 2 A/V Transmitter
  • 2 A/V Receiver
  • 2 Analog-Digital-Wandler /
    Video Grabber
  • Oculus Rift
  • Kabel, Adapter,...

Welche Kamera soll verwendet werden?

Da uns relativ schnell klar war, wie die Übertragung realisiert werden soll und die beiden Kameras den Hauptkostenpunkt ausmachten, war dies die Hauptfrage, welche wir uns in der ersten Phase gestellt haben. Das Entscheidungskriterium war das Preis-Leistungs-Verhältnis. Aber auch die Frage nach der Verstellbarkeit der Interpupilardistanz (IPD) spielte eine ausschlaggebende Rolle. Die IPD bezeichnet den Augenabstand. In unserem Fall ging es somit um den Abstand der beiden Kameralinsen.

Zur Außwahl standen zwei Varianten:

  • eine Einboard-Kamera, die NerdCam3D
  • die Verwendung von zwei einzelnen Kameras

Entschieden haben wir uns für die zweite Variante, da wir der Meinung waren, dass die Verwendung von zwei Kameras zum Einen das spannendere Projekt darstellen und zum anderen die Verstellbarkeit der Interpupilardistanz mehr Möglichkeiten für zukünftige Projekte bietet.
Auf dem Markt gibt es eine ganze Reihe von Mini-Videokameras. In der näheren Auswahl waren die Mobius ActionCam und die Xiaomi Yi Sport Cam.

Die Entscheidung fiel zugunsten der Mobius ActionCam aus, da diese ein gutes Preis-Leistungs-Verhältnis bietet. Die Xiaomi Yi Sport Cam war zwar vergleichsweise günstiger, hat aber laut mehreren Berichten in verschiedenen Foren Probleme mit dem Fokus, weshalb wir uns gegen diese Kamera entscheiden haben. Nach Betrachtung einiger Videos der Mobius ActionCam und der Xiaomi Yi Sport Cam hatten wir außerdem den Eindruck, dass die Mobius die bessere Bildqualität liefert. Wir haben uns auch gegen die Mobius ActionCam mit „Wide Angle C2 Lens“ entschieden, welche ein größeres Sichtfeld (FOV) ermöglicht, da dies für unsere Zwecke nicht erforderlich war.

Steckbrief: Mobius ActionCam

  • Videoauflösung: 1080p / 30fps, 720p / 60fps, 720p / 30fps [2]
  • Gewicht: 42g [2]
  • Abmessungen (L x B x H): 61 x 35 x 18 mm [2]
  • FOV: 90°(Linsenspezifikation) | 87° (Real) [2]
Quelle dieser Daten: http://www.mobius-actioncam.de/technische-daten/
Für weitere Informationen: https://www.mobius-actioncam.com/features/

Transmitter und Receiver

Bei den A/V Transmittern und Receivern haben wir darauf geachtet, dass deren Signal nicht mit der Fernsteuerung des Quadrocopters interferiert. In Deutschland ist entweder eine 2.4 GHz Frequenz mit maximal 10mW Sendeleistung oder 5.8 GHz mit maximal 25mW Sendeleistung erlaubt. Da die Fernsteuerung bereits mit 2.4 GHz arbeitet, verwenden wir für Sender und Empfänger 5.8 GHz. Außerdem wurden Rundstrahlantennen verwendet, da diese in horizontaler Ebene gleichmäßig in alle Richtungen strahlen.

Weitere Auswahl

Hier sieht man die verwendeten Teile in einfacher Ausführung. Zunächst wieder zu erkennen ist die Mobius ActionCam, welche am Copter montiert wird. Verbunden wird die Kamera dann mit dem in der Abbildung links danebenliegenden Sender. Dieser überträgt die Viedeosignale zum Boden. Das Kabel links unter dem Empfänger stellt die Stromversorgung sicher und das rechte Kabel die Verbindung zum Video Grabber, welcher das analoge Signal in ein digitales umwandelt und dem Notebook übergibt. Von dort gelangt das Bild dann auf die Oculus Rift.
Man sieht, dass die Kamera mit einem Chinch-Stecker verlötet wurde. Dies war lediglich für erste Tests vorgesehen, um so die Kameras direkt mit den Analog-Digital-Wandlern verbinden zu können.

Programmierung

Bei der Programmierung ging es zunächst darum, das eingehende Signal abzugreifen. Die zweite Frage war dann, wie das Bild anschließend auf die Oculus gelangt.

Was wurde verwendet?
  • OpenCV: Algorithmen für Bildverarbeitung und Machine Learning
  • Glfw & Glew: Fenster mit OpenGL Kontext erzeugen, Input und Event handling
  • Oculus SDK 4.4.0: Oculus Rift Software Development Kit

OpenCV wurde dazu verwendet die Kameras anzusprechen und die eingehenden Videosignale zu erfassen. Außerdem werden die decodierten Frames als n-dimensionales dicht besetztes Array gespeichert.
Glfw war nötig, um das Head Mounted Display (HMD), in unserem Fall die Oculus Rift, ausfindig zu machen und ein OpenGL Fenster auf diesem zu erzeugen. Des Weiteren ging es darum das Array in eine OpenGL Textur umzuwandeln.
Wir arbeiten mit Texturen. Daher geht es bei der Konfiguration zunächst darum, dass die größe der Textur auf welche gerendert wird, festgelegt wird. Es besteht die Möglichkeit auf eine einzige Textur zu rendern, sodass beide Augen sich eine Textur teilen und man separate Bereiche für jedes Auge definiert [3]. Die andere Möglichkeit ist, zwei einzelne Texturen zu verwenden [3]. Wie in [3] beschrieben, rendern wir die Szene auf eine "Render-Textur" und übergeben diese dann an das API. Ab diesem Zeitpunkt wird das Rendering der Verzerrung übernommen [3].

Distortion Rendering

Die Linsen der Oculus vergrößern das Bild, um ein sehr großes FOV zu ermöglichen [3]. Dies führt zu einer Verzerrung des Bildes (Pincussion Distortion) [3]. Um dem entgegenzuwirken, muss die Software nachträglich eine entgegengesetzte Verzerrung anwenden (Barrel Distortion) [3].

pincussion distrotion
barrel distortion

In der Main-Funktion finden zunächst diverse Initialisierungen statt. Dann wird die Oculus konfiguriert (Texturgröße bestimmt, FOV für jedes Auge gesetzt, „SDK rendering“ initialisiert und spezielle Rendering Informationen gesetzt).
In der Render-Loop wird das Frame processing gestartet und das nächste Frame eingelesen, dekodiert und als Array gespeichert. Dann wird das Bild ggf. noch gedreht. Anschließend wird das n-dimensionale Array in eine OpenGL-Textur umgewandelt und die Textur in dem für die Oculus passenden ovrTexture-Format gespeichert. Abschließend wird die Textur an den Framebuffer übergeben.

Testbilder

© Sarah Muller 2016
© Sarah Muller 2016
Testbilder (auf dem Notebook angezeigt)

Probleme

  • Kompatibilitätsprobleme Oculus SDK 0.8 auf Laptop unter Windows
  • Kompatibilitätsprobleme der Oculus unter Linux mit Intel® Graphikkarten
  • Kameraidentifikation bei Verwendung der Audio-Digital-Wandler
  • Verzögerung der Kameras

Ausblick

Als eine andere Herangehensweise bestünde die Möglichkeit Raspberry Pi zur Bilderfassung zu verwenden und dann über WLan zu streamen. Generell wäre es noch sehr schön Headtracking zu ermöglichen, sodass die Kopfbewegung an Servos gesendet wird, welche die Kamerabewegung steuern. Des Weiteren könnte man ein On-Screen-Display hinzufügen, welches zum Beipiel Flughöhe und Geokoordinaten anzeigt. Schließlich bestünde noch die Möglichkeit mit dem realisierten Stereo-View 3D-Modelle zu berechnen.

Über mich

Name: Sarah Muller
Studiengang: Angewandte Informatik (B.Sc.)
Fachsemester: 5
Universität: Ruprecht-Karls-Universität Heidelberg

top of the page


  • [1] Wikipedia. Computer stereo vision. [Online; accessed 07-November-2016] URL: https://en.wikipedia.org/wiki/Computer_stereo_vision
  • [2] mobius-actioncam.de. Technische Daten. [Online; accessed 07-November-2016] URL: http://www.mobius-actioncam.de/technische-daten/
  • [3] Oculus VR, LLC. PC SDK Developer Guide 0.4 - Rendering to the Oculus Rift. [Online; accessed 07-November-2016] URL:https://developer3.oculus.com/documentation/pcsdk/0.4/concepts/dg-render/
  • Quellen

    Bildquellen:

    Titelbild / Copter: © Christian Seitz

    Weitere Quellen:


    made by Sarah Muller, 2016