Zum Hauptinhalt springen

07. Fundament und Montage: Testgelände

Steuere interaktiv die Montageumwandlung des Geräts und zeigt, wie configure.basis, configure.preset et configure.mount arbeiten auf Protokollebene zusammen. Behält einen festen horizontalen Hintergrund bei, damit der interaktive Fokuspunkt auf den Konfigurationselementen verbleibt.

Was Sie lernen werden:

  • Eine Grundpermutation ("XZY" → Anwendungsmarkierung mit der Y-Achse nach oben)
  • Einen auswählen Voreinstellung (arm_front) und verstehen, was damit konfiguriert wird
  • Die Laufzeit-Implementierung durch ein Rotationsquaternion (über die Tastatur gesteuert) ersetzen
  • Die Regel der gegenseitigen Ausschließung: mount et preset können nicht im selben Block von Gerätekonfiguration
  • Punktuelle Semantik von configure : Bei jedem Tastendruck wird genau eine Konfigurationsnachricht gesendet
  • (C++ Glaze) Modellierung sich gegenseitig ausschließender Felder mit std::optional

Arbeitsablauf​

  1. Bei der ersten Nachricht: Senden Sie die Sitzungsprofil, configure.basis: "XZY" et configure.preset: arm_front. Beginnen Sie mit dem Versenden set_cursor_force für den festen Boden.
  2. In jedem Zyklus: Lesen Sie den Wert Y des Schiebereglers aus und berechnen Sie force_y = max(0, (floor_pos - y) * stiffness) und senden Sie sie ab.
  3. Wenn der Benutzer eine Dreh-Taste der Halterung drückt, legen Sie Folgendes fest: pending_configure = true.
  4. Im nächsten Schritt: Erstellen Sie einen Block configure.mount mit einer Transformation, bei der rotation ist ein unitäres Quaternion (Zusammensetzung aus Z und X der aktuellen Nick- bzw. Gierwinkel). Lassen Sie preset — Beide schließen sich auf Protokollebene gegenseitig aus.
  5. Die Reset-Taste (R) hebt die Ersetzung auf; die folgende Konfiguration entspricht preset.

Einstellungen​

NomFehlerRolle
BASIS"XZY"Achsenverschiebung – Koordinatensystem mit Y-Achse nach oben
DEVICE_PRESET / DEVICE_CONFIG_PRESET"arm_front"Benannte Voreinstellung – Ursprung an der Gerätebasis
FLOOR_POS_Y0.0 mFester Grundriss (Y der Anwendung)
STIFFNESS1000 k. A.Bodensteifigkeitskonstante
MOUNT_STEP_DEG10°Drehen per Tastendruck
PRINT_EVERY_MS200Begrenzung der Telemetriedatenrate

Bestellungen​

ToucheAktion
W / SDie Halterung um ±10° um die +X-Achse des Geräts drehen (Neigung)
A / DDie Halterung um ±10° um die +Z-Achse des Geräts drehen (Gieren)
RMontage zurücksetzen – zur Voreinstellung zurückkehren
HBestellungen anzeigen
QDrückeberger
mount et preset schließen sich gegenseitig aus

Der Dienst lehnt einen Block von Gerätekonfiguration das beides enthält. Sobald der Benutzer die Montage ausgetauscht hat, lässt das Tutorial preset jeder der folgenden Konfigurationen. Drücken Sie R reaktiv preset bei der folgenden Konfiguration und entferne mount.

Verschiedene Eingabemodelle

Die C++-Varianten lesen die Eingabe zeilenweise in einem stdin-Hintergrund-Thread ein (drücken Sie nach jedem Buchstaben die Eingabetaste). Python verwendet das Paket keyboard für die Echtzeit-Tastenabfrage in der asynchronen Hauptschleife – keine Eingabetaste erforderlich. Gleiche Tasten, gleiche Befehle.

Meister der Les-États​

Ab data.inverse3[i].state :

  • cursor_position.y — vec3, das zur Berechnung der Eindringtiefe in den Boden verwendet wird
  • current_cursor_force — für die Telemetrie gekennzeichnet

Versand / Empfang​

Die Struktur der Nutzlast ist bei allen Varianten gleich; die wesentlichen Unterschiede betreffen die Art und Weise, wie die einzelnen Varianten die sich gegenseitig ausschließende Verzweigung aufbauen. mount / preset und wie der Eingangsdraht den WebSocket-Draht signalisiert.

Einzigartige asynchrone Schleife mit Echtzeit-Tastenabfrage über das Paket keyboard. pending_configure ist ein globaler Indikator, der von den Tastenverwaltern definiert und jedes Mal zurückgesetzt wird, wenn ein Block configure wird versendet.

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

Das Tutorial 07 wird ebenfalls lokal mit dem SDK installiert – siehe tutorials/07-haply-inverse-basis-and-mount/ im Installationsverzeichnis des Dienstes.

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

Siehe auch: Grundpermutation · Montage und Arbeitsbereich · Gerätekonfiguration · Steuerbefehle (set_cursor_force) · Typen (transformieren) · Tutorial 04 (Hallo Boden)