Kartenspielroboter
Viele Menschen spielen gerne Karten, aber manchmal fehlt ein Mitspieler!

Kartenspielroboter
Projektbeschreibung
Kartenspiele stellen eine beliebten Zeitvertreib für Jung und Alt dar. Je nach Kartenspiel ist eine bestimmte Anzahl oder eine Mindestanzahl an Spielern notwendig, sonst kann das Spiel nicht gespielt werden. Da nicht immer die benötigte oder gewünschte Anzahl an Spielern verfügbar ist, sollte im Rahmen von Systems Engineering 1 ein Robotersystem entwickelt werden, das einen menschlichen Mitspieler für das Spielen verschiedener Kartenspiele mit echten Spielkarten ersetzen kann.
Beteiligte Personen
Studierendengruppe:
Zentrale Spielsteuerung: Markus Wagner, Marco Westermair, Dominik Ziegler
Mensch-Maschine-Interaktion: Tobias Ertle, Manuel Mikschl, Alexander Markidonow
Kartenerkennung: Benedikt Degenstein, Ali Gözen, Thomas Henning, Dennis Religa, Burak Saglam
Roboteransteuerung: Michael Durach, Thomas Höger, Jan Sigg, Nikolas Voss
Betreuer: Prof. Dr.-Ing. Martin Bayer, Prof. Dr.-Ing. Claudia Meitinger
Veranstaltung
Systems Engineering 1 (E5-IK)
Laufzeit
WS 2019/2020
Zielsetzung
Entwicklung eines funktionsfähigen Prototypen eines Kartenspielroboters,
- der einen menschlichen Mitspieler beim bayrischen Kartenspiel "Watten" für zwei ersetzen kann.
- der mit echten Spielkarten spielen kann.
- der einfach erweitert bzw. modifiziert werden kann (z.B. auf andere Kartenspiele, andere Technologien zur Kartenerkennung und/oder Kartenhandhabung, etc.).
Systemüberblick
Umzusetzende Funktionalitäten
Zur Realisierung der Zielsetzung sollten folgende technische Funktionalitäten umgesetzt werden:
- Zentrale Spielsteuerung zur Ansteuerung der anderen Spielkomponenten
- Interaktion mit menschlichen Mitspielern, wann immer sinnvoll/nötig
- Bestimmen und Ausspielen einer Karte, sofern Roboterspieler an der Reihe ist (mindestens regelkonform, nach Möglichkeit mit einer einfachen Taktik)
- Interaktion mit dem/n menschlichen Mitspieler(n) über verschiedene Modalitäten
- Identifizieren von Spielkarten
- verdeckte, d.h. eigene, noch nicht ausgespielte Karten des Roboterspielers, die für menschliche Mitspieler nicht sichtbar sein sollen
- offene, d.h. die zuletzt ausgespielte Karte (egal von welchem Spieler)
- Aufnehmen und Bewegen von Spielkarten des Roboterspielers
- zu Spielbeginn vom Stapel
- während des Spiels aus einer Kartenhalterung
Anordnung Systemkomponenten
Folgende Abbildung zeigt die gewählte Spieleranordnung sowie definierte Ablageorte für Spielkarten vor und während des Spiels. von OpenPNP selbst.
Modularisierung
Entsprechend der umzusetzenden technischen Funktionalitäten wurde das Projekt im Rahmen von vier Teilprojekten realisiert. Jede Funktionalität wurde für einen Raspberry Pi als Teil eines MQTT-Netzwerks umgesetzt.
Vorgehensweise
Die Umsetzung des Projektes erfolgte in mehreren Phasen über das Semester hinweg.
Projekt aufsetzen
- Watten lernen
- Lasten- & Pflichtenheft erstellen
- Struktur, Arbeitspakete, Ablauf, Projektplan, Kosten planen
- Synchronisations-Meilensteine festlegen
- git-Repositories initialisieren
Gesamtsystemsimulation durchführen
Ziele:
- Verbindliche Schnittstellendefinition festlegen (hier: MQTT-Topics)
- Gemeinsames Verständnis des Gesamtsystemverhaltens erlangen
Ablauf:
- Jede Gruppe simuliert das Verhalten Ihres Teilsystems.
- Die Kommunikation zwischen den Teilsystemen / Gruppen ist ausschließlich mittels MQTT erlaubt (z.B. über Kommandozeilentools).
System integrieren
- Bei jeder Systemintegration wird versucht, einen vollständigen Spielablauf abzuarbeiten.
- Fehler und Optimierungsmöglichkeiten werden dokumentiert und von den Gruppen anschließend bearbeitet.
- Bei nächsten wöchentlichen Treffen werden die Verbesserungen und Erweiterungen wiederum in Form eines kompletten Spielablaufversuchs getestet.
Projekt abschließen
- Präsentation der Ergebnisse der Teilprojekte
- Dokumentation der Module
- Abnahme / Übergabe
Teilprojekt ZENTRALE SPIELSTEUERUNG
Aufgaben
- Zentrale Steuerung des Spielablaufs
- Interaktion mit menschlichen Mitspielern, wann immer sinnvoll/nötig
- Anfordern von Roboteraktionen
- Anfordern der Kartenerkennung
- Implementierung einer Spielelogik
- Bestimmen einer auszuspielenden Karte: regelkonform unter Verwendung einer einfachen Spieltaktik
Modulbeschreibung
Es wurde ein Python-Skript entwickelt, welches die Kommunikation unter den Gruppen steuert, den Spielablauf verwaltet und die Taktik implementiert. Ein systemd-Service startet die Skripte beim Systemstart automatisch, so dass kein manueller Eingriff notwendig ist.
Um flexibel hinsichtlich zukünftiger Änderungen zu sein, wurde ein objektorientierter Entwurf umgesetzt, in dem Spielertypen (Mensch/Roboter) ebenso einfach ausgetauscht werden können wie die Art des Spiels (Watten/...) oder die Art der Kommunikation zwischen den Kompontenten.
Die Funktion zur Kartenauswahl weist jeder Karte einen Wert zu, welcher bei der Entscheidungsfindung berücksichtigt wird. Zudem wird bei der Wahl von Spielschlag und Spielfarbe eine einfache Heuristik angewendet, so dass Spiele gewonnen werden konnten.
Zusätzlich wurde ein MQTT-Logger und ein Simulationsprogramm für interne Tests erstellt. Die gesendeten Nachrichten aller Systemkomponenten wurden aufgezeichnet, um die Fehlersuche zu erleichtern. Das Simulationsprogramm ermöglicht Tests der eigenen Software, ohne auf andere Gruppen angewiesen zu sein.

Teilprojekt MENSCH-MASCHINE-INTERAKTION
Aufgaben
- Konzeption des Interaktionskonzepts in Absprache mit der zentralen Spielsteuerung
- Implementierung von Spracheingabe, Sprachausgabe, Touch-Interaktion
Anforderungen (Auswahl)
- Die Interaktion sollte für menschliche Spieler selbsterklärend, d.h. ohne Einweisung nutzbar sein.
- Der Systemzustand im Hinblick auf den Spielfortschritt und gewählte Parameter (z.B. Spielschlag, Spielfarbe) sollte für den Menschen sichtbar sein.
- Der Roboter sollte auf spielentscheidende Aktionen menschenähnlich reagieren.
Umsetzung
- Programmiersprache Python3
- Display mit Toucheingaben als Grundbaustein
Sprachausgabe und Spracheingabe als Ergänzung - Paho-MQTT Bibliothek für MQTT Nachrichten
- Startup zum Starten/Neustarten aller Programme als einzelne Tasks (Spracheingabe, Sprachausgabe und Display)
- Kivy Bibliothek für die Benutzeroberfläche
- Sprachausgabe mithilfe von eclipse für Text-to-Speech
- Spracheingabe mithilfe von Snips
Verwendung
Nach dem Hochfahren des Raspberry Pi3 muss das Pythonskript für das Startup ausgeführt werden. Dieses wartet dann auf Kommandos, die via MQTT eintreffen.
Sobald vom Spieler eine Eingabe gefordert wird, wird dieser per Sprachausgabe und Bildschirmanweisung dazu aufgefordert.
Neben einer Touch-Eingabe ist dies auch mit einer Spracheingabe möglich.
Teilprojekt KARTENERKENNUNG
Aufgabe
- Identifikation von verdeckten und offenen Spielkarten (einzeln und im Stapel)
Anforderungen
- Die Spielkarten des Roboters müssen hinsichtlich Farbe und Schlag erkannt werden können.
- Die ausgespielten Karten des Spielers müssen hinsichtlich Farbe und Schlag erkannt werden können.
- Eine doppelte Erkennung der gleichen Spielkarte muss vermieden werden.
Die Karten wurden optisch mit Hilfe einer Kamera erkannt, welche mit einem Flachbandkabel an den Raspberry Pi angeschlossen wurde. In einer ersten Realisierungsstufe wurden die Spielkarten im Kamerabild basierend auf QR-Codes erkannt. In einer zweiten Stufe wurde ein neuronales Netz zur Erkennung der Karten trainiert.
Umsetzung - Variante 1: QR Codes
Die Spielkarten wurden jeweils mit 2 QR-Codes an der oberen und unteren Kante versehen. Diese Codes beinhalten Informationen über den Schlag und die Trumpffarbe der Spielkarte.
Die Erkennung der QR-Codes erfolgt mittels einer Python-Skripts. Dieses verwendet eine Bibliothek, zur Extraktion der Informationen aus den QR-Codes und übermittelt diese anschließend an die anderen Systemkomponenten.
Umsetzung - Variante 2: Neuronales Netz
In einer zweiten Ausbaustufe wurde ein neuronales Netz mit Kartenbildern trainiert, so dass eine Erkennung der Karten stattfinden kann, ohne diese verändern zu müssen. Diese Variante wird aktuell noch getestet und in das Gesamtsystem integriert.

Teilprojekt ROBOTERANSTEUERUNG
Aufgabe
- Konzeption und Aufbau des Spielbereichs
- Auswahl und Ansteuerung eines Robotersystems und Greifers
Modulbeschreibung
Gegenstand dieser Systemkomponente ist der Transport von Karten mit Hilfe eines Roboterarms. Zentrale Anforderung ist die flüssige Bewegung des Roboterarms. Mit den 6 Achsen des Roboterarms Niryo One ist ein Spielablauf nahe dem einer realen Hand gut umsetzbar.
Zudem dient der Roboterarm als Kamerahalter für das Teilprojekt "Kartenerkennung". Je nach aktuellem Bedarf wird zwischen dem Tool "Vakuum-Greifer" und dem Tool "Kamera" gewechselt, indem ein eigens konstruierter Halter für Greifer und Kamera gedreht wird.
Bewegungen, die im Rahmen dieses Teilprojekts umgesetzt wurden, sind:
- Aufnahme von Karten von einem verdeckten Stapel und Ablage in eine der fünf Kartenhalterungen
- Ausspielen einer Karte aus einer der fünf Kartenhalterungen auf den Tisch
- Erkennungsfahrt mit Kamera, um Spielkarten in den Kartenhalterungen erkennen zu können
- Positionierung der Kamera über dem Tisch, um ausgespielte Karten erkennen zu können
- Kalibrierungsfahrt
Umsetzung
- Aufnahme der Karten über einen Saugnapf
- Entwurf und 3D-Druck aller nötigen mechanischen Bauteile(Kartenhalterung, Kartenablage, Werkzeughalterung, Schlauch-/Kabelführung)
- Programmierung der Roboterbahnen in Python
- Aufruf der Roboterbahnen infolge Anfoderungen anderer Systemkomponenten über MQTT (zentrale Spielsteuerung, Kartenerkennung)
- Verwendung der Python-Bibliothek Paho für MQTT Interaktionen
Wir benutzten ...
Roboter Niryo One, ROS, Vakuum-Sauger, MQTT, Raspberry Pi 3B+, Raspi-Camera, Python, eSpeak, SNIPS, KI, QR Codes, 3D-Druck, YOLO, ...
Impressionen
Verwendung
Im Video wird gezeigt, wie der Kartenspielroboter Karten erkennt, auf Sprache reagiert und sie mit seinem Roboterarm bewegt.

















