Zum Hauptinhalt springen

02. VerseGrip drucken

Gibt die Echtzeit-Ausgangsdaten des ersten kabelgebundenen VerseGrip aus (Quaternion + Eulerwinkel Z-X-Y), die Pegel der Hall-Sensoren sowie den Status der Tasten.

Lerninhalte:

  • Aus dem Status-Frame lesen quaternion Haltung
  • Umwandlung von Quaternionen in Eulerwinkel Z-X-Y in Grad (wobei +X rechts, +Y vorne und +Z oben bedeutet)
  • wird probe_orientation Befehl zum Aufrechterhalten des Betriebs als unabhängiger Beobachter
  • Ein Modell, bei dem nur die erste Nachricht einen Handshake erfordert (wie in Tutorial 01 )

Arbeitsablauf​

  1. Öffnen Sie den Link ws://localhost:10001 WebSocket und warte auf den ersten Status-Frame.
  2. von verse_grip Das erste „VerseGrip“-Kabel im Array auswählen device_id。
  3. Verwendung Sitzungskonfiguration sowie für jedes Gerät probe_orientation Anforderung zur Erstellung eines Befehls zur Aufrechterhaltung der Aktivität (Dies ist ein Befehl für ein leeres Objekt, der sicherstellt, dass die Daten zur Haltehaltung kontinuierlich im Statusframe erscheinen).
  4. Anfrage senden, dann entfernen session Feld – Es wird ausschließlich für einen einmaligen Handshake verwendet.
  5. In jedem folgenden Frame werden die Quaternionen in Euler-Winkel umgewandelt und die Telemetriedaten mit einer Drosselung ausgegeben. In jedem Zyklus wird der Keep-Alive-Befehl erneut gesendet.

Parameter​

BezeichnungStandardwertVerwendungszweck
URIws://localhost:10001URL des WebSocket-Simulationskanals
PRINT_EVERY_MS100Intervall für die Drosselung der Konsolenausgabe
Name der Sitzungskonfigurationco.haply.inverse.tutorials:print-verse-gripZur Identifizierung dieser Simulation im „ Haply Hub“
Euler-Winkel-Konvention

Die Umrechnung erfolgt im Anwendungskoordinatensystem +X right, +Y forward, +Z up Die Reihenfolge der Innenrotation Z-X-Y (Gieren → Nicken → Rollen).Bitte nichtVerwendung glm::eulerAngles——Da es sich an unterschiedliche Konventionen hält, werden hier falsche Ergebnisse angezeigt. Die mathematischen Berechnungen sind in allen drei Sprachversionen identisch; die konkreten Formeln finden Sie im Quellcode.

Wann ist dies erforderlich? probe_orientation

Nur wenn die Sitzungnoch nichtWenn Sie einen Befehl an Inverse3 senden,probe_orientation Erst dann ist es sinnvoll. Sobald Sie Befehle (Kraft, Position, Drehmoment usw.) an Inverse3 senden, übermittelt der Dienst automatisch in jedem Status-Frame die Lage-Daten des gekoppelten VerseGrip – ganz ohne Abfrage.probe_orientation Gilt nur für eigenständige Geräte zur Handhaltungsüberwachung wie das in diesem Tutorial vorgestellte.

Gelesene Statusfelder​

Aus data.verse_grip[0].state:

  • orientation — quaternion(w, x, y, z)
  • hall — Messwerte des Hall-Sensors vom Typ „Integer“
  • button — Boolesche Werte
  • transform.rotation — Drehung des Arbeitsraums (quaternion); Bei Geräten, die ausschließlich die Lage ausgeben, sind Position und Skalierung nicht relevant und werden daher nie ausgegeben.
Teilweise Aktualisierung der Semantik

Wenn transform.rotation entspricht der Einheitsquaternion {w:1,x:0,y:0,z:0} wird weggelassen. Bitte geben Sie beim Auslesen einen Standardwert an. Um dieses Feld immer zu erhalten, aktivieren Sie serialization/explicit_fields。

Senden / Empfangen​

WebSocket-Zyklus: Empfang eines Status-Frames, Erstellung und Rücksendung der Handshake-Nachricht sowie probe_orientation Keep-Alive-Befehl. Die erste Nachricht enthält die Verbindungskonfiguration; alle nachfolgenden Frames enthalten lediglich den Keep-Alive-Befehl.

Eine einzelne asynchrone Schleife –recv() → Befehl zum Erstellen → send() → Wiederholung.

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

if first_message:
first_message = False
device_id = data["verse_grip"][0]["device_id"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-verse-grip"}}},
"verse_grip": [{
"device_id": device_id,
"commands": {"probe_orientation": {}} # empty — keepalive
}]
}

await websocket.send(json.dumps(request_msg))
request_msg.pop("session", None) # one-shot handshake

Befehlszeilenargumente (Python)​

Die Python-Variante akzeptiert dieselben zwei Parameter wie Tutorial 01:

  • --full — Die ursprünglichen JSON-Lastdaten sollen in formatierter Form ausgegeben werden, nicht als einzeilige Zusammenfassung.
  • --query-config — Bei jedem Ausgabzyklus erneut einspeisen session.force_render_full_state, sodass jedes Einzelbild config Blöcke (Gerätetyp, Firmware, Installationsänderungen usw.) und nicht nur Statusänderungen. Dies ist besonders nützlich, wenn Debugging-Einstellungen in Echtzeit geändert werden.

Die beiden Parameter können kombiniert verwendet werden. Die C++-Variante bietet diese Parameter nicht an.

Im Lieferumfang des SDK-Installationsprogramms enthalten

Das Tutorial 02 wird ebenfalls zusammen mit dem SDK lokal installiert – bitte im Installationsverzeichnis des Dienstes unter tutorials/02-haply-inverse-print-verse-grip/ dort suchen.

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

Verwandte Themen: Typ (Quaternionen) · Steuerbefehle (probe_orientation) · WebSocket-Protokoll · Tutorial 03 (Wireless VG)