Commit 2c5fe121 by Kai Westerkamp

more

parent abd16b54
Pipeline #335 passed with stage
in 54 seconds
......@@ -53,21 +53,21 @@ Je weiter das Objekt entfernt ist, desto ungenauer werden die Aufnahmen.
Im folgenden wurde ein Mindestabstand von 30cm und ein Maximalabstand von 90cm verwendet.
Als letztes filtern wir alle Flächen deren Oberflächennormale zu weit von dem Kameravektor abweicht (siehe Abb \ref{img:KinectSides} b)
Diese Flächen entstehen durch die Umwandlung des 2D Tiefenbildes in einer 3D Punktwolke. % in eine / einer Punktwolke ??
Diese Flächen entstehen durch die Umwandlung des 2D Tiefenbildes in eine 3D Punktwolke.
Die benötigten Informationen fehlen an dieser Stelle und Punkte werden auf die Fläche zwischen Oberflächenobjekt und Hintergrund gesetzt.
Diese Ebene stimmt nicht mit der wirklichen Oberfläche überein und @@@ müssen entfernt werden. %was muss entfernt werden? @@@
Diese Ebene stimmt nicht mit der wirklichen Oberfläche überein und diese falschen Punkte müssen entfernt werden.
Hierfür wird die Oberflächennormale verwendet.
Die Normale wird aus dem Tiefenbild geschätzt.
\begin{equation}
\begin{split}
dzXAxis = depthAt[x+1,y] -depthAt[x-1,y]\\
dzYAxis = depthAt[x,y+1] -depthAt[x,y-1] \\
Normale = Normalize(-dzXAxis,-dzYAxis,1.0)\\
dzXAxis = depthImageAt[x+1,y] -depthImageAt[x-1,y]\\
dzYAxis = depthImageAt[x,y+1] -depthImageAt[x,y-1] \\
Normale[x,y] = Normalize(-dzXAxis,-dzYAxis,1.0)\\
\end{split}
\end{equation} % @@@ depthAT wie Variablen setzen oder wie eine Funktion?
\end{equation}
Mit dem Skalarprodukt lässt sich der Winkel zwischen dem Kameravektor $(0,0,1)$ und der Normalen ausrechnen.
Ein maximaler Winkel von 65\degree hat in den Tests ein gutes Ergebnis geliefert. % @@@ Leertaste hinter \degree fehlt
Ein maximaler Winkel von 65\degree hat in den Tests ein gutes Ergebnis geliefert.
\todo{Quellen auf Kinect und Lighthose}
\section{Zusammenfügen von Frames}
......@@ -90,7 +90,7 @@ globalPosition = transformController * transformControllerToKinect * localPosi
\subsection{Kalibrierung Kinect zu Vive}
Eine wichtige Transformation ist die zwischen dem Koordinatensystem der Kinect und dem des Vive Controllers.
Ist zum Beispiel die Transformation entlang der X Achse der Kinect verschoben, so verstärkt sich der Fehler, wenn man das Objekt von der anderen Seite, also um 180\degree gedreht aufnimmt (siehe Abb, \ref{img:KinecOffset}). % @@@ Leertaste hinter \degree fehlt
Ist zum Beispiel die Transformation entlang der X Achse der Kinect verschoben, so verstärkt sich der Fehler, wenn man das Objekt von der anderen Seite, also um 180\degree gedreht aufnimmt (siehe Abb, \ref{img:KinecOffset}).
Der Fehler im lokalen Koordinatensystem wird in das globale transformiert und ist in dem Fall dann in genau entgegengesetzter Richtung.
\begin{figure}
......@@ -102,7 +102,7 @@ Der Fehler im lokalen Koordinatensystem wird in das globale transformiert und is
\end{figure}
In der offiziellen Dokumentation der Kinect ist beschrieben, dass der Ursprung von Punktwolken in dem Tiefensensor liegt (siehe \cite{KinectDoku}).
Leider fehlt die exakte Positionsangabe dennoch.
Leider fehlt die exakte Positionsangabe in dem Gehäuse.
Im Bild \ref{img:KinectOrigin} aus dem chinesischen Microsoft Forum ist eine von Benutzern vermessene schematische Darstellung der Kinect abgebildet.
Der Tiefensensor liegt hinter der kleineren runden Öffnung, aber Fertigungsungenauigkeiten lassen keine exakten Daten finden.
Für die Implementation wurde angenommen, dass er sich mittig hinter der Öffnung befindet.
......@@ -142,7 +142,7 @@ Der Versatz zwischen den Punktwolken ist leider nicht konstant und ändert sich
Das Vive Tracking ist hierfür ein Grund.
Vergleicht man mit einem 2m Zollstock die reale Distanz zu der in VR gemessenen dann wird daraus 1,98-2m virtuelle Distanz.
Die Distanz ist hierbei abhängig von der Orientierung zu den Basisstationen und der aktuellen Kalibrierung des Lighthous Tracking Systems.
Dieses Problem erschwert es, die Kalibrierung zwischen Vive und Kinect zu überprüfen, die zusätzlich für einen Versatz der Punktwolke verstärken kann. %@@@ der letzte Relativsatz ist unverständlich
Dieses Problem erschwert es, die Kalibrierung zwischen Vive und Kinect zu überprüfen.
Die Rotation der einzelnen Aufnahmen war kein Problem und hat keine sichtbaren Probleme produziert.
......
......@@ -17,14 +17,14 @@ animations ignored
\section{3D Tiles}
3D Tiles \cite{3DTiles} ist eine neue offene Spezifikation für das Streamen von massiven, heterogenen, geospatialen 3D Datensätzen.
Die 3D Tiles können genutzt werden, um Gelände, Gebäude, Bäume und Punktwolken zu streamen und bieten Features wie Level of Detail (LOD). %@@@ richtig korrigiert?
Die 3D Tiles können genutzt werden, um Gelände, Gebäude, Bäume und Punktwolken zu streamen und bieten Features wie Level of Detail (LOD).
Für die Arbeit wurde erwartet, das insbesondere LOD notwendig werden könnte, es wurde aber nicht verwendet.
\subsection{Tileset und Tiles}
Als Basis der 3D Tiles wird JSON formatiertes Tileset verwendet, das auf die eigentlichen Daten in Tiles verweist.
Das Tileset hat eine baumartige Struktur aus Tiles und deren Metadaten.
Jedes Tile hat hierbei ein 3D Volumen, das den geografischen Bereich beschreibt und einen geometrischen Fehler zur Echtwelt.
Außerdem können Kinder und deren Transformationen zu dem Elternteil angegeben werden. % @@@ Elterntile oder Elternteil?
Außerdem können Kinder und deren Transformationen zu dem Elterntile angegeben werden.
Alle Kinder liegen hierbei in dem Volumen des Elternknotens und können mit verschiedenen Datenstrukturen, wie K-D Bäumen Quadtrees oder ähnlichem die Region genauer spezifizieren (siehe Bild \ref{img:nonunifomQuad}.
Hierbei können die Kinder das Elterntile ersetzen (replace, z.B. ein genaueres Mesh) oder das bestehende Tile ergänzen (refine, zusätzliche Gebäude oder Details).
Die eigentlichen Daten der Tiles sind durch eine URL verlinkt und können dynamisch nachgeladen werden.
......@@ -48,7 +48,7 @@ Das kann zum Beispiel für Bäume genutzt werden.
\item[ Point Cloud]
Format um Punktwolken zu übertragen. Das Tileformat enthält einen kleinen Header mit allgemeinen Metadaten.
Danach folgt ein JSON String, in dem steht, welche Daten wie in dem Binärteil vorliegen.
Außerdem ist enthalten, ob Daten wie Postion und Farbe dabei sind und wie diese gespeichert sind. % @@@ stimmt meine Korrektur?
Außerdem ist enthalten, ob Daten wie Postion und Farbe dabei sind und wie diese gespeichert sind.
Die eigentlichen Daten werden als Binärdaten übertragen und können so ohne Parsen direkt in den Speicher und Grafikspeicher geladen werden.
\item[ Composite]
Tileformat zum gleichzeitigen Übertragen mehrerer einzelner Tileformate in einem. Es lässt sich zum Beispiel ein Batched3D Modell für Gebäude mit Instanced3D Modell für Bäume verbinden und als ein Tile überragen.
......
......@@ -13,8 +13,8 @@ Das Unreal Engine Materialsystem ist der vorgesehene Weg, um Shader zu implement
Im Stil der UE4 Blueprints lassen sich damit grafisch Materialien definieren, die von der Engine in zugehörige Shader umgewandelt werden.
\section{3D Tiles laden und vorbereiten}
Die Punktwolken könne als Array direkt geladen werden, jedoch lässt die Unreal Engien nicht zu, diese auch direkt auf die Grafikkarte zu laden und zu verwenden.
Als Alternative wurde das eindimensionale Buffer in eine quadratische 2D Textur umgewandelt. %@@@ das Buffer? Klingt außerdem nicht logisch 1D --> 2D...
Die Punktwolken könne als Array direkt geladen werden, jedoch lässt die Unreal Engien nicht zu, diese auch direkt als 1D Buffer auf die Grafikkarte zu laden und zu verwenden.
Als Alternative wurde der Array in eine quadratische 2D Textur umgewandelt.
Jeder Pixel der Textur besteht aus 3 Werten, jeweils einen für die 3 Farbkanäle Rot, Grün und Blau.
Ein Punkt im 3D Raum besteht ebenfalls aus 3 Werten für die Achsen X,Y und Z.
Um die Daten auf die Grafikkarte zu laden, codieren wir die Positionen in den Farbkanälen.
......@@ -70,7 +70,7 @@ Aus der Größe der quadratischen Textur und dem Index können die Texturkoordin
Mit den Texturkoordinaten kann die Position und die Farbe des Punktes ausgelesen werden.
Bevor die Position verwendet werden kann, muss diese aus dem Einheitswürfel in die wirklichen Koordinaten zurück transformiert werden.
Das Minimum und die Größe aus Gleichung \cite{eq:Bounding} der Vorbereitung lässt sich das einfach zurückrechnen. %@@@ Satz bitte prüfen
Die in der Vorberitung errechnete Größe udn das Minimum können verwendet werden um die Gleichung \ref{eq:Bounding} umzukehren.n
Anschließend fehlt nur noch die Translation und Rotation der Punktwolke in der Welt.
Auch hier lässt die Unreal Engine nicht zu, das direkt eine Matrix als Parameter für das Material übergeben werden kann, aber durch eine Postion und eine Rotation lässt sich die Transformation im Material ausrechnen.
Die berechnete Endpostion wird als WorldPositionOffset an die Grafikkarte weitergegeben, die damit den Punkt an die richtige Weltposition setzt.
......@@ -83,7 +83,7 @@ Deshalb werden größere Punktwolken in 2 aufgeteilt.
Bei kleineren Punktwolken werden die nicht verwendeten Quadrate verworfen.
\section{Ergebnisse}
Die resultierenden Punktwolken sehen gut aus und die in dieser Arbeite verwendeten relativ kleinen Punktwolken sind in VR visualisierbar. %@@@ sieht ``gut'' aus. Musst du konkret sagen was dir gefällt? Wissenschaftlicher Anspruch
Die resultierenden Punktwolken funktionieren für den Anwendungsfall und die in dieser Arbeit verwendeten relativ kleinen Punktwolken sind in VR visualisierbar.
Außer dem Deaktivieren von Schattenberechnungen wurden keine Performance Optimierungen vorgenommen.
Die Beispielwerte wurden mit einem i7 6700 und eine GTX 1070 aufgenommen. Eine genaue Analyse ist nicht erfolgt.
Eine Punktwolke mit 1596685 einzelnen Punkten erreicht ca 60fps (siehe Bild \ref{img:Pnts1}. Hierbei ist zu bedenken, das die ganze Quadchain von $2^20$ Punkten gerendert wird und überflüssige Geometrie erst im Shader/Material verworfen wird.
......
......@@ -2,7 +2,7 @@
\label{chapter:06Hololens}
Als Interaktion zwischen dem Experten in einer VR Umgebung und dem lokalen User wird die Microsoft Augmented Reality Brille HoloLens verwendet.
Die HoloLens bietet die Möglichkeit, Hologramme in die echte Welt zu projizieren.
Für die Interaktion zwischen VR und HoloLens wurde sich auf eine einfache beschränkt. %@@@ Scheiß Satz
Als Interaktionsmöglichkeit zwischen VR und AR wurde eine einfache Ausgewählt.
In VR wurde an einen Controller ein Laserbeam mit fester Länge befestigt.
Bei synchronisierten Welten zwischen VR und AR sollte dieser Strahl auch in der HoloLens an dem Controller hängen.
......
......@@ -73,12 +73,29 @@ Der Gesamtablauf der Evaluation erfolge immer im ähnlichen Ablauf.
Vor dem Test wurden der allgemeine Fragebogen ausgefüllt, das grundlegende Szenario erklärt und eine Beispielaufgabe an einem seperaten Turm erklärt.
Anschließen wurden die beiden Szenarien evaluiert.
Die Reihenfolge VR und Video und die Turmpaare wurden hierbei zwischen den Team gewechselt, sodass diese selber nicht die Messung beeinflussen.
Ein Team startet hierbei entweder mit dem Video Szenario oder dem VR Szanario und einem Turmpaar.
Beim 2. Szenaro wurden dann Rollen getauscht und das andere Turmpaar genutzt um die Ergebnisse nicht zu verfälschen.
Außerdem wurde darauf geachtet das beide Turmpaare in VR und Video verwendet wurden.
Nach jedem Szenario wurden die Fragebögen zu dem Test ausgefüllt. Hierbei wurden eigene Fragen, NASA-TLX und der User Experience Questionnaire (UEQ) verwendet.
Abschließend gab es noch einen weiteren Fragebogen mit einer allgemeine Frage und freien Kommentaren.
\section{Statistische verfahren}
Meißt Ordinale Daten ->median QUard
Zeitdaten metrisch Mittelwert udn Standartabweichung
Signifikanztest
Abhängig paaren aaka vr udn ar
unabhängig VR mit Video
pwert kleienr als 0.05 -> nullhpothesse verwerfen
%https://www.uni-siegen.de/phil/sozialwissenschaften/soziologie/mitarbeiter/ludwig-mayerhofer/statistik/statistik_downloads/signifikanztests.pdf
%http://www.methodenberatung.uzh.ch/de/datenanalyse/unterschiede/zentral/ttestunabh.html
In der Auswertung werden Boxplots verwendet. Hierbei ist die Kennzeichnung wie folgt:
\begin{description}
......@@ -604,6 +621,7 @@ boxplot/draw direction=y
\addBoxplot{\datatable}{0}{black}
\end{axis}
\end{tikzpicture}
\end{figure}
......@@ -611,7 +629,7 @@ boxplot/draw direction=y
\subsection{NASA TLX uind UEQ}
\todo{legend stad ver udn ar drunterzuschrieben}
\begin{landscape}
\begin{figure*}
......@@ -621,7 +639,7 @@ boxplot/draw direction=y
\pgfplotstableread{Charts/NASATLX.txt}
\datatable
\begin{axis}[
width = 25cm,
width = 24cm,
height = 0.8\textwidth,
boxplot/draw direction=y,
axis x line*=bottom,
......@@ -643,6 +661,9 @@ boxplot={draw direction=y, draw position={1+\plotnumofactualtype + floor((\plotn
cycle list={{red},{blue}},
% set `clip mode' to `individual' so the category labels aren't clipped away
clip mode=individual,
legend entries={VR Experte,AR Lokal,Video Experte,Video Lokal},
legend to name={legend},
name=border
]
\addBoxplot{\datatable}{0}{\colorVR}
......@@ -706,6 +727,8 @@ clip mode=individual,
\end{scope}
\end{axis}
%\node[below right] at (border.north east) {\ref{legend}};
\end{tikzpicture}
\end{figure*}
\end{landscape}
......
::set localPath=C:\Users\kaiwe\Desktop\TeXworks-win-0.6.2-201704300708-git_7ecce17
set localPath=..\..\TeXworks-win-0.6.2-201704300708-git_7ecce17
set localPath=C:\Users\kaiwe\Desktop\TeXworks-win-0.6.2-201704300708-git_7ecce17
::set localPath=..\..\TeXworks-win-0.6.2-201704300708-git_7ecce17
set ausarbeitungpath=.
start %localPath%\TeXworks.exe %ausarbeitungpath%\thesis.tex
start %localPath%\TeXworks.exe %ausarbeitungpath%\thesis.bib
......
......@@ -33,7 +33,7 @@
\newcommand{\dotp}[2]{\left\langle #1, #2 \right\rangle}
\newcommand{\dist}[2]{\left\| #1 - #2 \right\|}
\newcommand{\abs}[1]{\left| #1 \right|}
\newcommand{\degree}{$^{\circ}$}
\newcommand{\degree}{$^{\circ} $ }
%% -------------------------------
%% | Information for PDF file |
......
No preview for this file type
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment