Zum Hauptinhalt springen

07. Basis & Mount – Übungsplatz

Geräte interaktiv steuern Mount-Transformation, und demonstrieren configure.basis、configure.preset und configure.mount Wie lässt sich die Zusammenarbeit auf der Ebene der Kommunikationsnachrichten gestalten? Halten Sie eine einheitliche Ebene ein, damit der Schwerpunkt der Interaktion stets auf dem Befehl „configure“ liegt.

Du wirst Folgendes lernen:

  • Einstellungen Basis-Achsenverschiebung("XZY" → (Anwendungskoordinatensystem auf der Y-Achse)
  • Auswahl Voreinstellungen(arm_front), und zu verstehen, welche Einstellungen dadurch vorgenommen werden
  • Überschreiben von „mount“ zur Laufzeit durch Drehen von Quaternionen (über die Tastatur)
  • Regeln zur gegenseitigen Ausschließung:mount und preset können nicht gleichzeitig in demselben Gerätekonfiguration im Block
  • Einmalig configure Bedeutung: Bei jedem Tastendruck wird nur eine „configure“-Nachricht gesendet.
  • (C++ Glaze) Verwendung std::optional Modellierung von exklusiv-oder-Feldern

Arbeitsablauf​

  1. Bei Erhalt der ersten Nachricht: Senden Sitzungsprofil、configure.basis: "XZY" sowie configure.preset: arm_front。Um den Boden zu fixieren, wird nun kontinuierlich gesendet set_cursor_force。
  2. Bei jedem Tick: Die Y-Koordinate des Cursors auslesen und berechnen force_y = max(0, (floor_pos - y) * stiffness) und senden.
  3. Wenn der Benutzer die Dreh-Taste „mount“ drückt, wird pending_configure = true Positionieren.
  4. Im nächsten Tick: Erstellen eines configure.mount Block, dessen Transformation rotation Einheit: Quaternion (Kombination nach dem aktuellen Nick- und Gierwinkel, wobei Z vor X kommt). Weggelassen preset——Beide schließen sich im Kommunikationsprotokoll gegenseitig aus.
  5. Reset-Taste (R) Überschreibende Einstellungen löschen; beim nächsten Aufruf von „configure“ wird wieder auf preset。

Parameter​

BezeichnungStandardwertVerwendungszweck
BASIS"XZY"Achsenverschiebung – Anwendungskoordinatensystem entlang der Y-Achse
DEVICE_PRESET / DEVICE_CONFIG_PRESET"arm_front"Benannte Voreinstellung – Ursprung am Gerätefuß
FLOOR_POS_Y0.0 mFeste Bodenebene (Y-Achse des Anwendungskoordinatensystems)
STIFFNESS1000 k. A.Bodenfederkonstante
MOUNT_STEP_DEG10°Drehwinkel pro Tastendruck
PRINT_EVERY_MS200Telemetrie-Drosselungsintervall

Steuerung​

TasteBedienung
W / SDrehung der Vorrichtung um die X-Achse (Neigung) um ±10°
A / DDrehung der Vorrichtung um die Z-Achse (Gierung) um ±10°
RMount zurücksetzen – auf die Standardeinstellung zurücksetzen
HAnzeigesteuerungstasten
QBeenden
mount und preset Exklusivität

Der Dienst lehnt es ab, beides gleichzeitig zu enthalten. Gerätekonfiguration Block. Sobald der Benutzer „mount“ überschrieben hat, wird dieser Schritt in diesem Tutorial bei jedem nachfolgenden „configure“-Vorgang übersprungen. preset。Drücken Sie R Danach wird es beim nächsten „configure“-Befehl wieder aktiviert. preset und entfernen mount。

Verschiedene Eingabemodi

Die C++-Variante liest die zeilenweise Eingabe im Hintergrund im stdin-Thread ein (nach jedem Buchstaben muss die Eingabetaste gedrückt werden). Python hingegen verwendet in der asynchronen Hauptschleife keyboard Es erfolgt eine Echtzeit-Tastenabfrage, ohne dass die ENTER-Taste gedrückt werden muss. Bei gleicher Tastenbelegung sind auch die Befehle identisch.

Gelesene Statusfelder​

Aus data.inverse3[i].state:

  • cursor_position.y — vec3, zur Berechnung der Eindringtiefe in den Boden
  • current_cursor_force — zur Fernmessung und Datenübermittlung

Senden / Empfangen​

Die Laststruktur ist bei allen Varianten identisch; der eigentliche Unterschied liegt darin, wie jede Variante die gegenseitige Ausschließung umsetzt. mount / preset Zweige sowie die Art und Weise, wie der Eingabe-Thread den WebSocket-Thread benachrichtigt.

Ein einziger asynchroner Schleifenzyklus, durch keyboard Das Paket führt eine Echtzeit-Tastenabfrage durch.pending_configure Es handelt sich um ein globales Flag, das von der Tastenbehandlungsfunktion gesetzt wird, und zwar bei jeder Übertragung configure Nach dem Block löschen.

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 zusammen mit dem SDK lokal installiert – bitte sehen Sie im Installationsverzeichnis des Dienstes nach. tutorials/07-haply-inverse-basis-and-mount/。

Quellcode: Python · C++ · C++ Glaze

Verwandte Themen: Basis-Achsenverschiebung · Mount und Arbeitsbereich · Gerätekonfiguration · Steuerbefehle (set_cursor_force) · Typ (transform) · Tutorial 04 (Hello Floor)