Transformations de montage et d'espace de travail
Deux transformations permettent de positionner l'appareil dans l'espace de l'application. Comprendre la chaîne de traitement vous aide à choisir la bonne.
Chaîne de traitement des coordonnées
| Étape | Rôle | Comment la définir ? | Persistante ? |
|---|---|---|---|
| Base | Réaffecte les axes (par exemple, Z vers le haut → Y vers le haut) | session.configure.basis — voir le tutoriel 08 (configuration à distance via HTTP) | Oui |
| Transformation de montage | Décalage physique lié au montage de l'appareil (position du bras, rotation, échelle) | configure.mount ou configure.preset — voir le tutoriel 08 (configuration à distance via HTTP) | Oui |
| Transformation de l'espace de travail | Dérive de navigation de la caméra ou de la scène | commands.set_transform — voir le tutoriel 09 (diffusion en continu via WebSocket à chaque cycle) | Oui (persistante) |
Transformation de montage
La configuration décrit l'emplacement physique de l'appareil: son décalage de bras, son orientation et son échelle. Elle n'est définie qu'une seule fois (ou lorsque l'utilisateur modifie la configuration physique) et est rarement mise à jour lors de l'exécution.
Préréglages (réglages d'usine)
Au lieu de calculer vous-même le montage, choisissez un préréglage intitulé :
| Préréglage | Emplacement de l'origine | Orientation du bras |
|---|---|---|
defaults | Socle de l'appareil | Vers l'avant (avant du bras) |
arm_front | Socle de l'appareil | En avant |
arm_front_centered | Centre de l'espace de travail | En avant |
led_front | Socle de l'appareil | Côté LED vers l'avant |
led_front_centered | Centre de l'espace de travail | Côté LED vers l'avant |
custom | Manuel — configurer soi-même le montage | — |
Un préréglage permet de définir simultanément le montage, la base et l'origine de l'espace de travail.
Définir directement le montage
- WebSocket
- HTTP
{
"inverse3": [{
"device_id": "049D",
"configure": {
"mount": {
"transform": {
"position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
}
}
}
}]
}
curl -X POST "http://localhost:10001/inverse3/049D/config/mount?session=:0" \
-H "Content-Type: application/json" \
-d '{"transform":{"position":{"x":0,"y":0,"z":0},"rotation":{"w":1,"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1}}}'
mount et preset sont mutuellement exclusifsEnvoyer les deux dans le même message prête à confusion : le service le rejette.
Choisissez-en un : un preset nommé (qui définit le montage à votre place) ou une
transformation mount explicitement.
Lorsque vous envoyez Dans un montage, mettez en image cette transformation : { "mount": { "transform": { … } } }.
Lorsque vous lisez un montage à partir de l'instantané, celui-ci est aplati : { "mount": { "position": …, "rotation": …, "scale": … } }.
C'est voulu : les commandes utilisent l'enveloppe unifiée command_data ; les instantanés
sérialisent directement core::transform.
Transformation de l'espace de travail
La transformation de l'espace de travail est une dérive d'exécution appliquée au-dessus du montage. Son cas d'utilisation typique est la navigation dans la scène (panoramique, rotation ou zoom sur la vue de l'application) tandis que l'appareil reste physiquement en place.
La configuration et la modification de l'espace de travail sont toutes deux persistantes: le service mémorise la dernière valeur que vous avez envoyée. La différence réside dans l'utilisation et les performances :
- Le montage est conçu pour être défini une seule fois et rester inchangé ; il décrit la configuration physique et est optimisé pour des mises à jour peu fréquentes.
- La transformation de l'espace de travail est conçue pour être générée à haute fréquence (par exemple, à chaque image lors du déplacement de la caméra) ; la chaîne de traitement interne est optimisée pour ce rythme de mise à jour.
- WebSocket
- HTTP
{
"inverse3": [{
"device_id": "049D",
"commands": {
"set_transform": {
"transform": {
"position": { "x": 1.0, "y": 0.0, "z": 0.0 },
"rotation": { "x": 0.0, "y": 0.0, "z": 0.0, "w": 1.0 },
"scale": { "x": 1.0, "y": 1.0, "z": 1.0 }
}
}
}
}]
}
curl -X POST "http://localhost:10001/inverse3/049D/state/transform?session=:0" \
-H "Content-Type: application/json" \
-d '{"transform":{"position":{"x":1,"y":0,"z":0},"rotation":{"w":1,"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1}}}'
GET renvoie la transformation actuelle ; DELETE la réinitialise à l'identité.
La mise à l'échelle du montage ou de l'espace de travail modifie la force restituée par l'appareil, car elle influe sur la profondeur de pénétration utilisée pour calculer la force de contact. Par exemple, une échelle de 2x réduit de près de moitié la profondeur de pénétration (la scène virtuelle est deux fois plus grande que la course de l'appareil), de sorte que la force obtenue est d'environ moitié inférieure que celle ressentie à 1x. À l'inverse, une échelle de 0.5x double à peu près la force.
C'est généralement le comportement souhaité : effectuer un zoom arrière dans une scène haptique entraîne naturellement une diminution de l'intensité des contacts (vous êtes « plus loin »), tandis qu'un zoom avant les rend plus intenses. Si ce n'est pas ce que vous souhaitez (par exemple, si vous avez besoin que la rigidité reste constante lorsque l'utilisateur effectue un zoom), compensez en ajustant vos gains de force de manière inverse.
Si vous avez besoin d'un déplacement continu (navigation en bulle, dérive à commande en fonction de la vitesse),
utilisez le module Navigation au lieu d'envoyer manuellement
set_transform À chaque tick : il gère pour vous la physique, le retour haptique
et la délimitation de l'espace de travail.