Imitate me, pib!

Die Idee hinter diesem Projekt ist es, pib zu ermöglichen, die Bewegung eines Arms zu imitieren. Das gibt uns eine einfache Möglichkeit, pib zu animieren, ohne dass wir programmatisch steuern müssen. Im Moment: noch eine wilde Idee :-) Mal sehen, ob wir das hinbekommen… Diese Projektseite dokumentiert unseren Fortschritt und soll eine unterhaltsame Anleitung sein, wie man es selbst machen kann, wenn wir es schaffen.

Was bisher geschah

Zunächst einmal brauchen wir eine Möglichkeit, die Position des menschlichen Arms zu bestimmen. Es gibt viele Geräte auf dem Markt, und wie immer sollte unsere Wahl einfach lösbar, gut verfügbar und erschwinglich sein. Eine mögliche Wahl ist der LeapMotion-Controller, von dem wir schon vor einiger Zeit zwei Stück gekauft haben:

LeapMotion

Quelle: ultraleap.com

Als wir diesen bekamen, freuten wir uns sehr über die nette Python-API, die es wirklich sehr einfach machte, unsere erste App zum Laufen zu bringen. Das ist zwar schon ein paar Jahre her, aber was kann hier schon schiefgehen…

Äh… Eine aktuelle Suche zeigt: Unsere früher so geschätzte Python-API ist jetzt veraltet! Ultraleap sagt, dass das neue Gemini-Framework präziser ist als die frühere API (ja!), aber es gibt nur noch eine C-API. Und komplett auf C umzusteigen ist keine Option :-D Nun, lasst uns weiter suchen und sehen, ob wir einen pyhton-wrapper zum Laufen bringen können…

Bei der Suche auf github haben wir gesehen, dass andere Entwickler unseren Bedarf teilen und bereits an der Sache gearbeitet haben:

  • https://github.com/seanschneeweiss/RoSeMotion/tree/master/app
  • https://github.com/RomanILL/Leap-Motion-Python-3.8

Nach dem Herunterladen und Installieren: Beide haben keine Daten vom Sensor ausgelesen. Es gibt also keine andere Möglichkeit, als es selbst zu tun… Jippee! :-D

In Python verpackter API-Zugang für LeapMotion

UltraLeap bietet alle seine Tools in einem einzigen Download-Paket an. Nachdem du alles installiert hast, kannst du den UltraLeap-Viewer verwenden, um LeapMotion in Aktion zu sehen:

Die erste Frage ist: Werden wir die C-API richtig nutzen können? Dann sehen wir uns an, wie man es in Python verwendet. Also, auf geht’s zur Schatzsuche!

Nach der Installation werden Beispiele für die C-API im samples-Ordner des sdk bereitgestellt. Um das Zeug unter Windows zu bauen, brauchst du außerdem cmake. Nach der Installation von cmake öffnest du eine Shell und gehst in den Samples-Ordner (vielleicht kopierst du zuerst das gesamte SDK an einen geeigneten Ort…) und gibst ein:

cmake .
cmake --build .

Das sollte reichen. Dann noch einen Ordner „Debug“ erstellen, in dem sich die ausführbaren Dateien befinden. Das Ausführen der PollingSample.exe in einer Shell zeigt das:

Arm-Koordinaten programmatisch erfasst: funktioniert!

Python ctypes Problem: Hilfe benötigt!

Unsere Hauptsteuerungssprache ist bisher Python, also liegt der Gedanke nahe, ein kleines C-Programm zu verwenden, um Daten von unserem LeapMotion abzurufen und diese Daten mit ctypes in Python zu übertragen. Ich habe die Sache unter Windows mit den VS-Tools ausprobiert, hm… Hat nicht wirklich funktioniert. Ich werde das so schnell wie möglich unter Linux ausprobieren, aber bis dahin haben wir uns einen Hack ausgedacht:

LeapMotion-Daten als json

Da ich ungeduldig bin, dieses Zeug zu testen, ist die Idee (bis wir etwas haben, das das richtig macht), alle Koordinaten in einem C-Programm zu erhalten und eine Dateischnittstelle zu benutzen, um sie als json zu schreiben. Unser pib-steering-python kann einen Watchdog verwenden, um auf Aktualisierungen in dieser Datei zu warten und pibs-Motoren zu aktualisieren, wenn ein Datei-Änderungsereignis eintritt. Weil es so einfach ist, hat es funktioniert! Hier ist der C-Code für den Polling-Ansatz. Du kannst es bauen, wenn du die Datei zum samples-folder und der CMakeLists.txt hinzufügst und dann cmake wie oben gezeigt verwendest. Eine .exe wird in deinem Debug-Ordner erscheinen…

Willst du sehen, wie die Ergebnisse bis jetzt aussehen? pib zeigt es dir in unserem neuesten Video!

Published On: Mai 6th, 2022