Aller directement au corps du texte

06. Exemple d'intégration (Inverse3 + VerseGrip sans fil)

Ce tutoriel vous explique comment utiliser ces deux appareils. Lorsque vous maintenez le bouton enfoncé tout en orientant la poignée dans la direction souhaitée, le curseur se déplace dans cette direction Inverse3 . Le curseur est limité à l'intérieur de l'espace de travail sphérique.

Contenu pédagogique :

  • Lecture de deux types d'appareils dans la même trame d'état (inverse3 et wireless_verse_grip)
  • quaternionExtraction de la direction indiquée par la poignée (locale +Y (Félicitations)
  • set_cursor_positionDéplacer le curseur vers le point cible calculé à l'aide de
  • Limiter le point cible à l'intérieur d'une zone de travail sécurisée — Minverse utilise un rayon plus petit que celui d'Inverse3
  • de manière à ce que le point d'origine soit situé au centre de la zone de couverture Préréglages d'espace de travail (arm_front_centered) Configuration

Flux de travail​

  1. Recherche de deux appareils :
    • C++ La version est récupérée via HTTP au démarrage GET /devicesAprès avoir consulté [...], le système affiche un message d'instructions de correction et attend que la touche ENTER soit enfoncée.
    • Pythonlit les deux identifiants d'appareil dans la première trame d'état WebSocket.
  2. Dans le premier message, Profil de sessionen l'enregistrant et configure.preset: arm_front_centeredConfigurez (poignée de main unique).
  3. À chaque mouvement, la prise orientation et buttons.{a, b} Lit l'état.
  4. Si le bouton de déplacement est enfoncé, l'orientation de la poignée dans l'espace mondial (R(q) · ĵ — calculer l'unité pivotée (autour de l'axe +Y), puis SPEEDMettre à l'échelle et accumuler à l'emplacement cible.
  5. Après avoir limité la zone cible à l'intérieur de l'espace de travail, set_cursor_positionest transmis par le biais de.
  6. (Uniquement pour Python) L'appareil config.typeOn ajuste le rayon du cercle en fonction de — minverseest de 0,04 m, les autres mesurent 0,10 m.

Paramètres​

NomValeur par défautUtilisation
SPEED0.01 m/ticIntervalle de déplacement tant que le bouton est enfoncé
RADIUS_INVERSE30.10 mInverse3 / Rayon maximal de l'espace de travail d'Inverse3x
RADIUS_MINVERSE0.04 mRayon maximal de l'espace de travail de Minverse (valable uniquement pour Python — pour C++, c'est 0.10(fixé à)
PRINT_EVERY_MS200Limite de fréquence de transmission des données de télémétrie
Nom du profil de sessionco.haply.inverse.tutorials:combinedHaply Valeur permettant d'identifier cette simulation dans le Hub
Effectuer un étalonnage avant l'exécution
  • Laissez Inverse3 effectuer l'étalonnage automatique (ou placez le stylo au-dessus du réservoir d'encre et attendez que la LED s'allume).
  • Retirez la poignée du pot d'encre.
  • Faites pivoter la poignée tout en maintenant enfoncé le bouton A ou B — le curseur se déplace dans la direction indiquée par la poignée.

Champ « État de lecture »​

Lisez les valeurs suivantes dans la trame d'état transmise à chaque tick :

  • data.inverse3[0].state.cursor_position — vec3
  • data.wireless_verse_grip[0].state.orientation — quaternion
  • data.wireless_verse_grip[0].state.buttons.{a, b, c} — Valeur booléenne
  • (Python, uniquement pour la première image) data.inverse3[0].config.type — Choisissez l'un des rayons suivants : Inverse3 ou Minverse
  • (Python, uniquement pour la première image) data.inverse3[0].status.calibrated — Si la valeur est « false », un message d'avertissement s'affiche à l'utilisateur

Émission / Réception​

Calcul permettant de déterminer l'orientation à partir de quaternions (R(q)vers +Y(opération de rotation) et le traitement des contraintes internes de la sphère constituent des opérations d’algèbre linéaire classiques. Pour plus de détails, veuillez consulter le fichier source. Du côté de l’API inverse, les fonctions appelées à chaque poignée de main et à chaque tick set_cursor_positionest composé de.

Il est constitué d'une seule boucle asynchrone. Python lit les deux identifiants d'appareil dans la première trame d'état. Lors de la négociation, la première set_cursor_position le profil de l'appel et configure.preset: arm_front_centeredJe vous le joins ci-joint.

async with websockets.connect(URI) as websocket:
while True:
msg = await websocket.recv()
data = json.loads(msg)

if first_message:
first_message = False
inverse3_id = data["inverse3"][0]["device_id"]
grip_id = data["wireless_verse_grip"][0]["device_id"]
radius = get_workspace_radius(data["inverse3"][0].get("config", {}))

# Handshake: profile + preset + first position command
request_msg = {
"session": {"configure": {"profile": {"name": SLUG}}},
"inverse3": [{
"device_id": inverse3_id,
"configure": {"preset": {"preset": "arm_front_centered"}},
"commands": {"set_cursor_position": {"position": position}},
}],
}
else:
# Per tick: update position from grip pointing direction (classic math, not shown), send
request_msg = {
"inverse3": [{
"device_id": inverse3_id,
"commands": {"set_cursor_position": {"position": position}},
}],
}

await websocket.send(json.dumps(request_msg))
Inclus dans le programme d'installation du SDK

Le tutoriel 06 est également installé localement avec le SDK — dans le répertoire d'installation du service, sous tutorials/06-haply-inverse-combined/ Vous pouvez le consulter dans le dossier.

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

Sujets connexes : Commandes de contrôle (set_cursor_position) · Type (quaternion, vec3) · Montage et espace de travail (préréglages) · Tutoriel 03 (VG sans fil) · Tutoriel n° 5 (Contrôle de position)