Zum Hauptinhalt springen

04. Hallo Boden

Dein erster taktiler Effekt: ein virtueller, ebener Boden, der eine Gegenkraft erzeugt, wenn der Cursor darauf drückt. Diese Kraft basiert auf einem einfachen Federmodell –stiffness × penetration_depth——durch set_cursor_force Entlang der Z-Achse aufbringen.

Du wirst Folgendes lernen:

  • Verwendung set_cursor_force eine Strafkraft auf die Feder ausüben
  • Lesen cursor_position und die Kraft in Echtzeit berechnen
  • (Python) Einstellungen Arbeitsbereichsvoreinstellungen(arm_front_centered), sodass der Ursprung im Zentrum des Arbeitsraums liegt
  • (Python) Durch keyboard Interaktive Anpassung der Bodenhöhe und -steifigkeit

Arbeitsablauf​

  1. Öffnen bis ws://localhost:10001 WebSocket und warte auf den ersten Status-Frame.
  2. Im ersten Frame: Registrierung Sitzungsprofil。Die Python-Version sendet außerdem configure.preset: arm_front_centered, sodass der Ursprung in der Mitte des Arbeitsraums liegt; die C++-Version verwendet hingegen die aktuell auf dem Gerät aktivierte Konfiguration.
  3. Jedes Einzelbild: Einlesen cursor_position.z, Berechnung force_z = max(0, (floor_pos - z) * stiffness), und durch set_cursor_force Befehl, ihn zurückzusenden.
  4. In jedem folgenden Zyklus werden nur Befehle gesendet – das Sitzungsprofil dient lediglich als einmaliger Handshake.
  5. (Python) In jedem Zyklus werden außerdem die Pfeiltasten der Tastatur abgefragt und die Anzeige in Echtzeit aktualisiert. floor_pos / stiffness。

Parameter​

BezeichnungStandardwertVerwendungszweck
floor_pos0.10 mZ-Koordinate der virtuellen Bodenebene
stiffness1000 k. A.Federkonstante (Durchdringung von 1 mm → 1 N)
PRINT_EVERY_MS100–200Fernsteuerung der Drosselung
Name des Sitzungsprofilsco.haply.inverse.tutorials:hello-floorDiese Simulation im „ Haply Hub“ kennzeichnen
Interaktiv (nur Python)

Verwendung der Python-Version keyboard Paket (unter Linux sind erweiterte Berechtigungen erforderlich):

  • ↑ / ↓ ——Anheben / Absenken der Bodenebene
  • ← / → ——Steifigkeit verringern / erhöhen
  • R ——Auf Standardwerte zurücksetzen
Dehnkraft

Während des Dienstzyklus sind Kräfteaddierbar– bevor sie an das Gerät gesendet werden, werden die Kräfte aus den verschiedenen Quellen zusammengefasst. Beispiele wie dieses Tutorial können neben anderen Kraftquellen existieren, ohne sich gegenseitig zu behindern.

Gelesene Statusfelder​

Aus data.inverse3[i].state:

  • cursor_position.z — vec3, zur Berechnung der Eindringtiefe
  • current_cursor_force — zur Fernmessung und Datenübermittlung

Senden / Empfangen​

In jedem Zyklus: Die Z-Koordinate des Cursors auslesen und berechnen force_z = max(0, (floor_pos - z) * stiffness), und sende eine set_cursor_force Befehl. Die in Artikel 1 gesendete Nachricht enthält außerdem ein Sitzungskonfigurationsprofil (alle Versionen) sowie – bei Python-Versionen – zusätzlich configure.preset: arm_front_centered。

Einzelner asynchroner Zyklus. Der Handshake im ersten Frame enthält das Profil und configure.preset, damit floor_pos = 0.1 An den Koordinaten des Arbeitsbereichszentrums ausrichten.

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 + preset (one-shot)
request_msg = {
"session": {"configure": {"profile": {"name": "co.haply.inverse.tutorials:hello-floor"}}},
"inverse3": [{
"device_id": device_id,
"configure": {"preset": {"preset": "arm_front_centered"}}
}]
}
else:
# Per tick: compute force along Z, send set_cursor_force
z = data["inverse3"][0]["state"]["cursor_position"]["z"]
force_z = 0.0 if z > floor_pos else (floor_pos - z) * stiffness
request_msg = {
"inverse3": [{
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": 0.0, "z": force_z}}}
}]
}

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

Tutorial 04 wird ebenfalls zusammen mit dem SDK lokal installiert – bitte im Installationsverzeichnis des Dienstes unter tutorials/04-haply-inverse-hello-floor/ dort suchen.

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

Verwandte Themen: Steuerbefehle (set_cursor_force) · Einbindungen und Arbeitsbereiche (Voreinstellungen) · Typ (vec3) · Gespräch · Tutorial 07 (Sockel und Befestigung)