Zum Haupttext springen

06. Integrationsbeispiel (Inverse3 + kabelloser VerseGrip)

Dies ist eine Anleitung für die Verwendung von zwei Geräten. Wenn Sie den Griff in die gewünschte Richtung ausrichten und die Taste gedrückt halten, bewegt sich der Cursor in diese Richtung Inverse3 . Der Cursor ist auf den Bereich innerhalb des kugelförmigen Arbeitsbereichs beschränkt.

Lerninhalte:

  • Lesen von zwei Gerätetypen im selben Status-Frame (inverse3 sowie wireless_verse_grip)
  • QuaternionDie Richtung ermitteln, in die der Griff zeigt (lokal +Y (Glückwunsch)
  • set_cursor_positionDen Cursor auf den mithilfe von … berechneten Zielpunkt bewegen
  • Den Zielpunkt auf den sicheren Arbeitsbereich beschränken — Minverse verwendet einen kleineren Radius als Inverse3
  • so, dass der Ursprung in der Mitte des Erfassungsbereichs liegt Arbeitsbereichsvoreinstellungen (arm_front_centered) Einrichten

Arbeitsablauf​

  1. Zwei Geräte suchen:
    • C++ Die Version wird beim Start über HTTP abgerufen GET /devicesruft diese ab, gibt anschließend eine Kalibrierungsanleitung aus und wartet auf die Eingabe der ENTER-Taste.
    • Pythonliest im ersten WebSocket-Status-Frame beide Geräte-IDs aus.
  2. In der ersten Nachricht Sitzungsprofilregistrieren und configure.preset: arm_front_centeredwird eingestellt (einmaliger Handshake).
  3. Bei jedem Schlag der orientation sowie buttons.{a, b} Liest den Status aus.
  4. Wenn die Bewegungstaste gedrückt gehalten wird, richtet sich die Ausrichtung des Griffs im Weltraum (R(q) · ĵ — die gedrehte Einheit (um die Y-Achse) berechnen und diese SPEEDauf die Zielposition skalieren und dort akkumulieren.
  5. Nachdem der Zielpunkt auf den Bereich innerhalb des Arbeitsraums beschränkt wurde, set_cursor_positionwird darüber übertragen.
  6. (Gilt nur für Python) Das Gerät config.typePassen Sie den Radius des Kreises entsprechend an — minversebeträgt 0,04 m, ansonsten 0,10 m.

Parameter​

NameStandardwertVerwendungszweck
SPEED0.01 m/TickBewegungsabstand, solange die Taste gedrückt gehalten wird
RADIUS_INVERSE30.10 mInverse3 / Begrenzter Radius des Arbeitsbereichs von Inverse3x
RADIUS_MINVERSE0.04 mDer begrenzte Radius des Arbeitsbereichs von Minverse (gilt nur für Python – C++ ist 0.10(als Fixpunkt)
PRINT_EVERY_MS200Begrenzung der Telemetrie-Ausgabeintervalle
Name des Sitzungsprofilsco.haply.inverse.tutorials:combinedHaply Der Wert, der diese Simulation im Hub identifiziert
Vor der Ausführung kalibrieren
  • Lassen Sie Inverse3 die automatische Kalibrierung durchführen (oder legen Sie den Griff auf das Tintenfass und warten Sie, bis die LED aufleuchtet).
  • Trennen Sie den Griff vom Tintenfass.
  • Drehen Sie den Griff, während Sie die Taste A oder B gedrückt halten – der Cursor bewegt sich in die Richtung, in die der Griff zeigt.

Feld „Lesestatus“​

Lesen Sie die folgenden Werte aus dem Status-Frame, der bei jedem Tick übertragen wird:

  • 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} — Boolesche Werte
  • (Python, nur im ersten Frame) data.inverse3[0].config.type — Wählen Sie einen der Radien „Inverse3“ und „ Minverse “ aus.
  • (Python, nur im ersten Frame) data.inverse3[0].status.calibrated — Wenn der Wert „false“ ist, wird der Benutzer darüber informiert.

Senden / Empfangen​

Berechnung der Richtung anhand von Quaternionen (R(q)로 +Y(Rotationsoperationen) und die Verarbeitung der internen Begrenzungen der Kugel sind typische lineare algebraische Operationen. Weitere Informationen finden Sie in der Quelldatei. Auf der Seite der Inverse-API werden bei jedem Handshake und jedem Tick set_cursor_positionbesteht aus.

Es besteht aus einer einzigen asynchronen Schleife. Python liest im ersten Status-Frame die beiden Geräte-IDs. Beim Handshake wird zunächst set_cursor_position Profil beim Aufruf und configure.preset: arm_front_centeredfüge ich hiermit bei.

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

Tutorial 06 wird zusammen mit dem SDK auch lokal installiert – im Installationsverzeichnis des Dienstes unter tutorials/06-haply-inverse-combined/ Sie finden diese im Ordner.

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

Verwandte Themen: Steuerbefehl (set_cursor_position) · Typ (Quaternion, vec3) · Halterungen und Arbeitsbereiche (Voreinstellungen) · Tutorial 03 (Drahtloses VG) · Tutorial 05 (Positionssteuerung)