Interactive Holographic Display

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche
BildPraesentation.jpg
Die grundsätzliche Idee des Teams war die positionsabhängige Interaktion einer Person mit einer Grafik oder Projektion. Weiterentwicklung davon ist der Gedanke dadurch auf einer 2-dimensionalen Projektionsfläche einen 3-dimensionalen Eindruck zu schaffen. Je nach Position soll also die richtige perspektivische Ansicht auf das Objekt wahrgenommen werden, wodurch, wie bei einer Art Sinnestäuschung, Tiefe und Dreidimensionalität simuliert wird.


Umsetzung

Hardware

Eingabegerät

Zur Aufnahme der Position wurde die Kinect gewählt, da sie bereits einiges an hilfreicher Software mitbringt und vor allem die für die exakte Positionsbestimmung zwingend notwendige Tiefeninformation ausgeben kann.

Verarbeitung

Zur Berechnung und Ausführung der Programme wird ein Laptop/PC angeschlossen.

Ausgabegerät

Zur Projektion auf eine geeignete Fläche wird zusätzlich noch ein Beamer verwendet. Dieser muss genau wie die Kamera im Aufbau fest installiert werden, da die Positionen vor allem in Verbindung miteinander im Programm berücksichtigt werden müssen um eine realistische Ansicht darzustellen.

Software

Kinect SDK

Diese Software dient der Verarbeitung der Koordinaten, die durch die Kinect aufgenommen werden. Sie berechnet daraus das Skelett, wovon später die Kopfkoordinate zur Verarbeitung weitergegeben werden soll.

OSC-Schnittstelle (mit OSCpack für C++)

Um die OSC-Schnittstelle in das C-Programm einzubinden, haben wir eine eigene Header-Datei mit dem nachfolgenden Quelltext in Visual Studio 2010 hinzugefügt.

#include "osc/OscOutboundPacketStream.h"
#include "ip/UdpSocket.h"

#define ADDRESS "localhost"
#define PORT 12000
#define OUTPUT_BUFFER_SIZE 1024
 
void sendOSCMessage(int skeletonNumber, float x, float y, float z) {
    UdpTransmitSocket transmitSocket(IpEndpointName(ADDRESS, PORT));

    char buffer[OUTPUT_BUFFER_SIZE];
    osc::OutboundPacketStream oscMessage(buffer, OUTPUT_BUFFER_SIZE);

    oscMessage << osc::BeginMessage("/KinectHeadCoordinates")
               << (int)skeletonNumber      		 
               << (float)x
               << (float)y
               << (float)z
               << osc::EndMessage;

    transmitSocket.Send(oscMessage.Data(), oscMessage.Size());
}
Änderungen im Kinect SDK Quelltext (C++)

In der Datei "NuiImpl.cpp" wurde nach langer Suche die Funktion "void CSkeletalViewerApp::Nui_GotSkeletonAlert( ) {...}" auf unsere Bedingungen umgeschrieben bzw. ergänzt.

// Creates variable and sets every loop the skeleton number to zero
int skeletonFound = 0;

for( int i = 0 ; i < NUI_SKELETON_COUNT ; i++ )
{
    // Show only the active Skeleton
    if(skeletonFound == 0)
    {
        // Show skeleton only if it is tracked, and the center-shoulder joint is at least inferred.
        if( SkeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED &&
            SkeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_SHOULDER_CENTER] !=
            NUI_SKELETON_POSITION_NOT_TRACKED)	
        {
            Nui_DrawSkeleton( bBlank, &SkeletonFrame.SkeletonData[i], GetDlgItem( m_hWnd, IDC_SKELETALVIEW ), i );
            bBlank = false;
        } 

        // Sends an OSC Message every loop with the Coordinates of the active Skeleton
        if(SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HEAD].x != NULL)
        {
            sendOSCMessage( skeletonFound++,
                            SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HEAD].x,
                            SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HEAD].y,
                            SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HEAD].z );
        }
    } 
}

Processing 
Processing osc.png

Mittels eines selbstgeschriebenen Programmes wurde ermöglicht, die OSC-Pakete wie im nebenstehenden Bild auszuwerten und uns anzeigen zu lassen. Ein weiteres Programm hat uns dazu gedient laufend OSC Daten an Blender zu verschicken so dass wir nicht immer die Kinect aufbauen mussten.






 


 


Blender   

Modelling   

Weiterhin wurde die gesamte 3D-Modellierung in Blender durchgeführt. Grundidee hierbei war, das Ohmzeichen in ein kleines „Karton“- Männchen zu verpacken. Dies wurde im Laufe der Zeit erweitert und Entwürfe für verschiedene „Ohmis“ entstanden. So wurden Vorlagen mit kleinen Erweiterungen und Accessoires für die unterschiedlichen Fakultäten entwickelt und teilweise modelliert.

Efifrau1.png Efifrau2.png Bwl2.png Bwl1.png







Scripting (Blender Game Mode) 
BlenderWindow.png

Mit Hilfe von Python Script, einer in Blender eingebundener Programmierplattform lassen sich z.B. bestimmte Verhaltensmuster von Kamera oder Objekt ganz leicht realisieren. Das für die Blenderversion 2.61 benötigte OSC-Library wurde uns höflicherweise von Herrn Brendel zur Verfügung gestellt. Im nebenstehendem Bild ist das komplette Script und die Logic ersichtlich. 


 






Aufbau

Aufbau.jpg

Beim Aufbau erfolgt die Projektion über einen an der Decke angebrachten Beamer, oder – wie in unserem Fall – über einen Kurzdistanzbeamer. Die Kinect wird auf einem Tisch unter der Projektion fest installiert, um sicherzustellen, dass der richtige Blickwinkel aufgenommen wird. Sie wird auf den Bereich, in dem sich der User später bewegen soll, ausgerichtet.


Bei der Beleuchtung ist zu beachten, dass sie auf der einen Seite nicht zu stark ist, so dass das Beamerbild nicht mehr richtig sichtbar ist, auf der anderen Seite aber auch nicht zu schwach ist und die Erkennung der Kinect erschwert.
Auch die Art der Lichtquelle ist wichtig. Es hat sich gezeigt, dass beispielsweise Neonröhren die Infrarotlicht-Messung stark beeinflussen.







Probleme

Während der Arbeit an dem Projekt sind natürlich einige schwierige Problemstellungen aufgetaucht, die verschiedene oder auch immer wieder neue Lösungsansätze erforderten. Beispielsweise ist die Verarbeitung der Daten in der Blender internen Game Engine problemlos lösbar, weshalb die Modellierung dann, statt wie anfangs geplant in Maya, auch in Blender durchgeführt wurde.
Des Weiteren war die Realisierung durch EyesWeb nicht wie geplant möglich, da in der aktuellen Version die Verarbeitung der Tiefenkoordinate noch nicht möglich ist.
Auch die Idee das gesamte Projekt mit Processing zu realisieren wurde schon bereits wegen der viel zu geringen Leistungsfähigkeit verworfen. Allerdings ließen sich damit Zwischenschritte wie z. B. die Visualisierung der Positionsdaten veranschaulichen.

Team

  • Einwich Verena
  • Haefner Mathias
  • Kiesel Lisa
  • Martin Jens
  • Paul Vanessa

Scripte, Source-Code, Blender-Files 

Da wir das Kinect SDK von Microsoft verwendet haben funktioniert leider unsere Lösung nur unter Windows 7 und Windows 8. Wir haben uns dazu entschlossen, da es wesentlich besser implemtiert ist als z.B. die Open Source Lösungen (man braucht auch nicht mehr die nervige Kalibrierungspose ;-) ). Des weiteren war bei dem SDK schon ein fertiges Beispielprogramm dabei, in das wir nur die OSC-Funktion hineingeschrieben haben.

Hinweis: Es muss zusätzlich zum Kinect SDK noch das Windows SDK installiert werden, da es für den Netzwerkverkehr der OSC-Implementierung benötigt wird.

Links der verwendeten Programme