Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projekte2014:menscheninteraktionsgeraet

Trinkspiel-Bot

Einleitung

Wir haben uns die Aufgabe gesetzt einen Roboter zu bauen, der in der Lage ist Menschen zu erkennen, zu diesen sich fortzubewegen und anschließend eine Interaktion auszuführen. Die Idee ist dabei, dass nach erfolgreicher Teilnahme an einem Gewinnspiel, ein Getränk ausge- schenkt wird. Zu Beginn erstellten wir ein Zustandsdiagramm, um die einzelnen Abläufe unseres Roboters gut darzustellen. Um diese Idee zu verwirklichen, haben wir uns überlegt, welche einzelne Schritte nötig sind, damit die Abläufe nahezu immer ausgeführt werden, um ein geschlossenes System zu erhalten.

Unser Zustandsdiagramm sieht dabei wie folgt aus:

a = 1 Skeletterkennung c für Entscheidung der Person b = 1 Gesichtserkennung d = 1 Gewonnen

Sobald unser Roboter eingeschaltet wird, fängt er an Leute zu suchen, indem er sich im Kreis schrittweise dreht. Falls jemand getrackt wurde, fährt er zur Person hin. Danach würde der Roboter durch einen Ton auf sich aufmerksam machen und eine Gesichtserkennung starten, um festzustellen, ob die Person zum Roboter gewandt ist. Falls die Person nicht mehr anwesend ist, wird wieder nach Menschen gesucht. Sonst wird die Person gefragt, ob ein Quiz oder Pong gestartet werden soll. Ebenfalls kann man auch ablehnen, woraufhin die Suche nach Menschen wieder beginnt. Wenn man verloren hat, wird wieder nach neuen Menschen gesucht, andernfalls erhält die Person eine Belohnung in Form eines Getränks und danach beginnt es von vorn.

Das Diagramm verdeutlicht, wie ungefähr unsere Umsetzung erfolgen soll. Jedoch ist zu erwähnen, dass das Quiz und die Gesichtserkennung nicht realisiert wurden, aufgrund von Zeitmangel.

Umsetzung

 1.) Einführung

Für unsere Idee verwenden wir die Kinect Kamera und ein im Labor vorhandenes fahrbares Gestell. Das Gestell besitzt 6 Räder, jeweils 3 auf der rechten und auf der linken Seite. Die Steuerung efolgt über die Motoren, dessen Drehzahl mit einem Arduino gesteuert werden kann. Aufgrund der besseren Eigenschaften, haben wir uns für den Arduino Uno entschieden, da dieser mehr Ausgänge/Eingänge besitzt. Für die Kinect Kamera gibt es bereits Bibliotheken, die eine Personerkennung beinhaltet und das Bild auf dem Bildschirm ausgibt. Für die Datenverabeitung benutzen wir ein Notebook. Der Arduino und die Kamera sind per USB an den Laptop angeschlossen. Um den Code zu verstehen, war es zuerst nötig diesen zu analysieren.

 2.) Personenerkennung/Kommunikation

Für die Personenerkennung verwenden wir die Bibliothek SimpleOnenNI. Der Code trackt bereits eine Person und gibt diese anschließend auf dem Bildschirm des Notebooks aus. Der Code kann das Skelett einer Person erkennen und anschließend einen Mittelpunkt des menschlichen Körpers erzeugen. Nachdem unser System ein Skelett erkannt hat, wird sozusagen ein „center of mass“generiert. Die Koordinaten dieses Punktes werden dann weiter an den Arduino versendet. Es ist somit nötig, dass eine Kommunikation zwischen dem Arduino und dem Processing Programm konfiguriert wird. Damit sich unser Konstrukt zu einer Person hinbewegen kann, senden wir vom Processing Programm die Koordinaten des Mittelpunktes an den Arduino,welcher wiederum die erhaltenen Daten so verarbeitet, dass das Fahrgestell sich zu der Per- son fortbewegen kann. Aufgrund des kartesischen Koordinatensystems der Kinect, können wir den Winkel berechnen und diesen zusammen mit der Distanz an den Arduino senden.

In der oberen Abbildung ist das Koordinatensystem nochmals veranschaulicht. Für die serielle Schnittstelle haben wir bereits ein Beispiel auf der Mint Wiki-Seite, was die benötigte Kommunikation aufbaut. Es wird ArduPar auf dem Arduino installiert und anschließend das Code-Beispiel so verändert, dass die Koordinaten empfangen werden können. Dazu erzeugt man ein Objekt des Typs ArduPar und verwendet die write Methode, die dann das Objekt auf den Port schreibt. Das Objekt beinhaltet dabei z. B. den gewüschten Wert. Das Objekt kann dann vom Arduino mit der read Methode gelesen werden.

 3.) Personenerkennung/Kommunikation
 
 3.1) Motorsteuerung
 

Für die Fortbewegung wird ein 9 V Akku benutzt. Um das Gestell mit den Motoren anzu- steuern, wurde dafür wieder eine Bibliothek von der Wiki-Seite benutzt. Die Steuerung der Motoren erfolgt über den TReX. Dieser reguliert die Stromzufuhr des Akkus an die Motoren, um die Drehzahl zu beeeinflussen. Der TReX kommuniziert mit dem Arduino Uno über UART. In der unteren Abbildung ist die benötigte Verbindung zwischen Arduino und TReX dargestellt.

Die verwendeten Pins vom Arduino sind D12 und D13, da neben der 13 sich GND befindet und mit einem 3 Pin-Kabel beides sich leicht verbinden lässt, wie in der weiteren Abbildung verdeutlicht:

Da bereits eine Bibliothek vorhanden ist, können wir die vorgegebenen Methoden, die einen Parameter für die Intensität erhalten, verwenden, um vorwärts, rückwärts, rechts oder links zu fahren. Es gibt 2 Möglichkeiten, damit sich das Gerät nach rechts oder links hinbewegt. Zu Beginn haben wir die rechte und linke Seite entgegengesetzt drehen lassen. So rotiert das Gestell auf einem Punkt entweder nach rechts oder links. Danach bewegt sich das Gerät vorwärts. Aufgrund aber der schlechten Handhabung, der Instabilität des Kamera-Trackings und von Vibrationen, wurden Funktionen geschrieben, die das Gerät Kurven fahren lässt, um diese Probleme zu umgehen.

 3.2) Bewegung in Abhängigkeit des Winkels

Dieses Bild soll verdeutlichen wie der Roboter zu seinem Ziel kommt. Es ist eine Draufsicht auf die Kinect Kamera bzw. dem ganzen Roboter. Durch die Mitte der Kamera legt Processing ein kartesisches Koordinatensystem. Wenn Kinect eine Person erkennt kann Processing den Anteil auf der z- bzw. x-Achse ausgeben. Diese beiden Informationen und der rechte Winkel reichen aus, um den Winkel Gamma zu berechnen. Umso größer dieser Winkel ist ums so mehr Geschwindigkeit wird auf die linken bzw. rechten Motoren aufaddiert. Diese Rechnung wird immer wieder ausgeführt, sodass der Winkel immer kleiner und die Geschwindigkeit immer niedriger wird, bis der Roboter im besten Fall sein Ziel mit einem Winkel von 0° erreicht.

 4.) Gehäuse

Damit sich der Roboter im Raum frei bewegen kann, schrauben wir auf der gelochten Metall- platte des fahrbahren Untersatz 3 Holzstäbe von ungefähr 80 cm Höhe, um eine angenehme Höhe für den Benutzer zu erreichen. Auf diesen 3 Stäbe wurde eine dünne Holzplatte von 30 cm x 30 cm Fläche angebracht, auf dem sich der Laptop befinden wird. Für die Kamera wird ebenfalls ein Holzstab von 35 cm Höhe angeschraubt, worauf dann die Kamera befestigt wird. Da bei dieser Konstruktion der Roboter leicht nach rechts oder links kippen kann, wurden Stützräder, rechts, links und hinten angebracht. Die Konstruktion ist in den unteren beiden Abbildungen zu sehen.

Der Holzstab für die Kamera wurde nochmals an die Platte befestigt, indem rechts und links Holzblöcke angebracht und miteinaner mit Schrauben verbunden wurden, um das Schwanken zu reduzieren. Die Kamera wurde fest an den Holzstab getapet, damit die Konstruktion stabiler wird.

Mit dieser Konstruktion entstand ein robustes Gehäuse. Um aber das Schwanken der Kamera zu reduzieren, damit das Tracking besser funktioniert, wurden funktionen geschrieben, die ein langsames Anfahren und leichtes bremsen ermöglichen.

 5.) Elektronik
 
 5.1) Schalter
 

Wir haben einen Schalter eingebaut, damit die Stromzufuhr vom Akku zu dem TReX, der die Stromstärke regelt, getrennt werden kann. Einen Vorteil hat dies, dass falls das Gerät in die falsche Richtung fährt, es einfach ausgeschaltet werden kann. Der Schaltplan dazu:

Man muss das Kabel zwischen dem Akku und dem TRex durchtrennen und dort einen Schalter an den durchtrennten Kabelenden anlöten, der beim Betätigen den Stromkreis wieder schließt. Der Schalter wurde oben auf der Platte angebracht:

 5.2) Akkuversorgung für die Kinect Kamera
 

Die Kinect Kamera benötigt eine 12 V Versorgung, die sonst über eine Steckdose erfolgt. Da aber unser Gerät mobil unterwegs ist, ist es nötig dafür einen Akku zu benutzen. Im Labor sind nur 9 V Akkus vorhanden, weshalb eine Schaltung benötigt wird, die die Spannung auf 12 V erhöhen kann. Dafür wird ein Hochsetzsteller verwendet. Der Schaltplan dazu verdeutlicht die benötigte Schaltung:

Der Hochsetzer erhöht die 9 V, indem die Spule, die ein Stromspeicher ist, den Kondensator auflädt, bis die 12 V erreicht sind. Die Diode sperrt den Strom in Richtung Spule, sodass die Entladung nur am Widerstand erfolgt. Der Schalter, der einen Transistor darstellt, schließt sich, sobald der Spannungswert am Kondensator sinkt, damit dieser wieder seine 12 V Span- nung hat. Wenn der Transistor geschlossen ist, kann sich der Kondensator entladen, da der Strom von der Spule zur Masse fließt. So entsteht ein Spannungs-Rippel am Kondensator, der so gering ist, dass man von einer Gleichspannung ausgehen kann.

Das Kabel wird durchgeschnitten und anschließend an einem männlichen Stecker angelötet.

Das weiße Ende wird an den Schirm vom Stecker angelötet, das rote wird mit der Mitte des Steckers verbunden.

Unser Hochsetzsteller in der oberen Abbildung hat 3 Anschlüsse. Die schwarze Verbindung ist für Masse, rot für die Eingangsspannung und gelb für die Ausgangsspannung. Bevor die Verbindungen gemacht werden, muss der Hochsetzsteller mit einem Potentiometer auf 12 V Ausgangsspan- nung eingestellt werden. Hierbei wird die Eingangsspannung mithilfe einer Spannungsquelle auf 3V gesetzt und anschließend mit einem Multimeter die Ausgangsspannung gemessen. Am Potentiometer wird so lange gedreht, bis man die 12 V erreicht hat.

Das schwarze Ende vom weiblichen Steckerkabel wird mit der Masse vom Hochsetzsteller verbunden, ebenfalls der Minus Anschluss vom Akku. Der Pluspol von der Batterie kommt an den Eingang des Hochsetzstellers. Die Ausgangsspannung wird wieder mit der Mitte des weiblichen Steckers verbunden. Somit können beide Stecker miteinander verbunden werden und es liegen 12 V an der Kinect Kamera an.

So kann dann das andere Ende des weiblichen Stecker mit dem Akku verbunden werden.

Mit diesem Aufbau kann sich unser Roboter mobil im Raum fortbewegen.

 6) Pong
 

Um einen Indikator dafür zu haben wer die Belohnung bekommt oder ob überhaupt eine Belohnung ausgegeben werden darf, entschieden wir uns das Spiel Pong in Processing zu implementieren. Bevor das eigentliche Spiel startet, ist es möglich aus zwei verschiedenen Darstellungsarten zu wählen. Im nächsten Bild wird kurz die Steuerung erklärt dann wird ge- spielt. Im Game Over Bildschirm wird letztendlich der Gewinner festgelegt. Um ein Spiel bzw. um Animation darstellen zu können ist es nötig aufeinanderfolgende Frames zu berechnen. Einen Rahmen dafür gibt die Draw-Funktion von Processing. Für jedes neue Bild müssen die Parameter des Balls bzw. der Pongschläger neu berechnet und dargestellt werden. Damit die Kollision zwischen Ball und Schläger stimmt müssen Außerdem Hitboxen festgelegt werden. Um das Spiel noch etwas interessanter zu gestalten wird die Geschwindigkeit des Balls von Zeit zu Zeit erhöht und je nach Spieldarstellung auch die Größe des Balls.

Ergebnis

Wir haben es geschafft einen Roboter zu bauen, der ein stabiles Gehäuse hat und in der Lage ist, Menschen zu erkennen und zu diesen hinzufahren. Nachdem dies ausgeführt wurde, startet ein Menü, wo man Pong auswählen kann. Nachdem man gespielt hat, wird angezeigt, ob man gewonnen oder verloren hat. Uns ist es jedoch nicht gelungen danach ein Belohnungssystem zu bauen, dass z. B. ein Ge- tränk bereitstellt. Zudem müsste noch ein System entwickelt werden, dass Objekte erkennt und diese umfährt. Beides ist machbar, leider haben wir es in der vorgegebenen Zeit nicht geschafft, aufgrund von Problemen mit dem fahrbahren Untersatz, da die erste Vorgehens- weise der Bewegungssteuerung zwar funktionierte, jedoch mit erheblichen Komplikationen. Außerdem nahm es viel Zeit in Ansprch einen neu geschriebenen Code zu testen, da jedesmal compiliert und hochgeladen werden musste.

Der Abschlussbericht ist ebenfalls als PDF Datei vorhanden, worin sich das Quellenverzeichnis und kommentierter Code befindet.

abschlussbericht.pdf

code.zip

projekte2014/menscheninteraktionsgeraet.txt · Zuletzt geändert: 2016/01/21 12:45 (Externe Bearbeitung)