%---------------------------------------------------------------------------------------------------
% Analyse
%---------------------------------------------------------------------------------------------------
\newpage
\chapter{Gestenbeschreibung}
\label{sec:Gestenbeschreibung}
In diesem Abschnitt werden die von uns in der Analyse identifizierten Gesten näher beschrieben. Für jede Geste werden die Features definiert und die Klassifikationsstrategie aufgezeigt.
Folgende fünf Gesten wurden im Analysekapitel identifiziert. Diese müssen für unsere Anwendung erkannt und ausgewertet werden. 
\begin{itemize}
	\item Zeiger
	\item Daumenschalter
	\item Finger zusammenführen
	\item Richtungsbewegung
	\item Fingerkreisbewegung
\end{itemize}
\section{Zeigergeste}
\label{sec:AnhangZeigergeste}
Die Zeigergeste wurde bereits im Abschnitt \ref{sec:Zeigergeste} Klassifikation beschrieben. Es soll hier nur der Vollständigkeit halber noch einmal die verwendeten Feature, die Wahrscheinlichkeitsfunktion und ergänzend die für diese Geste erstellten Attribute beschrieben werden.

Als Feature werden für diese Geste die Länge $l_i$ des Abstandsvektors zwischen Handbody und jedes erkannten Fingermarkers ermittelt. Zusätzlich wird der dazugehörige Winkel $\alpha_i$ zwischen der Z-Achse des Handbodys und des jeweiligen Abstandsvektors bestimmt. Diese Features dienen als Ausgangsbasis zur Bestimmung des Wahrscheinlichkeitswertes ob maximal ein Finger nach vorne gerichtet ist und so die Zeigergestenhaltung eingenommen wurde. Abbildung \ref{fig:anhang_zeige_hand} zeigt die Zeigergestenhaltung mit dem Handbodykoordinatensystem und einem Abstandsvektor.

\textit{Die prototypische Umsetzung hat gezeigt, dass der Handbody auf der Handoberseite nicht mittig, sondern etwas versetzt liegt und dieses die Berechnung des Abstandsvektors etwas verfälscht. Daher wird vor der Berechnung des Abstandvektors die Position des Handbodys um einen konstanten, vorher mittels Kalibrierung bestimmten Vektor auf der X- und Y-Achse verschoben.}
\begin{figure}
	\centering
		\includegraphics[width=0.70\textwidth]{grafiken/Abstandsvektor.png}
	\caption{Abbildung der Zeigergeste}
	\label{fig:anhang_zeige_hand}
\end{figure}

Die zusammen gehörenden Features werden nun zu einem Merkmalsvektor $M_i(l_i;\alpha_i)$ zusammen gefasst und mit den Referenzvektoren verglichen.

Die zu der Gestenklasse gehörenden Referenzvektoren werden bei diesem Klassifikator vorher manuell festgelegt:\\
Alle Vektoren, bei welcher die Länge des Abstandsvektors $l_i$ über der Länge $l_{min}$ liegt und der Winkel $\alpha$ genau 0 Grad beträgt, stellen unsere Referenzvektoren dar. Bei diesen Vektoren wird die Wahrscheinlichkeit, dass es sich um die gesuchte Geste handelt, auf hundert Prozent gesetzt.

Die Anzahl der hier vorher definierten Referenzvektoren ist für die Erkennung relativ gering. Sie führen zu einer geringen Erkennungsquote und zu einem starken Gefälle bei der Wahrscheinlichkeitsbestimmung. (Es gibt nur 0\% oder 100\% Zugehörigkeit zur Gestenklasse.) Der Benutzer müsste genau eine der Längen und genau den Winkel treffen, damit die Geste akzeptiert wird. Das ist in der Praxis nur schwer möglich. Darüber hinaus unterliegt unser Modell, unsere Berechnungsmethode, sowie die eigentliche Messung, einer gewissen Ungenauigkeit, was zusätzlich zu einer geringeren Erkennungsquote führt. Um diese Punkte mit einzubeziehen und eine gewisse Toleranz bei der Eingabe durch den Benutzer zu erlauben, wird angenommen, dass die Wahrscheinlichkeit im Umkreis der Referenzvektoren nicht abrupt auf Null fällt, sondern kontinuierlich mit steigendem Abstand zu den Referenzvektoren abnimmt.


In unserem Klassifikator nutzen wir eine Funktion auf Basis von quadratischen Gleichungen, um eine nicht lineare Abnahme zu erreichen. Diese ist für unsere Zwecke ausreichend und leicht umzusetzten. Wir erhöhen also mit unserer Funktion die Erkennungswahrscheinlichkeit in der Umgebung unserer Referenzvektoren. Je nachdem wie tolerant die Anwendung ist, akzeptiert sie mit dieser Technik auch in der Nähe liegende Merkmalsvektoren und die dazugehörigen Gesten als Gesten dieser Gestenklasse.

Folgende Funktion dient zur Berechnung der Wahrscheinlichkeit der Zeigergeste:

\begin{center}
	\includegraphics[width=0.80\textwidth]{grafiken/Zeiger_Wahr_Funktion.png}
\end{center}
$l_{min}$ und $\alpha_{max}$ sind hierbei Stellparameter, mit denen die Toleranz der Erkennung eingestellt werden kann. Ein verringern von $l_{min}$ führt zur Akzeptanz von kürzeren bzw. nicht komplett ausgestreckten Fingern als Zeiger. Ein erhöhen von $\alpha_{max}$ führt dazu, dass Finger akzeptiert werden, welche nicht exakt parallel zur Hand-Z-Achse ausgerichtet wurden.

Die Werte für $l_{min}$ und $\alpha_{max}$ werden in unserem System mittels Schätzen und Training auf den Benutzer und die gewünschte Toleranz angepasst.
Ein möglicher resultierender Funktionsgraph mit $l_{min}$ = 100 und $\alpha_{max}$ = 15 Grad wird in Abbildung \ref{fig:Zeiger_Gebirge} dargestellt.
Die Berechnung der einzelnen Wahrscheinlichkeit findet für alle fünf Finger separat statt.

Da in unserem Modell der Zeigergeste nur ein Finger gestreckt sein soll, wird als zusätzliche Bedingung überprüft, ob nur ein Wahrheitswert über einem vorher definiertem Schwellwert $f_{min}$ liegt. Sollte keiner oder mehr als ein Wahrheitswert $f_i$ über diesem Wert liegen, wird die resultierende Wahrscheinlichkeit auf 0 gesetzt. Wenn nur ein Wahrheitswert darüber liegt, wird dieser einzelne Wahrscheinlichkeitswert an die Anwendungschnittstelle als Ergebnis der jeweiligen Klassifikation weitergeleitet.

Das Trackingsystem ist nicht in der Lage die einzelnen hier benutzen Fingermarker am Handschuh den jeweiligen Fingern zuzuordnen. Durch unseren Algorithmus wird die Geste immer erkannt wenn maximal ein Finger der Hand gestreckt ist, unabhängig davon welcher Finger. Die Geste ist also auch beispielsweise mit dem Mittelfinger möglich. Dieses wird für diese Anwendung akzeptiert, denn solch eine Durchführung der Geste ist zwar ungewöhnlich, führt jedoch zum eigentlichen Ziel der Interaktion, nämlich dem Zeigen auf einen Punkt mit einem Finger.

\textit{Bei ersten Tests, mit einer prototypischen Implementierung, wurde die Möglichkeit einen anderen Finger zum Zeigen verwenden zu können, vom Benutzer, nicht einmal bemerkt.}

Bei Akzeptanz der Geste werden die dazugehörigen Attribute von der Anwendung angefordert.
Mittels der absoluten Position des Handbodys und dem Abstandsvektor wird eine Gerade in den Raum gelegt und der Kollisionspunkt mit einer virtuellen Ebene, welche die Powerwall repräsentiert berechnet. Aus diesem Kollisionspunkt ergibt sich die relative X- und Y-Koordinate auf dieser Ebene. Diese errechnete Koordinate, sofern vorhanden, wird der Anwendnungsschnittstelle als Parameter übergeben und gilt als Punkt auf welche die Zeigergeste zeigt.

Das Berechnungsmodell und die dazu gehörige Koordinatenberechnung auf der Powerwall verfügt über eine gewisse Ungenauigkeit. Zum Beispiel variiert die Anatomie der Hand von Benutzer zu Benutzer etwas. Diese Ungenauigkeit wird in der Anwendung mittels eines Regelkreislaufs kompensiert. Der Benutzer bekommt dazu die errechnete Position auf dem Bildschirm angezeigt und korrigiert dieses durch stetiges Bewegen von Finger und Hand. Die Ungenauigkeit wird also, wie bei unterschiedlichen Bewegungsgeschwindigkeiten einer Maus auf unterschiedlichen Untergründen, durch unterbewusstes stetiges Anpassen durch den Benutzer korrigiert.
\section{Daumenschaltergeste}
\label{sec:Daumenschaltergeste}
Die Daumenschaltergeste wird in unserer Anwendung zusammen mit der Zeigergeste verwendet. Daher muss Sie sich von dieser klar unterscheiden lassen können. Für diese Geste wird sich die Eigenschaft zu nutze gemacht, dass nur der Daumen von der Handfläche nach oben weg abgespreizt werden kann. Das eigentliche Erkennungverfahren ist wie bei der Zeigergeste prinzipiell das Selbe. Auch hier wird eine Wahrscheinlichkeitsfunktion mit einem Abstandvektor und einem Winkel verwendet. Als Eingangsfeature wird bei dieser Geste jedoch der Winkel zwischen Abstandsvektor und \textbf{Y-Achse} des Handbodys übergeben und nicht der Winkel zwischen Abstandsvektor und der Z-Achse.
 
 
Die zur Berechnung der Wahrscheinlichkeit genutzte Formel ist mit der Formel der Zeigergeste identisch. Die Parameter $l_{min}$ und $\alpha_{max}$ werden hierbei an die Werte für den kürzeren Daumen angepasst.

Das für die Geste spezifische Attribut ist nur die Aussage ob die Geste erkannt wurde oder nicht.
\section{Finger zusammenführen}
\label{sec:FingerZusammenführen}
Diese Geste kann zum Greifen von Objekten, dem Wechsel in einen anderen Eingabemodus oder der Trennung unterschiedlicher Gesten dienen. Die Geste soll erkannt werden wenn die Fingerspitzen der Hand nah bei einander bzw. weit voneinander entfernt sind.

Als erstes werden die Abstände aller erkannten Fingermarker zueinander errechnet und die Summe gebildet. Es wird definiert, dass die Finger nah bei einander liegen wenn die Summe ein bestimmtes Minimum $s_{min}$ unterschreitet. Die Finger liegen weit auseinander, wenn die Summe ein Maximum $s_{max}$ überschreitet. Dazwischen liegende Werte führen zur Aussage, dass die Finger weder nah noch weit von einander entfernt sind. Die Werte für $s_{min}$ und $s_{max}$ müssen mittels Training und Kalibrierung für jeden Bnutzer einzeln bestimmt werden.

Die daraus resultierende Wahrscheinlichkeitsfunktion führt zu einer Art Treppenverlauf. (Abbildung \ref{fig:Fingerzusammenführen}) In den anderen Fällen haben wir diesen Verlauf mittels einer nicht linearen Funktion geglättet. In diesem Fall verzichten wir darauf, da in der Applikation eine "`sanfte"' Erkennung der Geste nicht unbedingt nötig ist.
\begin{figure}
	\centering
		\includegraphics[width=0.60\textwidth]{grafiken/Fingerzusammenführen.png}
	\caption{Treppenbildung}
	\label{fig:Fingerzusammenführen}
\end{figure}

\section{Richtungsbewegung}
\label{sec:Richtungsbewegung}
Diese Geste soll erkannt werden, wenn die Hand des Benutzers für eine bestimmte Zeit überwiegend in eine Richtung bewegt wird. Zum Vergleich dient dazu ein vorher definierter Referenzvektor. Eingesetzt wird diese Geste bei der Funktionsauswahl. Dort bewegt der Nutzer seine Hand in die Richtung der Funktion, welche er aufrufen möchte.

Um die Bewegungsrichtung zu Erkennen ermittelt die Anwendung immer aus zwei zeitlich folgenden Positionsdaten des Handbodys den Richtungsvektor der Hand. Der Winkel zwischen dem jeweiligen Richtungsvektor und dem Referenzvektor stellt die dazugehörige Abweichung dar. Dieser Winkel kann zwischen 0 und 180 Grad liegen. Mittels der folgenden Wahrscheinlichkeitsfunktion wird daraus die Wahrscheinlichkeit ermittelt mit der sich der Handbody in die gewünschte Richtung bewegt hat. Die jeweilige Wahrscheinlichkeit wird anschließend mit der Länge des jeweiligen Richtungsvektors ins Verhältnis zur Gesamtlänge aller Richtungsvektoren gesetzt. Dadurch hat ein kurzer Richtungsvektor nur einen geringen, aber ein langer Vektor einen großen Einfluss auf das Endergebiss.

Die Wahrscheinlichkeitsformel für das oben erläuterte Verfahren lautet:

\begin{center}
	\includegraphics[width=0.30\textwidth]{grafiken/Bewegungsformel.png}
\end{center}

$n$ ist die Anzahl zur Verfügung stehender Richtungsvektoren. \\
$\alpha_i$ ist der Winkel zwischen Referenzvektor und Richtungsvektor $i$ (0-180 Grad) \\
$l_i$ ist die Länge des Richtungsvektors $i$

Die Quadrierung stellt sicher, dass eine Bewegung entgegengesetzt des Referenzvektors die Wahrscheinlichkeit stärker senkt, als eine Bewegung in Richtung des Referenzvektors die Wahrscheinlichkeit erhöht. Dadurch ist eine Abweichung von der Sollrichtung im geringen Maße erlaubt, hat jedoch starken negativen Einfluss auf die Erkennungswahrscheinlichkeit.

Für die Berechnung werden alle Positionsdaten und dazugehörige Richtungsvektoren einbezogen, welche nicht länger als $t$ Sekunden in der Vergangenheit liegen. Dadurch wird die Dauer der Geste und der Berechnungsaufwand begrenzt.

Der errechnete Wahrscheinlichkeitswert wird abschließend an die Anwendungsschnittstelle weitergeleitet.
\section{Fingerkreisbewegung}
\label{sec:Fingerkreisbewegung}
Die Fingerkreisbewegungsgeste wird eingesetzt, um Werte in der Anwendung interaktiv einzustellen. Ein Beispiel ist die Lautstärke eines Videos.

Für diese Geste positioniert der Nutzer seine Fingerspitzen kreisförmig als ob er einen runden Drehregler halten würde. (Abbildung \ref{fig:Greifhand}) Anschließend bewegt er die Fingerspitzen, auf einer Kreisbahn um einen Mittelpunkt, nach Links oder Rechts. Es wird dadurch vom Benutzer dem System kein exakter Wert mitgeteilt, sondern ein bereits vorhandener Wert erhöht oder erniedrigt.

Die Geste wird erkannt, wenn sich die einzelnen Fingerspitzen, auf einer gemeinsamen Kreisbahn, in die selbe Richtung bewegen. Zur Erkennung der Geste müssen zwei Fragen beantwortet werden. Erstens, bewegen sich die einzelnen Fingerspitzen jeweils auf einer Kreisbahn mit einem für eine Hand realistischen Durchmesser? Und zweitens, bewegen sich die einzelnen Fingerspitzen um einen gemeinsamen Mittelpunkt? Die Beantwortung dieser Fragen, in Ihrer allgemeinen Form, ist sehr Komplex. Ein möglicher Ansatz ist die Nutzung einer Hough-Transformation für Kreise\footnote{http://de.wikipedia.org/wiki/Hough-Transformation} wie es in der Arbeit von \cite{Boetzer2008} beschrieben wird.

\textit{Bei der prototypischen Umsetzung mit dem Hough-Verfahren wurde festgestellt, dass der sich ergebene Rechenaufwand bei hoher Abtastrate recht hoch ist. Zur Vereinfachung wurde daher, der Radius des zu erkennenden Kreises fest definiert und die Kreisbewegung der Finger auf Bewegungen auf der globalen X-Y-Ebene beschränkt. Dieses führte zu einer starken Verbesserung der Erkennungsgeschwindigkeit.}

Die ganze Erkennung muss mit einer gewissen Toleranz versehen werden, da der Nutzer nicht in der Lage ist seine Fingernspitzen in einer exakten Kreisbahn zu bewegen. Durch diese Toleranz können kleine Bewegungen auf der Kreisbahn, wie hier bei der "`Kreisbewegung"'-Geste, und kurze, gerade Bewegungen in eine Richtung, wie bei der "`Richtungsbewegung"'-Geste, nur schwer von einander unterschieden werden. Daher muss die Anwendung entweder einen Mindestradius definieren, welcher zur Erkennung der Geste führt oder das parallele Erkennen der "`Kreisbewegung"'-Geste und "`Richtungsbewegung"'-Geste ausschließen.

Wenn die "`Kreisbewegung"'-Geste erkannt wurde, wird als Attribut der Drehwinkel, relativ zur Anfangsposition der Geste, an die Anwendung übergeben und daraus der neu einzustellende Wert errechnet.