Zum Hauptinhalt springen
Version: 3.5.x

06. Kombiniert (Inverse3 Wireless VerseGrip)

Anleitung für zwei Geräte: Richten Sie den Griff aus und halten Sie eine Taste gedrückt, um den Inverse3 in diese Richtung zu bewegen. Der Cursor ist auf einen kugelförmigen Arbeitsbereich beschränkt.

Was Sie lernen werden:

  • Das Auslesen von zwei Gerätetypen im selben Statusrahmen (inverse3 und wireless_verse_grip)
  • Ermitteln der Ausrichtungsrichtung des Griffs anhand seiner Quaternion (lokal +Y Achse)
  • Verwendung von set_cursor_position den Cursor auf ein berechnetes Ziel zu bewegen
  • Das Ziel in einen sicheren Arbeitsbereich einbetten – Minverse einen kleineren Radius als Inverse3
  • Festlegen einer Arbeitsbereichsvoreinstellung (arm_front_centered), sodass der Ursprung in der Mitte der Strecke liegt

Arbeitsablauf

  1. Entdecken Sie beide Geräte:
    • C++ Abfrage nach Varianten GET /devices beim Start über HTTP, dann eine Kalibrierungsaufforderung anzeigen und auf die Eingabetaste warten.
    • Python liest beide Geräte-IDs aus dem ersten WebSocket-Status-Frame aus.
  2. Registrieren Sie die Sitzungsprofil und festlegen configure.preset: arm_front_centered bei der ersten Nachricht (Einmal-Handshake).
  3. Bei jedem Ticken: den Griff lesen orientation und buttons.{a, b} Zustand.
  4. Wenn eine Bewegungs-Taste gedrückt gehalten wird, berechne die Richtung des Griffs im Weltraum (R(q) · ĵ — die gedrehte Einheit um die Y-Achse) und summieren sie an der Zielposition, skaliert um SPEED.
  5. Klemmen Sie das Ziel innerhalb der Arbeitsbereichskugel fest und senden Sie es über set_cursor_position.
  6. (Nur Python) Passe den Radius der Kugel an die Geräteeinstellungen an config.typeminverse = 0,04 m, alles andere = 0,10 m.

Parameter

NameStandardZweck
SPEED0.01 m/TickBewegungsschritt, während eine Taste gedrückt gehalten wird
RADIUS_INVERSE30.10 mArbeitsbereichsklemmradius für Inverse3 Inverse3x
RADIUS_MINVERSE0.04 mArbeitsbereichsklammerradius für Minverse nur Python – in C++ fest codiert) 0.10)
PRINT_EVERY_MS200Telemetrie-Drosselklappe
Name des Sitzungsprofilsco.haply.inverse.tutorials:combinedIdentifiziert diese Simulation im Haply
Vor dem Start kalibrieren
  • Lassen Sie den Inverse3 (oder setzen Sie den Griff auf das Tintenfass und warten Sie, bis die LED dauerhaft leuchtet).
  • Nehmen Sie den Griff vom Tintenfass ab.
  • Halten Sie A oder B gedrückt und drehen Sie den Griff – der Cursor bewegt sich in die Richtung, in die der Griff zeigt.

Statusfelder gelesen

Aus dem Zustandsrahmen pro Takt:

  • data.inverse3[0].state.cursor_positionvec3
  • data.wireless_verse_grip[0].state.orientationquaternion
  • data.wireless_verse_grip[0].state.buttons.{a, b, c} — Boolesche Werte
  • (Python, nur das erste Bild) data.inverse3[0].config.type — wählt Minverse von Inverse3 Minverse aus
  • (Python, nur das erste Bild) data.inverse3[0].status.calibrated — fordert den Benutzer auf, wenn der Wert „false“ ist

Senden / Empfangen

Die mathematische Umwandlung von Quaternionen in Richtungen (Drehen +Y von R(q)) und die Sphärenklemme sind klassische Elemente der linearen Algebra – siehe die Quelldateien. Die Inverse-API-Seite umfasst den Handshake sowie die pro Tick set_cursor_position.

Einzelne asynchrone Schleife. Python liest beide Geräte-IDs aus dem ersten Status-Frame; der Handshake fügt das Profil hinzu + configure.preset: arm_front_centered zum ersten set_cursor_position.

async with websockets.connect(URI) as websocket:
while True:
msg = await websocket.recv()
data = json.loads(msg)

if first_message:
first_message = False
inverse3_id = data["inverse3"][0]["device_id"]
grip_id = data["wireless_verse_grip"][0]["device_id"]
radius = get_workspace_radius(data["inverse3"][0].get("config", {}))

# Handshake: profile + preset + first position command
request_msg = {
"session": {"configure": {"profile": {"name": SLUG}}},
"inverse3": [{
"device_id": inverse3_id,
"configure": {"preset": {"preset": "arm_front_centered"}},
"commands": {"set_cursor_position": {"position": position}},
}],
}
else:
# Per tick: update position from grip pointing direction (classic math, not shown), send
request_msg = {
"inverse3": [{
"device_id": inverse3_id,
"commands": {"set_cursor_position": {"position": position}},
}],
}

await websocket.send(json.dumps(request_msg))

Quelle: Python · C++ · C++ Glaze

Siehe auch: Steuerbefehle (set_cursor_position) · Typen (Quaternion, vec3) · Mount & Arbeitsbereich (Voreinstellungen) · Tutorial 03 (Wireless VG) · Lernprogramm 05 (Positionssteuerung)