Aller au contenu principal

04. Bonjour Floor

Ton premier effet tactile : un sol virtuel horizontal qui génère une force de répulsion lorsque le curseur s'y enfonce. Cette force correspond à un modèle simple de ressort de pénalité —stiffness × penetration_depth——Approuvé par set_cursor_force Appliquer le long de l'axe Z.

Vous apprendrez :

  • Utilisation set_cursor_force Appliquer une force de rappel
  • Lire cursor_position et calcule la force en temps réel
  • (Python) Configuration Préréglages d'espace de travail(arm_front_centered), de manière à ce que l'origine se trouve au centre de l'espace de travail
  • (Python) via keyboard Réglage interactif de la hauteur et de la rigidité du sol

Processus de travail​

  1. Ouvrir à la page ws://localhost:10001 WebSocket, puis attendre la première trame d'état.
  2. À la première image : inscription Fichier de configuration de session. La version Python enverra également configure.preset: arm_front_centered, de manière à ce que le point d'origine se trouve au centre de l'espace de travail ; la version C++ utilise quant à elle la configuration actuellement active sur l'appareil.
  3. À chaque image : lecture cursor_position.z, calcul force_z = max(0, (floor_pos - z) * stiffness), et via set_cursor_force La commande le renvoie.
  4. À chaque cycle suivant, seules des commandes de force sont envoyées — le profil de session ne sert qu'à établir une poignée de main initiale.
  5. (Python) À chaque cycle, le programme interroge également les touches de direction du clavier et met à jour les données en temps réel. floor_pos / stiffness。

Paramètres​

NomValeur par défautUtilisation
floor_pos0.10 mCoordonnée Z du plan virtuel du sol
stiffness1000 N/mConstante de ressort (pénétration de 1 mm → 1 N)
PRINT_EVERY_MS100–200Régulation à distance du débit
Nom du profil de sessionco.haply.inverse.tutorials:hello-floorIdentifier cette simulation dans le Hub « Haply »
Interactif (Python uniquement)

Version de Python utilisée keyboard Paquet (nécessite des droits d'administrateur sous Linux) :

  • ↑ / ↓ ——Rehausser / abaisser le niveau du sol
  • ← / → ——Réduire / Augmenter la rigidité
  • R ——Rétablir les valeurs par défaut
Capacité d'extension

Au cours du cycle de service, les forces sontcumulables: avant d'être transmises à l'appareil, les forces provenant de différentes sources sont d'abord additionnées. Des exemples tels que celui présenté dans ce tutoriel peuvent coexister avec d'autres sources de génération de forces sans se bloquer mutuellement.

Champs d'état lus​

Source : data.inverse3[i].state:

  • cursor_position.z — vec3, servant à calculer la profondeur de pénétration
  • current_cursor_force — Destiné à la transmission de données de télémétrie

Envoyer / Recevoir​

À chaque cycle : lire la coordonnée Z du curseur, calculer force_z = max(0, (floor_pos - z) * stiffness), puis envoyer un set_cursor_force Commande. Le message envoyé par l'article 1er contient également un profil de session (toutes versions) ; pour les versions Python, il contient en outre configure.preset: arm_front_centered。

Cycle asynchrone unique. La poignée de main de la première trame contient le profil et configure.preset, ce qui fait que floor_pos = 0.1 Aligner avec les coordonnées du centre de l'espace de travail.

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))
Fourni avec le programme d'installation du SDK

Le tutoriel 04 est également installé localement avec le SDK — veuillez vous rendre dans le répertoire d'installation du service, sous tutorials/04-haply-inverse-hello-floor/ Rechercher dans.

Code source : Python · C++ · C++ Glaze

Contenu associé : Commandes de contrôle (set_cursor_force) · Montage et espace de travail (paramètres par défaut) · Type (vec3) · Conversation · Tutoriel 07 (Socle et fixation)