BOHMbing Ships

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche
BohmbingShips Titelbild.jpg

Das Projekt "BOHMbing Ships" wurde im Wintersemester 2019/20 von BEI-Studenten im Rahmen des Moduls INF2/2 unter der Leitung von Prof. Dr. Heinz Brünig erstellt.
Es handelt sich um eine interaktiv erweiterte Version des Spieleklassikers "Schiffe Versenken". Hier wird jedoch nicht mit Stift und Papier gespielt, sondern mit einem Ball auf ein von einem Beamer auf den Boden projiziertes Feld geworfen. Es gilt also nicht nur zu überlegen, auf welche Felder der Gegner seine Schiffe platziert haben könnte, sondern auch Geschicklichkeit beim Zielen zu beweisen.

Teilnehmer:
Christian Brosch, Jonas Fischer, Moritz Keilwerth und Johannes Maier

Motivation und Idee

Die Grundidee war, ein bekanntes Spiel interaktiv zu erweitern und den Aspekt Geschicklichkeit mit einzubringen. Außerdem sollte das Thema Bildverarbeitung im Zentrum der Entwicklung stehen. Nach Absprache mit Herrn Brünig wurde sich auf eine interaktive Version vom Klassiker Schiffe versenken geeinigt. Statt einfach nur mit der Maus auf ein Feld zu klicken, sollte ein Ball - also eine Bombe - auf das Feld geworfen werden, welcher von einer Kamera erfasst wird. Da die geworfenen "Bomben" im Vordergrund stehen, wurde als Name "BOHMbing Ships" - mit einer Referenz an die TH Nürnberg Georg Simon Ohm - gewählt.

Aufbau des Spielfelds

BohmbingShips Aufbau.jpg
Zentrale Steuereinheit des Systems ist ein PC, auf dem das Programm abläuft. Dieser ist per USB-Schnittstelle mit der Kamera, und per HDMI mit dem Beamer verbunden. Beide Geräte werden in einer erhöhten Position, am Besten an der Decke, angebracht. Während des Spiels projiziert der Beamer nun das Spielfeld auf den Boden und die Kamera detektiert, wenn ein Feld mit der Bombe getroffen wurde.

Verwendete Komponenten

Hardware:
- PC
- Kamera: Theoretisch kann jede beliebige Kamera verwendet werden, bei welcher der Autofokus deaktiviert werden kann und die Mindestauflösung bei 640 * 360 liegt (das Programm arbeitet mit dieser Auflösung). Am besten sollte zusätzlich die Belichtung angepasst werden können. Getestet wurde das Programm mit einer "Logitech pro 9000", die mit Hilfe der "Logitech Webcam Software" konfiguriert wurde.
- Beamer: Geeignet ist jeder Full-HD-fähige Beamer, der mit einem PC verbunden werden kann.
- Bombe: Es kann jedes handgroße Objekt mit hellroter Farbe verwendet werden. Im Rahmen des Projekts wurde ein handelsüblicher Luftballon mit Reiskörnen gefüllt, bis er eine handliche Größe hatte. Die groben Reiskörner bewirken, dass die Bombe möglichst schlecht rollt und am getroffenen Feld liegen bleibt, um ein besseres Zielen zu ermöglichen. Zu Demonstrationszwecken wurde die Bombe im folgenden Bild geöffnet.
BohmbingShips Bombe.jpg

Software:
- OpenFrameworks v0.10.1_vs2017
- Addons: ofxCv (hierfür müssen Addondateien separat heruntergeladen werden), ofxOpenCv und ofxGui
- IDE: Visual Studio 2017
- Treiber für die Kamera

Der Spielablauf

Das Grundkonzept war, eine farbige Bombe auf ein vom Beamer projiziertes Spielfeld zu werfen und mithilfe der Kamera zu detektieren, welches Feld getroffen wurde.

Kalibrierung

Zu Beginn muss über den PC die Kalibierung durchgeführt werden. Diese ist nötig, da Beamer und Kamera nicht immer beide senkrecht auf den Boden gerichtet sind. Diese so entstehende Verzerrung muss mittels Einsatz von Homographie herausgerechnet werden. Somit kann die von der Kamera erfasste Bombe einer Spielfeldkoordinate zugeordnet werden.
Falls die Kamera während des Spiels verschoben wird, lässt sich über den PC jederzeit die Kalibierung erneut durchführen, ohne das laufende Spiel abzubrechen.

Platzieren der Schiffe

BohmbingShips Platzieren.jpg
Es gibt 4 Schiffarten:
- einen Flugzeugträger (5 Kästchen)
- ein Schlachtschiff (4 Kästchen)
- zwei Kreuzer (je 3 Kästchen)
- drei Zerstörer (je 2 Kästchen)
Diese können horizontal oder vertikal auf dem 10x10 großem Spielfeld platziert werden. Dabei gelten die klassischen "Schiffe-Versenken"-Regeln. Die Schiffe werden per Drag&Drop mit der Maus am PC gesetzt. Zuerst für den linken, dann für den rechten Spieler.

Abwerfen der Schiffe

BohmbingShips Abwerfen.jpg
Nach dem Platzieren beginnt das eigentliche Spiel. Nun werden beide Spielfelder nebeneinander angezeigt. Das Feld auf das gerade geworfen wird, wird etwas heller dargestellt. Nun wird der Ball abwechselnd geworfen. Je nachdem, was getroffen wurde wird entweder eine Schaumkrone (Kein Treffer), ein Kreuz (Treffer), oder ein brennendes Schiff (Versenkt) dargestellt.

Spielende

BohmbingShips Ende.jpg
Wenn alle Schiffe von einem Spieler zerstört wurden, so ist das Spiel beendet. Dies wird dadurch angezeigt, das auf dem Verliererfeld "All Ships destroyed", und auf dem Gewinnerfeld "Survived" angezeigt wird. Das Spiel kann nun per Eingabe am PC von vorne gestartet werden.

Das Programm

Im folgenden wird der Aufbau des Programms sowie die wichtigsten Elemente der interaktiven Steuerung vorgestellt. Das Programm kann unter Downloads heruntergeladen werden.

Klassendiagramm

Als Grundlage für die Entwicklung der Software wurde folgendes Klassendiagramm gewählt. Es Ist grob in drei Teile zu gliedern: Die Verarbeitung der Eingabe, die Spiellogik und die Ausgabe. Die Kalibrierung und die Anzeigefenster sind ihnen übergeordnet. Da mehrere Personen gleichzeitig an dem Projekt gearbeitet haben, gibt es zu jedem der drei Hauptmodule eine Dummy-Klasse, in welcher Test-Code eingetragen werden kann, um ein anderes Modul zu testen. Erzeugt werden die Dummy- bzw. die richtigen Objekte in einer Builder-Klasse. Hier kann folglich eingestellt werden, ob ein Dummy-Objekt oder das richtige Objekt erzeugt werden soll.
Angebunden an den Engine von OpenFrameworks werden die drei Module über die draw() bzw. update() Methoden. Diese werden zyklisch vom Engine aufgerufen und an die Module weitergeleitet. Der Informationsfluss startet in der Eingabeklasse. Sie erkennt, ob eine Bombe geworfen wurde. Sie gibt die ermittelten Koordinaten weiter an die Spiellogik, die auswertet, ob ein Schiff getroffen, versenkt oder daneben geworfen wurde. Anschließend wird die Ausgabeklasse über mögliche Änderungen informiert. Da einige Inormationen, wie z.B. die Positionen der Schiffe in der Logik gespeichert sind, und die Ausgabeklasse die Aufgabe hat, gesunkene Schiffe darzustellen, hat sie ebenfalls eine Referenz auf die Logik.
Die übergordnete Kalibierungsklasse koordiniert die Kalibrierung und hat somit Referenzen auf alle drei Teilmodule.
Das Programm besitzt zwei Fenster: Ein Projektionsfenster, das über den Beamer auf den Boden projiziert wird, und ein Debug-Fenster, in dem sämtliche Informationen wie z.B. Positionen aller Schiffe, Anzahl der Spielzüge und versenkte Schiffe angezeigt werden. Zudem hat man die Möglichkeit die Kalibierung erneut zu starten und zu Testzwecken das Spiel automatisch ablaufen zu lassen.
BohmbingShips Klassendiagramm.png

Farbdetektion

Um die Position des Balles zu ermitteln, wird eine Farbdetektion ausgeführt. Dazu wird zunächst das von der Kamera aufgenommene RGB-Bild in den HSV-Farbraum umgewandelt. Das HSV-Bild wird zur weiteren Verarbeitung in seine drei Farbkanäle, in Form von Grauwert-Bildern, zerlegt. Nun wird im Hue-Kanal (deutch Farbwert) nach der Farbe des Balles (Hue-Wert: 172) mit einem Schwellwert von +/- 10 gesucht. Dabei ist zu beachten, dass die Hue-Skala von openFrameworks nur von 0 - 180 reicht. Das heißt, dass eine Logik verwendet werden muss, die diesen Überlauf von null beginnend mitzählt.
Da auch weißes Licht rote Farbanteile enthält, müssen diese falsch detektierten Pixel über die Sättigung - und damit den Saturation-Kanal (deutsch Sättigung) - eliminiert werden. Weißes Licht ist im Gegensatz zu dem Rot des Balles ungesättigt. Werden nun alle Pixel die eine Sättigung unter dem Wert 120 (Saturation-Skala von 0 bis 255) haben auf null gesetzt, werden die fehlerhaften Pixel eliminiert.
Um das produzierte Ergebnis zu verbessern werden einzelne, fehlerhaft detektierte Pixel mithilfe der Erode-Funktion entfernt. Um kleinere nicht detektierte Bereiche innerhalb des Balles auszufüllen, wird zusätzlich noch die Dilate-Funktion verwendet. Zum Schluss wird nun durch die Klasse "contourFinder" des "ofxCv"-Addons der Mittelpunkt des Balles bestimmt.
Im folgenden Bild sind die einzelnen beschriebenen Vorgänge visualisiert.

BohmbingShips Farbdetektion.png

Homographie

In der Kalibrierungsphase wird die Homographie verwendet, um das verzerrte Kamerabild zu entzerren und Bildkoordinaten in Spielfeldkoordinaten umzuwandeln. Dafür wird das Beamerbild zunächst schwarz geschaltet und in schneller Abfolge vier weiße Quadrate an den Ecken des Spielfeldes nacheinander angezeigt. Anschließend werden für die Quadrate im Kamerabild die Schwerpunkte berechnet und die Koordinaten den bekannten Koordinaten im Spielfeld zugeordnet.
Die dafür nötigen Alogirthmen sind in zwei Klassen gekapselt: VisualInputHomography und SimpleMatrix. Letztere ist für die Datenhaltung von Matrizen und die zugehörigen Operationen zuständig, wie z.B. Berechnung der Determinanten und der Inversen sowie die Grundfunktionen Addieren, Subtrahieren, Multiplizieren. VisualInputHomography verwendet diese Matrizen, um mit den vier Koordinaten aus dem Kamerabild ein achtdimensionales Gleichungssystem zu lösen. Die Lösung mit acht Einzelwerten bildet somit die 3x3-Transformationsmatrix. Diese wird gespeichert und mit ihr werden fortan beliebige Kamerakoordinaten in Spielfeldkoordinaten umgewandelt. Dies wird benötigt, um die Spielfeldkoordinaten der geworfenen Bomben zu ermitteln.

Fazit

Beinahe alle geplanten Punkte des Projekts wurden erreicht. So funktioniert die Detektion des Balles und der Spielablauf bei richtiger Konfiguration wie geplant. Lediglich die Funktion Schiffe per Laserpointer zu platzieren musste aus Zeitgründen verworfen werden.
Zudem wäre eine automatische Anpassung bzw. Konfiguration an die Lichtbedingungen des Raumes wünschenswert, sodass auch ein Laie das Spiel in Betrieb nehmen kann.

Downloads