Zum Haupttext springen

07. Basis & Mount Spielplatz

des Geräts Mount-Konvertierunginteraktiv zu steuern und, configure.basis, configure.preset, configure.mountDies zeigt, wie sie auf der Ebene des Wire-Protokolls zusammenwirken. Ein horizontaler Untergrund sorgt dafür, dass der interaktive Fokus auf dem Befehl „configure“ verbleibt.

Lerninhalte:

  • Basispermutation Einstellungen ("XZY" → (Anwendungsrahmen in Richtung der Y-Achse nach oben)
  • Voreinstellungen(arm_front) Auswahl und Verständnis der Inhalte, aus denen sich die jeweilige Voreinstellung zusammensetzt
  • Neudefinition der Mount-Funktion zur Laufzeit mithilfe von Rotationsquaternionen (basierend auf Tastatureingaben)
  • Regel der gegenseitigen Ausschließung: mountWow presetwie Gerät konfigurieren Sie können nicht gleichzeitig in einem Block vorhanden sein
  • einmalig configure Funktionsweise: Bei jedem Tastendruck wird die „configure“-Meldung genau einmal gesendet.
  • (C++ Glaze) std::optionalModellierung mutual exklusiver Felder unter Verwendung von

Workflow​

  1. Sobald ich die erste Nachricht erhalte, Sitzungsprofil, configure.basis: "XZY", configure.preset: arm_frontwird übertragen. Für einen festen Boden set_cursor_force Die Übertragung wird gestartet.
  2. Bei jedem Tick wird der Y-Wert des Cursors gelesen und force_y = max(0, (floor_pos - y) * stiffness)wird berechnet und übertragen.
  3. Wenn der Benutzer die Taste zum Drehen der Halterung drückt, pending_configure = trueauf … einstellen.
  4. Beim nächsten Tick rotationdie folgende Transformation enthält, bei der es sich um ein Einheitsquaternion handelt (derzeit eine Kombination aus Pitch und Yaw in der Reihenfolge Z-dann-X): configure.mount Bildet einen Block. presetwird weggelassen. Die beiden Felder schließen sich auf der Leitung gegenseitig aus.
  5. Reset-Taste (R) hebt die Überschreibung auf. Beim nächsten „configure“ wird wieder presetwird verwendet.

Parameter​

NameStandardwertVerwendungszweck
BASIS"XZY"Achsenpermutation – Anwendungsrahmen mit positiver Y-Achse
DEVICE_PRESET / DEVICE_CONFIG_PRESET"arm_front"Benannte Voreinstellung – Ursprung ist die Gerätebasis
FLOOR_POS_Y0.0 mFeste Bodenebene (Anwendung Y)
STIFFNESS1000 k. A.Bodenfederkonstante
MOUNT_STEP_DEG10°Drehwinkel pro Tastendruck
PRINT_EVERY_MS200Telemetrie-Drosselklappe

Steuerung​

SchlüsselBewegung
W / SDas Gerät um ±10° um die X-Achse (Neigung) drehen
A / DDas Gerät um ±10° um die Z-Achse (Gierachse) drehen
RMount zurücksetzen — Auf Voreinstellung zurücksetzen
HSteuertasten anzeigen
QEnde
mountWow presetsind sich gegenseitig ausschließend

Der Dienst umfasst beide Felder Gerät konfigurieren Der Block wird abgelehnt. Wenn der Benutzer die Einbindung überschreibt, wird das Tutorial bei allen nachfolgenden „configure“-Schritten presetwird weggelassen. RWenn Sie darauf klicken, wird im nächsten Konfigurationsschritt presetdies wird wieder verwendet und mountwird ausgenommen.

Unterschiede bei den Eingabemodellen

Die C++-Variante liest zeilenweise Eingaben in einem Hintergrund-stdin-Thread ein (drücken Sie nach jeder Eingabe die ENTER-Taste). Python liest in der asynchronen Hauptschleife keyboard Da das Paket die Tastatureingaben in Echtzeit abfragt, ist die ENTER-Taste nicht erforderlich. Die Tasten und Befehle sind identisch.

Feld „Lesestatus“​

data.inverse3[i].stateDer dort abgelesene Wert:

  • cursor_position.y — vec3. Wird zur Berechnung des Durchflusses durch den Boden verwendet.
  • current_cursor_force — Wird für Telemetriezwecke gemeldet.

Senden / Empfangen​

Die Payload-Struktur ist bei allen Varianten identisch. Der Unterschied besteht darin, dass sich die einzelnen Varianten gegenseitig ausschließen. mount / preset Hier wird beschrieben, wie die Verzweigung aufgebaut ist und wie der Eingabe-Thread Signale an den WebSocket-Thread sendet.

In einer einzigen asynchronen Schleife keyboard Das Paket fragt die Tastatureingaben in Echtzeit ab. pending_configureist ein globales Flag, das vom Key-Handler gesetzt wird, und configure Bei jeder Blockübertragung wird es zurückgesetzt.

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["inverse3"][0]["device_id"]
# Handshake: profile + basis + preset
request_msg = {
"session": {"configure": {"profile": {"name": SLUG}}},
"inverse3": [{
"device_id": device_id,
"configure": build_configure_block(first_handshake=True),
# -> {"basis": {"permutation": "XZY"},
# "preset": {"preset": "arm_front"}}
}],
}
else:
handle_key_inputs() # may set pending_configure = True (classic, not shown)

y = data["inverse3"][0]["state"]["cursor_position"]["y"]
force_y = 0.0 if y > FLOOR_POS_Y else (FLOOR_POS_Y - y) * STIFFNESS

entry = {
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": force_y, "z": 0.0}}},
}
if pending_configure:
entry["configure"] = build_configure_block(first_handshake=False)
# -> {"mount": {...}} OR {"preset": {...}} (never both)
pending_configure = False

request_msg = {"inverse3": [entry]}

await websocket.send(json.dumps(request_msg))
Im Lieferumfang des SDK-Installationsprogramms enthalten

Tutorial 07 wird zusammen mit dem SDK auch lokal installiert. Im Installationsverzeichnis des Dienstes unter tutorials/07-haply-inverse-basis-and-mount/ist dort zu finden.

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

Verwandte Themen: Basis-Permutation · Mount & Workspace · Gerätekonfiguration · Steuerbefehl (set_cursor_force) · Typ (transform) · Tutorial 04 (Hallo Boden)