Transformations de montage et d'espace de travail
Deux transformations positionnent 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 HTTP) | Oui |
| Transformation de montage | Décalage physique de montage de l'appareil (position du bras, rotation, échelle) | configure.mount ou configure.preset — voir le tutoriel 08 (configuration à distance 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 WebSocket à chaque cycle) | Oui (persistante) |
Transformation de montage
Le montage décrit où se trouve physiquement l'appareil — son décalage de bras, son orientation et son échelle. Il est défini une seule fois (ou lorsque l'utilisateur modifie la configuration physique) et rarement mis à jour à l'exécution.
Préréglages (configurations d'usine)
Plutôt que de calculer le montage vous-même, choisissez un préréglage nommé :
| Préréglage | Placement de l'origine | Orientation du bras |
|---|---|---|
defaults | Base de l'appareil | Vers l'avant (avant du bras) |
arm_front | Base de l'appareil | Vers l'avant |
arm_front_centered | Centre de l'espace de travail | Vers l'avant |
led_front | Base de l'appareil | Côté DEL vers l'avant |
led_front_centered | Centre de l'espace de travail | Côté DEL vers l'avant |
custom | Manuel — définir le montage soi-même | — |
Un préréglage définit le montage, la base et l'origine de l'espace de travail en une seule fois.
Définir le montage directement
- 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 est ambigu : le service le rejette.
Choisissez-en un : un preset nommé (qui définit le montage pour vous) ou une
transformation mount explicite.
Lorsque vous envoyez un montage, encapsulez la transformation : { "mount": { "transform": { … } } }.
Lorsque vous lisez un montage depuis l'instantané, il 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 par-dessus le montage. Son cas d'utilisation typique est la navigation dans la scène (panoramique, rotation ou zoom sur la vue de l'application) pendant que l'appareil reste physiquement en place.
Le montage et la transformation de l'espace de travail sont tous deux persistants : le service mémorise la dernière valeur que vous avez envoyée. La différence tient à l'usage et à la performance :
- Le montage est conçu pour être défini une fois et rester en place ; 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 diffusée à haute fréquence (par exemple, à chaque image pendant la navigation 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 que l'appareil restitue, 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 à peu près de moitié la profondeur de pénétration (la scène virtuelle est deux fois plus grande par rapport à la course de l'appareil), de sorte que la force obtenue est environ moitié moindre 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é : faire un zoom arrière dans une scène haptique produit naturellement des contacts plus faibles (vous êtes « plus loin »), et un zoom avant les rend plus forts. Si ce n'est pas ce que vous voulez (par exemple, si vous avez besoin que la rigidité reste constante lorsque l'utilisateur zoome), compensez en mettant à l'échelle vos gains de force de façon inverse.
Si vous avez besoin d'un déplacement continu (navigation en bulle, dérive à commande en 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.