Proxi AI — Spielzeug-Roboter mit natürlicher Sprache steuern
Firmware, Bluetooth-Brücke und Agent-Skill für den KOSMOS-Proxi: einmal flashen, danach hört der Roboter über Bluetooth LE auf Textbefehle. Was die Befehle schickt, ist ihm egal — ein Skript, ein curl, oder ein KI-Agent, der aus "mach mal was Lustiges" eine Choreografie baut. firmware/ MakeCode-Projekt (TypeScript) und fertige .hex für V1 und V2 bridge/ BLE-Brücke und HTTP-API, einzige Abhängigkeit ist bleak agent/ Skill-Definition: Alltagssprache -> Befehle tools/ Quelltext aus .hex extrahieren, Musik-Tabellen prüfen docs/ Protokoll, Einrichtung, Hardware, Lizenzen Zwei Dinge, die sonst nirgends stehen und in docs/HARDWARE.md dokumentiert sind: die Pin-Belegung des Roboters ist nicht öffentlich, sie wurde aus den mitgelieferten .hex-Dateien rekonstruiert (tools/hex_source.py holt sie heraus). Und der Ton braucht zwingend eine ganzzahlige Frequenz sowie Pin P0 — sonst kracht der Lautsprecher, der Aufruf hängt und die Bluetooth- Verbindung stirbt. Am echten Roboter durchgetestet: Verbindung, Sensoren, Display, 41 Sekunden Musik am Stück, alle Bewegungsrichtungen, Musik und Fahren gleichzeitig, Tanzfiguren, Not-Stopp mitten in der Bewegung, Autostart nach Neustart. MIT-Lizenz. Die Hardware-Extension stammt von kaku111 (TobbieII) und die Notendaten aus pxt-microbit, beide ebenfalls MIT — siehe THIRD-PARTY-NOTICES.
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
# bigdance.txt — große Choreografie in vier Teilen, rund 30 Sekunden
|
||||
#
|
||||
# python3 proxi_bridge.py --script bigdance.txt
|
||||
#
|
||||
# ===========================================================================
|
||||
# WIE SO EINE CHOREOGRAFIE GEBAUT WIRD
|
||||
# ===========================================================================
|
||||
#
|
||||
# 1. MELODY blockiert die Tanzfiguren, MOVE und TURN nicht.
|
||||
# DANCE, STAMP und SHAKE teilen sich mit MELODY einen Arbeiter und würden
|
||||
# erst NACH der Musik loslaufen. Zur Musik getanzt wird deshalb mit MOVE und
|
||||
# TURN — die starten sofort.
|
||||
#
|
||||
# 2. Melodien reihen sich von selbst aneinander.
|
||||
# Schickt man MELODY:B während A läuft, wartet B und startet nahtlos,
|
||||
# sobald A fertig ist. So entstehen mehrteilige Stücke.
|
||||
#
|
||||
# 3. Die Länge jeder Melodie ist bekannt — danach wird die Zeit eingeteilt:
|
||||
# ENTERTAINER 3.4s | FUNK 4.0s | CHASE 8.0s | NYAN 16.0s
|
||||
# Zusammen 31.4 Sekunden, die mit Bewegung gefüllt werden wollen.
|
||||
#
|
||||
# 4. WAIT ist immer rund 150 ms kürzer als die Bewegung davor.
|
||||
# So lange braucht die Brücke selbst zwischen zwei Befehlen. Ohne diesen
|
||||
# Abzug läuft der Tanz der Musik langsam davon.
|
||||
#
|
||||
# 5. Tanzschritte entstehen aus drei Bausteinen:
|
||||
# Wackeln TURN:LEFT:220 / TURN:RIGHT:220 im Wechsel
|
||||
# Stampfen MOVE:FWD:200 / MOVE:BWD:200 im Wechsel
|
||||
# Kurve MOVE:FWD:0 plus TURN währenddessen, danach MOVE:STOP
|
||||
# Kurze Zeiten wirken hektisch, lange gemütlich — das ist der Rhythmus.
|
||||
#
|
||||
# 6. Jeder Teil bekommt ein eigenes Gesicht. Das macht aus einer Bewegungsfolge
|
||||
# eine Aufführung.
|
||||
#
|
||||
# 7. Am Ende immer STOP.
|
||||
#
|
||||
# Gleich viel vorwärts wie rückwärts halten — dann bleibt Proxi ungefähr
|
||||
# da stehen, wo er losgetanzt ist, und fällt nicht vom Tisch.
|
||||
#
|
||||
|
||||
FACE:ASLEEP
|
||||
|
||||
# --- TEIL 1: Aufwachen (Entertainer, 3.4s) ---
|
||||
MELODY:ENTERTAINER
|
||||
WAIT:250
|
||||
FACE:SURPRISED
|
||||
TURN:LEFT:300
|
||||
WAIT:230
|
||||
TURN:RIGHT:600
|
||||
WAIT:550
|
||||
TURN:LEFT:300
|
||||
WAIT:230
|
||||
WAIT:1240
|
||||
|
||||
# --- TEIL 2: Groove (Funk, 4.0s) ---
|
||||
MELODY:FUNK
|
||||
FACE:HAPPY
|
||||
TURN:LEFT:420
|
||||
WAIT:320
|
||||
TURN:RIGHT:420
|
||||
WAIT:320
|
||||
TURN:LEFT:420
|
||||
WAIT:320
|
||||
TURN:RIGHT:420
|
||||
WAIT:320
|
||||
MOVE:FWD:500
|
||||
WAIT:410
|
||||
MOVE:BWD:500
|
||||
WAIT:410
|
||||
WAIT:700
|
||||
|
||||
# --- TEIL 3: Jagd (Chase, 8.0s) ---
|
||||
MELODY:CHASE
|
||||
FACE:SILLY
|
||||
TURN:LEFT:200
|
||||
WAIT:100
|
||||
TURN:RIGHT:200
|
||||
WAIT:100
|
||||
TURN:LEFT:200
|
||||
WAIT:100
|
||||
TURN:RIGHT:200
|
||||
WAIT:100
|
||||
TURN:LEFT:200
|
||||
WAIT:100
|
||||
TURN:RIGHT:200
|
||||
WAIT:100
|
||||
TURN:LEFT:200
|
||||
WAIT:100
|
||||
TURN:RIGHT:200
|
||||
WAIT:100
|
||||
FACE:NORTH
|
||||
MOVE:FWD:0
|
||||
TURN:LEFT:700
|
||||
WAIT:650
|
||||
TURN:RIGHT:700
|
||||
WAIT:650
|
||||
MOVE:STOP
|
||||
MOVE:BWD:900
|
||||
WAIT:850
|
||||
WAIT:2650
|
||||
|
||||
# --- TEIL 4: Finale (Nyan, 16.0s) ---
|
||||
MELODY:NYAN
|
||||
FACE:FABULOUS
|
||||
MOVE:FWD:220
|
||||
WAIT:130
|
||||
MOVE:BWD:220
|
||||
WAIT:130
|
||||
MOVE:FWD:220
|
||||
WAIT:130
|
||||
MOVE:BWD:220
|
||||
WAIT:130
|
||||
FACE:HEART
|
||||
TURN:LEFT:230
|
||||
WAIT:140
|
||||
TURN:RIGHT:230
|
||||
WAIT:140
|
||||
TURN:LEFT:230
|
||||
WAIT:140
|
||||
TURN:RIGHT:230
|
||||
WAIT:140
|
||||
TURN:LEFT:230
|
||||
WAIT:140
|
||||
TURN:RIGHT:230
|
||||
WAIT:140
|
||||
FACE:DIAMOND
|
||||
MOVE:FWD:0
|
||||
TURN:LEFT:1200
|
||||
WAIT:1150
|
||||
TURN:RIGHT:1200
|
||||
WAIT:1150
|
||||
MOVE:STOP
|
||||
FACE:SILLY
|
||||
TURN:RIGHT:180
|
||||
WAIT:80
|
||||
TURN:LEFT:180
|
||||
WAIT:80
|
||||
TURN:RIGHT:180
|
||||
WAIT:80
|
||||
TURN:LEFT:180
|
||||
WAIT:80
|
||||
TURN:RIGHT:180
|
||||
WAIT:80
|
||||
TURN:LEFT:180
|
||||
WAIT:80
|
||||
FACE:TARGET
|
||||
MOVE:BWD:200
|
||||
WAIT:110
|
||||
MOVE:FWD:200
|
||||
WAIT:110
|
||||
MOVE:BWD:200
|
||||
WAIT:110
|
||||
MOVE:FWD:200
|
||||
WAIT:110
|
||||
FACE:FABULOUS
|
||||
TURN:LEFT:260
|
||||
WAIT:170
|
||||
TURN:RIGHT:260
|
||||
WAIT:170
|
||||
TURN:LEFT:260
|
||||
WAIT:170
|
||||
TURN:RIGHT:260
|
||||
WAIT:170
|
||||
FACE:HEART
|
||||
TURN:LEFT:1500
|
||||
WAIT:1450
|
||||
TURN:RIGHT:1500
|
||||
WAIT:1450
|
||||
STOP
|
||||
FACE:HEART
|
||||
Reference in New Issue
Block a user