Aller au contenu principal

01. Imprimer Inverse3

Se connecterau WebSocket de simulation etrecevoir en continu les données relatives à la position du curseur, à la vitesse et à la force du premier « Inverse3 » transmises par le service.

Vous apprendrez :

  • Établir une connexion WebSocket et recevoir le message d'état initial complet
  • Envoyer une force nulle set_cursor_force Instruction de maintien de la connexion, permettant à la session de rester active
  • Enregistrezvotre profil de sessionafin que Haply Hub puisse identifier votre simulation
  • Mode dans lequel la négociation s'effectue uniquement lors du premier message — suppression de « session/configure » après l'envoi initial
  • Lecture sémantique de l'espace de travail avec mise à jour par parties transform(position, rotation, mise à l'échelle)
  • Limiter la fréquence des messages affichés sur la console à un niveau lisible

Processus de travail​

  1. Ouvrir à la page ws://localhost:10001 WebSocket. Le service envoie immédiatement uneTrame d'état complète, qui répertorie les appareils connectés.
  2. À la réception de la première image, sélectionner le premier Inverse3 device_id, puis de construire un message de requête composé de deux parties :
    • session.configure.profile.name —— VersHub HaplyEnregistrez cette simulation.
    • Pour chaque appareil, set_cursor_force Commande : le vecteur de force est nul. Le service l'utilise comme signal de maintien de connexion : tant qu'il continue de recevoir cette commande, il continue d'envoyer des trames d'état.
  3. Renvoyer le message.À supprimer avant le prochain cycle session Champ——Le profil de session ne sert qu’à établir une connexion initiale ; lors des cycles suivants, seules des commandes sont envoyées.
  4. Pour chaque trame d'état suivante : imprimer le curseur à une fréquence maximale d'environ 10 Hz. vec3 les champs (position, vitesse, force), puis renvoyer une commande de maintien de la force nulle.

Paramètres​

NomValeur par défautUtilisation
URIws://localhost:10001URL du canal de simulation WebSocket
PRINT_EVERY_MS100Limitation de la vitesse d'affichage de la console
Nom du profil de sessionco.haply.inverse.tutorials:print-inverse3Identifier cette simulation dans le Hub « Haply »

Champs d'état lus​

Extrait de data.inverse3[0].state:

  • cursor_position,cursor_velocity,current_cursor_force —— tous sont vec3
  • transform —— Changement d'espace de travail ; en tant que sous-objet, contient position(vec3),rotation(quaternion) et scale(vec3)
Mise à jour partielle de la sémantique

sous-champ dont la valeur est égale à la valeur par défaut de son unité (position: {0,0,0},rotation: {w:1,x:0,y:0,z:0},scale: {1,1,1}) Afin d'économiser de la bande passante, le système va, à partir de la charge…(omission)。Veillez à fournir une valeur par défaut lors de la lecture (par exemple, en C++, utilisez .value("position", default_pos), utilisation en Python .get("position", default_pos)). Pour recevoir systématiquement chaque champ, activez serialization/explicit_fields。

Envoyer / Recevoir​

Boucle WebSocket : réception d'une trame d'état, construction et renvoi simultanés d'une trametrame de commande. La première trame de commande contient les informations relatives à l'établissement de la session ainsi que la force nulle set_cursor_force Instruction de maintien ; à partir de là, à chaque imageSeulementContient une instruction de maintien de la connexion (les informations de session ont été supprimées).

Boucle asynchrone unique ——recv() → Instructions de compilation → send() → Répétition.

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"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-inverse3"}}},
"inverse3": [{
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": 0.0, "z": 0.0}}},
}]
}

await websocket.send(json.dumps(request_msg))
request_msg.pop("session", None) # one-shot handshake

Paramètres de ligne de commande (Python)​

La variante Python accepte deux paramètres permettant de modifier le contenu de la sortie du tutoriel :

ParamètresFonction
--fullAfficher les données de charge JSON brutes de chaque trame d'état sous forme formatée, plutôt que sous forme de résumé sur une seule ligne. Cela permet de comprendre plus facilement quels champs sont renvoyés par le service.
--query-configRéinjecter à chaque cycle de distribution session.force_render_full_state: {}, ce qui oblige le service à générer à chaque image un instantané complet (comprenant config Bloc — type d'appareil, micrologiciel, préréglages, mode d'installation, filtres, etc.). Si ce paramètre n'est pas utilisé,config Cela n'apparaît que dans la première image ; les images suivantes ne contiennent que des données incrémentielles en continu.

Ces deux paramètres peuvent être utilisés conjointement —python 01-haply-inverse-print-inverse3.py --full --query-config Affichera à chaque cycle un message contenant les éléments visibles config Les données de charge JSON complètes sont très utiles pour observer en temps réel les modifications des paramètres via Haply Hub ou l'API HTTP. Pour connaître les commandes WebSocket sous-jacentes, veuillez consulter session.force_render_full_state。

La variante C++ ne prend pas en charge ces paramètres : elle ne génère toujours qu'un résumé sur une seule ligne, et config Reçu uniquement dans la première image.

Fourni avec le programme d'installation du SDK

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

Source : Python · C++ · C++ Glaze

Contenu associé : Protocole WebSocket · Commandes de contrôle (set_cursor_force) · Conversation · Type (vec3)