Zum Hauptinhalt springen

07. Der Spielplatz von „Basis“ und „Mount“

Geräte Montage-Transformation interaktiv bedienen undconfigure.basis、configure.preset、configure.mount Dies veranschaulicht, wie die Elemente auf dem Draht miteinander interagieren. Um den Fokus der interaktiven Bedienung auf den Befehl „configure“ zu richten, wurde der horizontale Boden fixiert.

Was Sie in diesem Tutorial lernen werden:

  • Neuanordnung der BasiselementeEinstellungen ("XZY" → (Anwendungsrahmen, bei dem die Y-Achse oben liegt)
  • Voreinstellungen(arm_front)die Auswahl und das Verständnis dessen, was damit festgelegt wird
  • Überschreiben der Laufwerkszuordnung zur Laufzeit mithilfe von rotierenden Quaternionen (über die Tastatur)
  • Ausschlussregel: mount und preset ist dasselbe Gerät konfigurieren Können nicht innerhalb eines Blocks koexistieren
  • One-Shot- configure Funktionsweise: Bei jedem Tastendruck wird genau eine „configure“-Meldung gesendet.
  • (C++ Glaze)std::optional Modellierung exklusiver Felder unter Verwendung von

Workflow​

  1. In der ersten Nachricht,Sitzungsprofil、configure.basis: "XZY"、configure.preset: arm_front wird gesendet. Für den festen Boden set_cursor_force Die Übertragung wird gestartet.
  2. Bei jedem Tick wird die Y-Koordinate des Cursors ausgelesen, undforce_y = max(0, (floor_pos - y) * stiffness) berechnen und senden.
  3. Wenn der Benutzer die Taste zum Drehen der Halterung drückt,pending_configure = true Setzt das Flag.
  4. Beim nächsten Tick,configure.mount Erstellen Sie einen Block. Die Transformation dieses Blocks rotation Es handelt sich um ein Einheits-Quaternion (das aus dem aktuellen Pitch und Yaw in der Reihenfolge Z und anschließend X zusammengesetzt wurde).preset wird weggelassen. Denn beide sind auf dem Draht gegenseitig ausschließend.
  5. Reset-Taste (R) die Überschreibung aufheben. Beim nächsten `configure` wird dann wieder preset wird verwendet.

Parameter​

NameStandardwertVerwendungszweck
BASIS"XZY"Anordnung der Achsen — Anwendungsfenster mit der Y-Achse oben
DEVICE_PRESET / DEVICE_CONFIG_PRESET"arm_front"Benannte Voreinstellungen – Der Ursprung ist die Basis des Geräts
FLOOR_POS_Y0.0 mDie Ebene des feststehenden Bodens (Y-Achse der Anwendung)
STIFFNESS1000 k. A.Federkonstante des Bettes
MOUNT_STEP_DEG10°Drehwinkel pro Tastendruck
PRINT_EVERY_MS200Telemetrie-Abtastintervall

Bedienung​

SchlüsselBetrieb
W / SDrehen (Neigen) der Halterung um ±10° um die +X-Achse des Geräts
A / DDrehen (Gieren) der Halterung um ±10° um die +Z-Achse des Geräts
RHalterung zurücksetzen — Auf die Voreinstellung zurücksetzen
HAnleitung anzeigen
QEnde
mount und preset können nicht gleichzeitig angegeben werden

Der Service umfasst beides Gerät konfigurieren Block wird abgelehnt. Wenn der Benutzer die Einbindung überschreibt, wird in diesem Tutorial bei allen nachfolgenden `configure`-Befehlen preset wird weggelassen.R Wenn Sie darauf klicken, wird beim nächsten „configure“ preset wird wieder aktiviert, undmount wird gelöscht.

Unterschiede bei den Eingabemodellen

Die C++-Variante liest die Eingabe zeilenweise in einem stdin-Thread im Hintergrund ein (drücken Sie nach jedem Zeichen die Eingabetaste). Python erfasst Tastatureingaben in Echtzeit in der asynchronen Hauptschleife, daherkeyboard Verwenden Sie das Paket. Die Eingabetaste ist nicht erforderlich. Die Tasten und Befehle sind identisch.

Feld „Lesezustand“​

data.inverse3[i].state Aus dem folgenden Text geht hervor:

  • cursor_position.y — vec3。Wird zur Berechnung der Eindringtiefe in den Boden verwendet
  • current_cursor_force — Wird für Telemetriezwecke gemeldet

Senden/Empfangen​

Das Format der Nutzlast ist bei allen Varianten identisch. Ein bemerkenswerter Unterschied besteht darin, dass jede Implementierung exklusive mount / preset Es geht darum, wie die Verzweigung aufgebaut wird und wie der Eingabe-Thread den WebSocket-Thread benachrichtigt.

keyboard Es handelt sich um eine einzelne asynchrone Schleife, die in einem Paket die Tastatureingaben in Echtzeit abfragt.pending_configure ist ein globales Flag, das vom Key-Handler gesetzt wird, undconfigure Es wird bei jeder Übertragung eines Blocks gelöscht.

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

Tutorial 07 ist zusammen mit dem SDK auch lokal installiert. Im Installationsverzeichnis des Dienstes unter tutorials/07-haply-inverse-basis-and-mount/ Bitte überprüfen Sie dies.

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

Siehe auch: Neuanordnung der Basiselemente · Halterung und Arbeitsbereich · Geräteeinstellungen · Steuerbefehle (set_cursor_force) · Typ (transform) · Tutorial 04 (Hello Floor)