Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektesose22:ssppublic:start

Projektdokumentation Schere-Stein-Papier Roboter
Gruppenmitglieder: Josephine,Julius
Einleitung

Unsere Gruppe hat einen Spiele Roboter gebaut, gegen den man Schere Stein Papier spielen kann. Der Roboter besteht aus einer eigenen Hand mit der er eine der drei Gesten zeigen kann. Nach einem Ton-Countdown wird eine Geste generiert und gezeigt. Die Bewegung der Hand wird durch Servo-Motoren gesteuert. Der Spieler zeigt nach dem Countdown auch eine Geste in eine Kamera. Mit Hilfe von Bilderkennung, wird diese Geste erkannt und eine entsprechende Zahl 1,2 oder 3 an einen Server geschickt, der dies dann an den Arduino weiterleitet. Dort soll dann die Geste mit der Roboterhand verglichen werden und ein Ton ausgegeben, wer gewonnen hat.

Im Laufe des Projektes haben wir uns das Challenger Projekt angeschaut. https://www.mintgruen.tu-berlin.de/robotikWiki/doku.php?id=projektewise19:challengerpublic:start.
Dieses Projekt hat uns auch geholfen, unseren Roboter zu entwickeln: https://medium.com/geekculture/rock-paper-scissors-with-hand-gesture-recognition-841297a7d915.

Gesamtsystem
Unser Roboter besteht aus der Hand und der Bilderkennung durch die Kamera. Die Hand haben wir aus Holz, Pappe, Kleber, den Servormotoren und Seilen aufgebaut. Für die Bilderkennung haben wir die Kamera im Laptop verwendet, da dieser an den Roboter angeschlossen werden musste und am einfachsten war. Wichtig ist die Kommunikation zwischen dem Laptop und dem Arduino gewesen, da die Bilddaten verarbeitetet und verschickt werden mussten. Da der Browser nicht auf den USB Anschluss vom Laptop zugreifen kann, mussten wir einen Server mit Node erstellen, um über diesen die Kommunikation zu leiten. Zudem wurde eine Bibliothek für die Gestenerkennung der Hand gebraucht, die wir nutzen können und der Code für die Bewegung der Roboterhand geschrieben. Wir haben bewusst die Aufgabe ausgeklammert, eine externe Kamera an den Roboter anzubauen, da dies aus Zeitgründen zu viel wurde. Zu Beginn haben wir überlegt, den Spielstand aufzuzeichnen, aber auch dies wurde aus Zeitgründen weggelassen.
img_9590.jpg Abb1. Unsere Roboterhand

Die Hand

Der Arm besteht aus Holz an dem 3 Servo-Motoren befestigt sind für die Steuerung der drei Finger. Die Finger sind aus Pappe, die einmal geknickt wurden um die Bewegung zu erleichtern und mit Klebeband am Arm befestigt. Die Servo-Motoren und Finger wurden mit einer Schnur verbunden und durch Isolierschlauch geführt, damit alles ordentlich bleibt. Nach einiger Zeit haben wir gemerkt, dass die Finger in der Stein Position bleiben und sich nicht mehr ausstrecken, egal wie die Servo-Motoren gedreht sind. Damit sie wieder gestreckt sein können, haben wir Muttern als Gewicht an den Fingerspitzen befestigt. Die Servomotoren sind über eine Steckplatine mit dem Arduino verbunden. Dort steckt auch ein Piezo Lautsprecher für den Countdown.

Bilderkennung
Für die Bilderkennung haben die Bibliothek von ml5 genutzt, die Tensorflow benutzt. Tensorflow hat einen fertigen Code für die Erkennung einer Hand im Bild, anhand von 21 Punkten der Hand. Ml5 benutzt diese 21 Punkte und gibt sie in ihrem Code aus, mit denen wir gerechnet haben, sodass die drei Gesten erkennbar sind.

Abb2. Flussdiagramm zur Erläuterung unserer Rechnung
Unsere Bilderkennung läuft in einem Browser online. Da diese aber nicht auf den USB Port zugreifen kann, ist zwischen dem Browser und Arduino keine Kommunikation möglich. Also mussten wir einen Server erstellen, der als Verbindungsstelle zwischen den beiden fungiert. Dafür haben wir Node genutzt, welches ein Programm ist um lokale Server einzurichten.. An den Server wird die Zahl für die Geste geschickt und anschließend mit serieller Kommunikation an den Arduino geschickt, der das ganze dann weiter verarbeitet. Um es zum Beispiel mit seiner eigenen Geste zu vergleichen.

Bestimmung der Gesten

Bestimmung der Gesten mithilfe von ML5

Durch die ML5-HandPose Bibliothek haben wir eine gute Grundlage die Gesten Schere Stein und Papier zu erkennen. Die Bibliothek erkennt eine Hand die vor eine Webcam gehalten wird und erzeugt dann mithilfe eines neuronalen Netzes [X] - Punkte auf der Hand. Die Punkte werden dann in echtzeit bestimmt und besitzen je eine X-, Y-, und Z-Koordinate. Nun standen wir aber vor der Herausforderung anhand der Positionen der Punkte die gezeigte Geste zu identifizieren. Unser erster Ansatz war es lediglich 6 Punkte zu verwenden, die 5 Fingerspitzen und einem Punkt auf der Handballe. Nun berechneten wir mithilfe der [FORMEL NAME] den Abstand der Fingerspitzen zur Handballe. Wenn die Finger also gestreckt sind, ist dieser Abstand groß, sind die Finger hingegen zur Faust geballt, dann ist der Abstand sehr gering.

Durch diesen Abstand konnten wir dann bestimmen welche Geste gezeigt wurde: Sind die Abstände von Zeige- und Mittelfinger groß, dann kann es entweder Schere oder Papier sein. In dem Fall überprüfen wir auch noch den Ringfinger. (Wenn Zeige-, Mittel- und Ringfinger einem großen Abstand haben, kann es nur Papier sein, wenn der Ringfinger einen geringen Abstand hat, dann kann es nur Schere sein). Wenn Mittel- und Zeigefinger hingegen einen kleinen Abstand zur Handballe haben, so kann die Geste nur Stein bedeuten.

Diese Implementierung hatte jedoch ein großes Problem: der Abstand von einer Fingerspitze zur Handballe ist natürlich abhängig von der Größe der Hand. So konnte es vorkommen, dass eine kleine Hand falsch erkannt wurde. Um das zu lösen haben wir, anstatt nur den Abstand zu nutzen, einen neuen Wert berechnet. Wir haben neben den 6 Handpunkten noch einen Punkt, der am Beginn des Mittelfingers positioniert ist, genutzt. Nun haben wir nicht nur den Abstand von den Fingerspitzen zu der Handballe berechnet, sondern dazu noch Abstand von den Fingerspitzen zu dem Punkt unterhalb des Mittelfingers. Beide Abstände ändern sich bei verschieden großen Händen, der Trick ist aber nun, dass das Verhältnis der beiden Abstände bei jeder Hand sehr ähnlich ist.

Nachdem wir den Code umgeschrieben haben und das Verhältnis zur Bestimmung der Gesten verwendeten, war die Ausgabe sehr viel besser und fast immer korrekt, unabhängig von der Handgröße. Wir hatten nun einen Webserver, auf dem die Gesten Schere, Stein und Papier auf einer Website mithilfe der Webcam ziemlich genau bestimmt werden konnten. Die nächsten Schritte wären nun nurnoch gewesen, diese Gesten an den Robotor zu senden. Bauteile

  • Arduino Nano
  • Laptop (Kamera)
  • Steckplatine
  • 3 Servomotoren
  • Piezo-Lautsprecher
  • Kabel
  • Klebeband
  • Schnur
  • Isolierschlauch
  • Holz
  • Pappe
  • Muttern als Gewicht

Pinbelegung

Pin Bauteil Funktion
D2 Piezo Lautsprecher Ton Ausgabe
D3 Servo Motor Bewegung Ringfinger
D5 Servo Motor Bewegung Mittelfinger
D6 Servo Motor Bewegung Zeigefinger

Schaltplan
schaltplan_steckplatine_steckplatine.jpg Abb.3 Schaltplan

Ergebnis
Unser Roboter kann: Seine Hand bewegen und eine Geste generieren, ein Startsignal ausgeben, wann das Spiel beginnt, die Geste im Bild erkennen und über den Server an den Arduino weiterleiten.
Unser Roboter kann nicht: Die Daten der Geste vom Spieler verarbeiten und mit seiner eigenen Hand vergleichen.
Wir werden in der nächsten Zeit noch versuchen, die Verarbeitung der Geste hinzukriegen, sodass man auch wirklich gegen den Roboter spielen kann. Wie man den Roboter verbessern könnte oder erweitern wäre zum Beispiel, ein Roboter der immer gewinnt oder eine besser Hand bauen, da unsere relativ instabil ist. Außerdem könnte man eine Online Version machen, wodurch man gar keine Hand braucht oder eine Version die den Spielstand mitzählt.

projektesose22/ssppublic/start.txt · Zuletzt geändert: 2022/08/29 21:48 von d.golovko