MÜMZ

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

MÜMZ "Multitouchtisch für multimedialen Zeitvertreib" ist ein Projekt des Fachbereichs efi im Sommersemester 2015. Ziel des Projekts war das Spiel Air-Hockey auf einem Multitouchtisch zu realisieren. Leider konnte das Spiel nicht in der Praktikumszeit umgesetzt werden, aber die Inbetriebnahme des Tisches ist erfolgt und mit einer Testanwendung erfolgreich gelaufen.

Einleitung

Für unser Projekt wurde ein Multitouchtisch zur Verfügung gestellt. Dieser Tisch musste erst einmal in Betrieb genommen werden. Technical-Paper

Gehäuse.PNG

Das Programm eines bereits abgeschlossenen Projekts Airhockey Air-Hockey-Spiel sollte als Grundlage dienen.

Konzept

Mümz prinzip.PNG

Die Kamera erkennt die Markerpositionen auf dem Tisch, welche über das TUIO Protokoll an unsere Software zur Auswertung und weiteren Darstellung gesendet werden

Spielprinzip

Konfiguration

Direkt nach Start des Spiels sollen über zwei unterscheidbare Marker max. 2 Spielern ein virtuell dargestellter, kreisförmiger Schläger zugewiesen werden, der für das Anspielen des Pucks vorgesehen wird.

Spielfeld

Das Spielfeld soll aus zwei Toren, einer Feldbegrenzungsumrandung und Feldmarkierungen zur Orientierung bestehen.

Spielablauf

Durch anspielen des Pucks mit dem Schläger wird dieser sich, ausgehend von Parametern wie Eintrittsgeschwindigkeit, -position und -beschleunigung der Schläger in Richtung Feldbegrenzung oder Tor bewegen. Der Spieler der als erster eine frei definierbare Anzahl an Toren erzielt hat, gewinnt das Spiel. Eine Highscore zur Veranschaulichung der erbrachten Leistungen war vorgesehen

Hardware

Aufbau

FTIR.PNG

Der Multitouchtisch beruht auf der FTIR-Technik.

Der Beamer projiziert das Bild über einen Spiegel auf eine Projektionsfolie, die auf der Plexiglasscheibe liegt. Das Beamerbild deckt leider nur die hälfte der nutzbaren Fläche des Tisches ab, da die Auflösung des Laptops nicht kompatibel zu den Abmaßen des Tisches sind. Die erste Folie mit diversen Knickschäden ist ausgetauscht worden, somit ist ein besseres Ergebnis mit der Auswertesoftware erzielt worden. Die Gummioberfläche zwischen Plexiglasplatte und Projektionsfolie soll zur angenehmeren Bedienung dienen, aber diese wurde eher als störend für das Bildergebnis empfunden. Dennoch wurde Sie beibehalten um den Aufbau nicht erneuern zu müssen. Eine zentrale Weitwinkelkamera nimmt die komplette Oberfläche auf. Die Kamera ist wahrscheinlich eine Schwarz-Weiß-Kamera, die auch den Infrarotbereich aufnimmt. Einstellbar ist nur die Schärfe der Kamera. Das Bild steht über einen Analog-Video-Anschluss zur Verfügung.

Software

Touchlib

Zuerst wurde die Auswertung der Bilddaten mit Touchlib unter Windows versucht. Dies führte jedoch zu keinem Erfolg, da die Kamera nicht erkannt wurde. Außerdem ist dieses Programm schon veraltet und es gibt mittlerweile performantere Lösungen. Also entschieden wir uns für das Programm CCV, einem Open-Source-Programm. Unter Windows war das Programm jedoch viel zu langsam und führte nach kurzer Zeit zum Absturz des Systems. Daraufhin nutzen wir das Programm unter einer Linux-Distribution.

CCV

Community Core Vision, CCV, ist eine open-source/cross-platform Anwendung für die Erkennung von Blobs auf einem Multitouchtisch. CCV nimmt das Videosignal als Eingang und gibt tracking-daten (z.B. Koordinaten oder Blob Größe) und Events (z.B. Finger druck, Bewegung und Finger hoch) aus, welche dann von einer Multitouch-Anwendung benutzt werden können. Desweiteren kann CCV mit einer Vielzahl von Webkameras und Videoaufnahmesystemen kommunizieren und kann sich auch über verschiedene Schnittstellen, z.B. TUIO, OSC und XML, mit anderen Anwendungen verbinden und unterstützt viele Multitouch Beleuchtungstechniken: FTIR, DI, DSI and LLP. CCV kann über http://ccv.nuigroup.com/ heruntergeladen werden. Wenn CCV gestartet wird, überprüft es jedesmal die angeschlossenen Kameras und nimmt, da wir einen Laptop verwendet haben, die Auflösung und Bildwiederholfrequenz der internen Kamera. Dies ist leider nicht sehr vorteilhaft, da die im Tisch integrierte Kamera nur eine niedrigere Bildwiederholfrequenz unterstützt. Somit war es am Anfang nicht möglich diese Kamera zu verwenden. Wir haben uns dadurch geholfen, dass wir ein Bash-Script geschrieben haben.

Bash-Skript

 #!/bin/bash
 cp config.xml ../Downloads/ccv-1.4.0-lin-64-bin/Community_Core_Vision/data
 cp calibration.xml ../Downloads/ccv-1.4.0-lin-64-bin/Community_Core_Vision/data
 cd ../Downloads/ccv-1.4.0-lin-64-bin/Community_Core_Vision
 sh clickToLaunchApp.sh

Durch dieses Skript wurde eine gespeicherte config.xml Datei beim Start mit den richtigen Parametern geladen. Somit war es uns möglich die interne Kamera auszuwählen ohne per hand die config.xml Datei jedesmal neu zu beschreiben.

   <CAMERA_0>
       <USECAMERA>1</USECAMERA>
       <DEVICE>0</DEVICE>
       <WIDTH>640</WIDTH>
       <HEIGHT>480</HEIGHT>
       <FRAMERATE>30</FRAMERATE>
   </CAMERA_0>
   <NETWORK>
       <LOCALHOST>xxx.xxx.xxx.xxx</LOCALHOST>
       <TUIO>1</TUIO>
       <TUIOPORT_OUT>3333</TUIOPORT_OUT>
       <TUIOFLASHPORT_OUT>3000</TUIOFLASHPORT_OUT>
   </NETWORK>

Wichtige Änderungen waren: DEVICE -> 0, FRAMERATE -> 30, TUIOPORT_OUT -> 3333, TUIO -> 1 (zum aktiveren des TUIO-Protokolls)

Die IP-Adresse muss auf den Empfänger abgestimmt werden.

Damit die Kamera die Blobs auch an der richtigen Stelle erkennt, muss man eine Kalibrierung vornehmen. Diese ist ein wenig "frimelig", da wir zuerst mit neun Punkten den ganzen Bereich abgedeckt haben und dies zwischen den Punkten zu großen Fehlern geführt hat. Nach einer Erweiterung auf 64 Punkte war die Erkennung von Fingern sehr gut und somit die Einrichtung abgeschlossen. Somit konnten nun Blobs erkannt und über das TUIO Protokoll zu unserer Anwendung weitergeleitet werden. Kalibrierungsdatei

Testanwendung

Da aus zeitlichen Gründen eine Fertigstellung des Spiels nicht möglich war entschlossen wir uns zur Inanspruchnahme einer webbasierten Testanwendung um die Funktionalität des FTIR Tisches und dem CCV sicherzustellen:

Testanwendung.PNG


C++ Projekt

Anfänglich wurde versucht das Referenzprojekt "AirHockey" welches in Form eines C++ Projekts, unter Einbindung des Open Frameworks und entsprechenden Erweiterungen zur Verfügung stand, auszubauen. Dies erwies sich jedoch aufgrund fehlender Bibliotheken für die Einbindung der TUIO API als nicht sehr vorteilhaft, zumal grafische Anpassungsarbeiten am Spielgeschehen in einer nicht sehr zeitgemäßen Programmiervariante erfolgen müssten. Deshalb entschlossen wir uns ein neues Visual Studio Projekt zu erstellen.

Visual Studio C# Projekt

Als Grundlage sollte das Spiel aus Klassen wie dem "Spielfeld", dem "HockeyPuck" und den "Schlaeger" bestehen, welche über entsprechende grafische Elemente zur Darstellung verfügen. Unsere Hauptklasse "AirHockey", die zur Verwaltung sämtlicher Inhalte dient würde übergeordnet von "Form , TuioListener" erben, um sowohl grafische Inhalte präsentieren, als auch TUIO Protokolle verarbeiten zu können VS2013-Projekt

Spielfeld Simulation

Airhockey.PNG

Spielfeld Auszug

 public void paint(Graphics g)
{
 g.FillRectangle(brush, 0, 0, TuioDemo.width, bandeDicke);
 g.FillRectangle(brush, 0, TuioDemo.height - bandeDicke, TuioDemo.width, bandeDicke);
 g.FillRectangle(brush, 0, bandeDicke, bandeDicke, TuioDemo.height - bandeDicke);
 g.FillRectangle(brush, TuioDemo.width - bandeDicke, bandeDicke, bandeDicke, TuioDemo.height - bandeDicke);
 g.DrawLines(pen, pointsTorLinks);
 g.DrawLines(pen, pointsTorRechts);
}

TUIO Protokoll

Für die Verarbeitung des TUIO Protokolls entschlossen wir uns für das Einbinden einer TUIO-API in das Visual Studio Projekt, welches diverse Schnittstellen zur Verfügung bereitstellt. Nach entsprechender Parametrierung der IP Adresse und des Ports ist es entsprechend möglich für bereitgestellte Events, diverse Parameter auszuwerten und umzusetzen

TUIO Auszug

 objectList = new Dictionary<long,TuioDemoObject>(128);
 cursorList = new Dictionary<long,TuioCursor>(128);
 this.puck = new HockeyPuck();
 this.spielfeld = new Spielfeld(5);
 client = new TuioClient(port);
 client.addTuioListener(this);
 client.connect(); 

Physik

Zur realistischen Kollisionsdarstellung der Schläger mit dem Puck ist eine Physikengine vorgesehen die als nebenläufiger Thread im Hintergrund parallel zur Hauptanwendung läuft, um in Echtzeit sämtlich relevanten Objekte auf Zusammenstoß, deren Geschwindigkeit, Postion etc. übeprüfen soll und eine entsprechende Bewegung des Pucks einleitet.

Physikausschnitt Feldbegrenzung

public void paint(Graphics g)
{
g.FillEllipse(red, (int)(xPos), (int)(yPos), (int)radius, (int)radius);
xPos += vX;
yPos += vY;
if(vX > 0)
{
  vX -= 0.01;
  if(vX < 0)
  {
    vX = 0;
  }
}
if (vX < 0)
{
  vX += 0.01;
  if (vX > 0)
  {
    vX = 0;
  }
}

Team

Ralph Glätsch, Jonas Stiegler, Stefan Ehehalt und Razvan Matis

Anhang

Hier sind alle Projektdateien (leider unvollstädnig aufgrund von Zeitmangel) hinterlegt: MÜMZ (Nur aus dem internen Hochschulnetz oder über VPN erreichbar)