Zum Hauptinhalt springen

06. Integration (Inverse3 + kabelloser VerseGrip)

Dies ist ein Tutorial für zwei Geräte. Wenn Sie den Griff in eine Richtung ausrichten und die Taste gedrückt halten, bewegt sich der Cursor von „ Inverse3 “ in diese Richtung. Der Cursor ist auf den kugelförmigen Arbeitsbereich beschränkt.

Lerninhalte:

  • Zwei Arten von Geräten innerhalb desselben State-Frames (inverse3 und wireless_verse_grip) auslesen
  • Quaternion Ausgehend von der Ausrichtung des Griffs (lokal) +Y (Welle) herausnehmen
  • set_cursor_position den Cursor auf das berechnete Ziel bewegen
  • Das Ziel auf den sicheren Arbeitsbereich beschränken. „Minverse “ verwendet einen Radius, der kleiner ist als „ Inverse3 “.
  • Voreinstellungen für den Arbeitsbereich(arm_front_centered) einstellen, sodass der Ursprung in der Mitte des Erreichbarkeitsbereichs liegt

Workflow​

  1. Beide Geräte werden erkannt:
    • C++ Die Version wird beim Start über HTTP GET /devices ruft diese ab, zeigt die Kalibrierungsaufforderung an und wartet auf die Eingabe von ENTER.
    • Python liest die IDs beider Geräte aus dem ersten WebSocket-Status-Frame aus.
  2. In der ersten Nachricht Sitzungsprofil registrieren undconfigure.preset: arm_front_centered Einrichten (Einmaliger Handshake).
  3. Bei jedem Tick wird der Griff orientation und buttons.{a, b} Liest den Status aus.
  4. Wenn die Verschiebungstaste gedrückt ist, die Richtung im Weltraum des Griffs (R(q) · ĵ, die Einheit nach der Drehung (+Y-Achse) berechnen und,SPEED Der skalierte Wert wird zur Zielposition addiert.
  5. Das Ziel auf den Arbeitsbereichsbereich beschränken und,set_cursor_position und sende es ab.
  6. (nur Python) Das Gerät config.type Passen Sie den Radius der Kugel entsprechend an.minverse In diesem Fall beträgt sie 0,04 m, ansonsten 0,10 m.

Parameter​

NameStandardVerwendungszweck
SPEED0.01 m/TickBewegungsschritte während des Tastendrucks
RADIUS_INVERSE30.10 mInverse3 / Begrenzungsradius des Arbeitsbereichs für Inverse3x
RADIUS_MINVERSE0.04 mMinverse Begrenzungsradius des Arbeitsbereichs (nur Python – C++ ist 0.10 (fest)
PRINT_EVERY_MS200Begrenzung der Übertragungshäufigkeit von Telemetriedaten
Name des Sitzungsprofilsco.haply.inverse.tutorials:combinedHaply Diese Simulation im Hub identifizieren
Vor der Ausführung kalibrieren
  • Inverse3 Führen Sie eine Selbstkalibrierung durch (oder legen Sie den Griff in das Tintenfass und warten Sie, bis die LED aufleuchtet).
  • Entfernen Sie den Griff vom Tintenfass.
  • Halten Sie die Taste A oder B gedrückt und drehen Sie den Griff. Der Cursor bewegt sich in die Richtung, in die der Griff zeigt.

Das Feld „state“ auslesen​

Aus dem „state“-Frame jedes Ticks wird Folgendes ausgelesen:

  • data.inverse3[0].state.cursor_position — vec3
  • data.wireless_verse_grip[0].state.orientation — quaternion
  • data.wireless_verse_grip[0].state.buttons.{a, b, c} — Wahr-Falsch-Wert
  • (Python, nur der erste Frame)data.inverse3[0].config.type — Wählen Sie aus, ob der Radius von „ Inverse3 “ oder „ Minverse “ verwendet werden soll
  • (Python, nur der erste Frame)data.inverse3[0].status.calibrated — Wenn „false“, wird dem Benutzer eine Eingabeaufforderung angezeigt

Senden / Empfangen​

Berechnung der Richtung anhand von Quaternionen (R(q) de +Y (Drehung) und die Klemmung mittels Kugeln sind klassische Berechnungen der linearen Algebra. Einzelheiten finden Sie in der Quelldatei. Auf der Seite der Inverse-API sind der Handshake und bei jedem Tick set_cursor_position ruft auf.

Es handelt sich um eine einzelne asynchrone Schleife. Python liest die IDs beider Geräte aus dem ersten State-Frame aus. Beim Handshake wird zunächst der set_cursor_position mit Profil und configure.preset: arm_front_centered wird gewährt.

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))
Im SDK-Installationsprogramm enthalten

Das Tutorial 06 ist ebenfalls zusammen mit dem SDK lokal installiert. Im Installationsverzeichnis des Dienstes unter tutorials/06-haply-inverse-combined/ Siehe dazu.

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

Siehe auch: Steuerbefehle (set_cursor_position) · Typ (Quaternion, vec3) · Halterung und Arbeitsbereich (Voreinstellung) · Tutorial 03 (Wireless VG) · Tutorial 05 (Positionssteuerung)