Erste Ideen (Claw Machine oder Rätsel-Challenges)

Die Claw Machine war die Initialidee mit der diese Gruppenarbeit zustande kam. Es gab recht viele Interessenten, weshalb wir uns im Verlaufe des Kurses etwas aufgesplittet haben.

Aber zuerst haben wir gemeinsam in der großen Gruppe über verschiedene Roboter-Interaktionsmöglichkeiten gebrainstormt und überlegten uns Anwendungsfälle dafür. 

Dabei hatten wir die Werkschau im Hinterkopf und stellten uns vor, wie diese Claw Machine im Raum wirken könnte.

URcobot skizze.jpg
sketch shiming.png

Wir hatten zwei Szenarien im Kopf:

– Roboter in der Mitte, umzäunt, mit vier seitlichen Inputmöglichkeiten (Claw Machine)

– Roboter an einer Wand, umzäunt, mit nur drei seitlichen Inputmöglichkeiten (Rätsel Challenges)

Unklar war zu diesem Zeitpunkt noch, wie die Preise der Claw Machine angeordnet werden sollten, welche Überraschungen es überhaupt gäbe und wie wir das Ganze finanzieren würden. Das wirkte zudem nach einer Menge Arbeit und bei dem knappen Zeitrahmen mussten wir realistisch planen. 

Auch das zweite Szenario klang cool, aber wir blieben an den Rätseln hängen: Wie würden sie aussehen? Welche Art von Rätseln wären es? Sollten sie miteinander verbunden sein, damit eine durchgehende Challenge entsteht? Gäbe es Preise und wenn ja, welche? etc.

Also fingen wir quasi nochmal von vorne an zu brainstormen :')

Entscheidung: Buzz Wire Game

Unbenanntes_Projekt 1.jpg

Schließlich kam die Idee auf, ein Buzz-Wire-Game zu bauen. Dies war übrigens vorher Teil der Rätsel-Challenges. Dabei sollte der UR10e-Roboter bspw. über einen Controller gesteuert werden, um die Schlaufe am Draht entlangzuführen, ohne diesen zu berühren

Außerdem war das wohl das „einfachste“ Rätsel, das wir realistisch hätten umsetzen können. Die Technik dahinter ist grundsätzlich nicht besonders schwierig, doch um Fehler zu minimieren, fertigten wir Skizzen an.

Außerdem entwarfen wir ein UX-Flow-Chart, um unsere Ideen für das Spiel festzuhalten. Weil es ja an sich recht simpel ist, wollten wir die Experience mit zusätzlichen Funktionen und Effekten aufwerten.

user flow.png

Das hörte sich alles bereits vielversprechend an, und so fiel die endgültige Entscheidung!

Wir teilten die Aufgaben anschließend auf dem Miro-Board untereinander auf. Jeder übernahm das, was er am besten konnte oder wofür er großes Interesse hatte. Die Steuerung über Controller, Leap Motion, 3D-Maus und Neigungssensor unterscheidet sich zum Teil erheblich, sodass man sich jeweils im Detail auf das jeweilige Setup konzentrieren musste.

Wir halfen uns natürlich trotzdem untereinander und tauschten uns bei Fehlern aus. Auch von anderen Teilnehmern im Kurs erhielten wir wertvolle Unterstützung!

aufgabenverteilung design and robots miro.png

Funktion Arduino + Draht

fhp draht logo.jpeg

Oliver kümmerte sich um die Materialien und den Bau des Drahtes. Der 4-mm-Draht war zwar stabil genug, um sich während des Spiels nicht zu verbiegen, aber die Arbeit damit war ziemlich schwierig. Egal, wie sorgfältig man ihn bog, gerade Linien ließen sich nicht so einfach erreichen :')

Dadurch entstanden im Spiel ein paar knifflige Stellen, was die Challenge aber eher erhöht hat und somit gar nicht schlimm war. Der Draht war bereits mit der nötigen Technik im Holzbrett verbaut und funktionierte. Angetrieben von einer 9-V-Batterie ertönte bei jeder Berührung der Schlaufe mit dem Draht ein lauter, schriller Ton. 

Auf Dauer war das allerdings etwas anstrengend – also überlegten wir uns, wie man das Ganze spaßiger gestalten könnte.

Zunächst dachten wir instinktiv an Arduino oder Raspberry Pi. Arduino reichte in unserem Fall aus, da wir ja nur die Hardware-Funktionen erweitern wollten. Eine Anbindung an die UR10-Kommunikation, wofür ein Raspberry Pi besser geeignet wäre, war nicht nötig.

Mithilfe von ChatGPT wurde der Code für den Arduino generiert, getestet und die Hardware verbunden. Es sieht zwar ziemlich messy aus, weil einfach viele Kabel für den Bildschirm nötig sind, aber das Schema bei Tinkercad zeigt es nochmal ordentlicher. 

Die Skizze verdeutlicht außerdem, wie der Arduino-Stromkreis mit dem Hauptstromkreis des Drahtes verbunden ist. Grundsätzlich wurde Pin 8 ganz professionell zwischen die rote Krokodilklemme im Holzbrett gesteckt, und der Ground des Arduino war mit dem Ground (der Schlaufe) des Drahtes verbunden. Wir hatten Angst, dass etwas durchbrennt, aber alles funktionierte super!

In dem Video sieht man die Funktion und Verkabelung des Arduino Spiels mit dem Draht:

Struktur der 2 Spielmodi in Arduino

Das LCD 1602 kann nur alphanumerische Zeichen und einfache Sonderzeichen darstellen. Aufgrund des begrenzten Platzes war es spannend, ein komplett textbasiertes Interface zu gestalten.

Anfangs hatten wir nur einen Spielmodus vorgesehen, doch durch den Austausch in der Gruppe kam ein zweiter hinzu. Außerdem hatten wir auf dem Steckbrett nur einen Knopf. Das machte die Bedienung zwar einfacher, aber ein bisschen tricky wurde es, wenn man in den zweiten Modus wechseln wollte: Dafür musste man den Knopf zweimal schnell hintereinander drücken. Manchmal wurde der Doppelklick allerdings nicht erkannt, und man landete wieder im ersten Modus.

Katja übernahm die Logik sowie die Programmierung der Spielmodi mit Unterstützung von ChatGPT.

Schema Spielmodi Arduino.png

Im Schema ist genau zu sehen, wie die Spiel-Loops funktionieren. Im 1. Modus gibt es die Möglichkeit, das Spiel bei Bedarf komplett zu stoppen. Im 2. Modus wird derselbe Knopf dafür genutzt, die Zeit zu starten und wieder zu stoppen. In beiden Modi werden die Treffer mitgezählt, begleitet von Sound- und Lichteffekten. Am Ende erscheint immer kurz eine Anzeige mit den erzielten Werten.

Natürlich sollte man versuchen, möglichst wenige Treffer zu landen. Im 1. Modus sorgt der Zeitdruck von 2 Minuten dafür, dass man es oft nicht schafft, fehlerfrei durch den Drahtparcours zu kommen. Im Übungsmodus dagegen kann man sich unbegrenzt Zeit lassen und eigene Highscores aufstellen.

Im Video sind die genannten Dinge in einem schnellen Überblick zu sehen:

In diesem PDF gibt es den ganzen Code für das Arduino-Setup!

Steuerung per Ultraleap 3Di

Hardware und Software

Um dieses Gerät verwenden zu können, muss der Computer über ein Windows-System verfügen und den Ultraleap control panel auf https://www.ultraleap.com/downloads/ herunterladen.

Der Computer ist direkt mit der UR verbunden und verwendet den Remote-Modus, um die UR über Python zu steuern.

Hier ist die Bedienungsanleitung von Leap Motion: https://docs.ultraleap.com/hand-tracking/getting-started.html

IMG_9573.JPG

Die nächste Abbildung zeigt die Control-Oberfläche des Computers, die das Ultraleap Control Panel und Python enthält, das wir mit VS Studio ausführen.

Snipaste_2025-07-07_16-41-38.png

Arbeits- und Testteil

Wir benötigen verschiedene Gesten, um die Drehung und die Bewegung nach oben, unten, links und rechts des UR zu steuern. 

Nach einer Diskussion haben wir beschlossen, zunächst die Bewegung nach oben, unten, links und rechts des UR mit der linken Hand zu steuern, dann die Drehung mit der rechten Hand und schließlich beide Codeabschnitte zusammenzuführen.

Die erste Schwierigkeit zeigte sich schnell: Die Gestenerkennung von Leap Motion war nicht so gut; zum Beispiel konnte es weder eine Faust noch eine „OK“-Geste erkennen. Daher entschieden wir uns, den Roboter über Positionsbewegungen zu steuern.

GIF 2025-7-31 16-36-58.gif

Dann stellten wir fest, dass die Steuerung der Handbewegungen nicht so präzise war und Leap Motion manchmal Handbewegungen nicht erkennen konnte oder mehrere Bewegungen gleichzeitig erkannte, was zu etwas chaotischen Bewegungen des Roboters führte.

Unsere Lösung bestand darin, die Bewegungsgeschwindigkeit des UR zu reduzieren und das Intervall zwischen den Befehlen zu steuern. Dies verlängerte jedoch die Gesamtspieldauer. Um ein flüssiges Gameplay und ein besseres Erlebnis zu gewährleisten, testeten wir außerdem verschiedene Bewegungsdistanzen, Geschwindigkeiten und Winkel.

Dann kommt der Teil, bei dem die rechte Hand die Drehung steuert.

Auch wir sind auf Probleme gestoßen. Die Ausgangsposition des UR beeinflusste auch seine Bewegung, insbesondere da unsere Drehung nur Wirst 3 erforderte. Jede Drehung brachte den UR jedoch in seine Ausgangsposition zurück und drehte ihn anschließend erneut um Wirst 3. Daher wir mussten den Code noch überarbeiten und die Positionen des UR nach jeder Drehung und Bewegung aktualisieren, bevor wir die Bewegung fortsetzten.

Dann kombinieren wir die beiden Teile des Codes, sodass beide Hände gleichzeitig verschiedene Aktionen steuern konnten.

2.gif

Spiele das Buzz-Game!

Snipaste_2025-07-31_16-55-21.png

Die linke Hand steuert die Bewegung nach oben, unten, links und rechts und die rechte Hand steuert die Drehung.

Unten ist der Code

Steuerung per Achsensensor (MPU6050)

//Funktionsweise

Kippt man die Hand nach unter oder oben bewegt sich der Roboter auf der Z-Achse nach unten oder oben.

Kippt man sie nach links oder rechts, bewegt sich der Roboter nach links oder rechts entweder auf der X-Achse(entlang der kurzen Seite des Roboter Tischs) oder der Y-Achse(entlang der langen Seite), je nachdem ob man vx oder vy verwendet.

Drückt man einen Button und kippt die Hand nach links oder rechts, rotiert das Roboter-Tool auf der Y-Achse.

Es wurde ein Trigger-Wert zur Erkennung der Kippbewegung festgelegt, wird dieser erreicht, wird über WLAN ein Befehl an den Roboter gesendet. Ist der Wert nicht mehr erreicht, wird ein Stop-Befehl gesendet. Solange es nicht zu einer Zustandveränderung kommt, wird der zusetzt gesendete Befehl ausgeführt.


//Befehle 

String command = "speedl([";   

command += String(vx,2) + "," + String(vy,2) + "," + String(vz,e);  

command += ",0," + String(r,2) + ",0], 0.5, 0.1)\n";   

   //für "speedl([vx, vy, vz, 0, r, 0], 0.5, 0.1)"  

   //Variabeln können nicht in einem String gesendet werden, daher die Stückelung

if (sensor) {    

   client.println(command);  

} else {  

   client.println("stopl(0.5)");  

}    

//Verwendete Komponente

1x ESP32 C3 Super mini
1x Achsensensor (MPU6050)
1x Taster-Button
6x Jumperkabel


//Vollständiger Code

Robotersteuerung_GyroAccelSensor.jpg

Steuerung per Controller

Um den UR10e mit einem PlayStation-4-Controller zu steuern, nutzten wir Python. Mithilfe des Plug-ins „pygame” - https://www.pygame.org/wiki/GettingStarted - konnten wir die Joystick-Daten auslesen und sogar viele weitere Controller verwenden. Der linke Joystick dient dazu, den Roboterarm in der xy-Ebene entlang des Drahts zu lenken. Mit dem rechten Stick wird der vorderste Teil des Arms um die Z-Achse gedreht. Da die Joysticks nicht perfekt mittig liegen, wenn man sie nicht berührt, entsteht eine dauerhafte, sehr langsame Bewegung des Arms. Um dies zu umgehen, bauten wir eine Deadzone in den Joystick ein. Erst wenn man den Joystick über ein bestimmtes Maß hinaus bewegt, wird der Input an den Roboter weitergeleitet. Die Steuerung kann jederzeit durch Drücken der Kreis-Taste beendet werden.

Screenshot 2025-09-26 133329.png

Steuerung per SpaceMouse Wireless

SpaceMouse.webp

1. Voraussetzungen

Um die SpaceMouse als Eingabegerät für den UR10e-Roboter zu verwenden, waren folgende Komponenten notwendig:

Hardware:

- UR10e Roboterarm

- SpaceMouse Wireless (3Dconnexion)

- USB-Kabel (wichtig: für zuverlässige Steuerung musste die SpaceMouse per Kabel angeschlossen werden)

- Laptop mit Python (Windows)

- Router, der den Laptop mit dem UR10e verbindet

Software:

- Python 3.10 oder älter (neuere Versionen verursachen Probleme mit pygame und hidapi)

Abhängigkeiten:

- hidapi (für HID-Geräte wie SpaceMouse)

- pyspacemouse (zum Auslesen der SpaceMouse-Daten)

- ggf. pygame (wurde in anderen Tests mit PS4-Controller benötigt)

2. Verbindungsaufbau

Die Kommunikation mit dem UR10e erfolgte über eine TCP/IP-Socket-Verbindung:

Die SpaceMouse wurde über USB an den Laptop angeschlossen.

(Die kabellose Nutzung über den Wireless-Dongle war nicht zuverlässig und wurde daher nicht eingesetzt.)

Der Laptop war per Router mit dem UR10e verbunden.

Der UR10e war über seine Standard-IP (z. B. 192.168.1.100) erreichbar.

Port 30002 wurde genutzt, um Befehle direkt an den Roboter zu senden.

Im Python-Skript wurde die Socket-Verbindung aufgebaut und der SpaceMouse-Datenstrom eingelesen.

3. Funktionsweise des Skripts

Das Skript bestand aus folgenden Schritten:

Initialisierung:

- Aufbau der TCP-Verbindung zum Roboter.

- Öffnen der SpaceMouse mit pyspacemouse.open().

Echtzeitsteuerung:

- Die SpaceMouse liefert kontinuierlich Translations- und Rotationswerte (in 6 Freiheitsgraden, 6DoF).

Diese Werte wurden skaliert und mit einer Begrenzung versehen, um eine maximale Geschwindigkeit nicht zu überschreiten, um einen Emergency Stop zu vermeiden.

Befehle an den Roboter:

Die Werte wurden per speedl()-Befehl an den UR10e geschickt.

Dadurch bewegte sich der Roboter proportional zur Eingabe an der SpaceMouse.

Beispiel-Skriptbefehl:

speedl([dx, dy, dz, rx, ry, rz], 0.25, 0.5)

0.25 = maximale Geschwindigkeit

0.5 = maximale Beschleunigung

Mit Ctrl+C konnte das Skript beendet werden.

4. Nutzung in der Praxis

Die SpaceMouse wurde direkt als intuitives Steuergerät genutzt:

Schieben = lineare Bewegung in X/Y

Hochziehen/Runterdrücken = lineare Bewegung in Z

Drehen = Rotation des TCP (Werkzeugkoordinatensystem)

Die Geschwindigkeit war feinfühlig steuerbar:

Leichtes Drücken → langsame Bewegung

Starkes Drücken → schnellere Bewegung

5. Fazit

Mit der SpaceMouse konnten wir den UR10e passabel steuern, fast wie mit einem 6D-Joystick. Die Steuerung war jedoch recht ungewohnt.

Die Python-Integration war dank pyspacemouse und hidapi möglich, erfordert aber eine kompatible Python-Version (≤ 3.10).

In Kombination mit einem Router und TCP-Verbindung zum UR10e war eine direkte Echtzeitsteuerung machbar.

Demo Videos + Fazit

Fazit

Unser Projekt haben wir nicht auf der Werkschau ausstellen lassen, weil es noch nicht ganz ausgereift und ziemlich fragil war. Man hätte es nicht ohne Aufsicht lassen können ^^'

Es hat eine krasse Entwicklung durchgemacht – von den anfänglichen Ideen bis zum finalen Prototypen. Das Semester war recht kurz, weshalb wir uns nicht zu lange an einzelnen Dingen aufhalten konnten. Trotz der Zweifel mitten im Prozess sind wir am Ende echt happy und überrascht, dass überhaupt etwas Funktionierendes dabei herauskam!

Es war eine spannende Erfahrung, mit so einer großen Gruppe zu arbeiten und die Aufgaben untereinander aufzuteilen. Die Kunst besteht ja auch darin, am Ende alles so zusammenzubringen, dass es stimmig wirkt. Die Arbeit mit dem Roboter war manchmal herausfordernd, weil wir öfter „Emergency Stops“ hatten, als uns lieb war, und ihn ständig herunterfahren und wieder anschalten mussten...

Nichtsdestotrotz war das einfach mal etwas Neues und natürlich auch spaßig, wenn alles gut lief. 

Die künstlerische Freiheit in dem Kurs war ebenfalls super, um verrückte Ideen auszuprobieren. Natürlich kann man sich fragen, warum ein Roboter überhaupt von uns gesteuert den Draht entlangfahren sollte. Auch wenn das vielleicht sinnlos scheint, war es einfach spaßig und hat den Schwierigkeitsgrad deutlich erhöht :)