v3.5.0
Il s'agit de la plus importante mise à jour depuis la refonte de l'API il y a un an. La version 3.5.0 introduit une couche mathématique 3D unifiée, une prise en charge complète de « Minverse », un flux d'événements typé, une API de configuration complète ainsi qu'une interface HTTP plus épurée. Elle intègre également toutes les corrections de bogues et optimisations de l'expérience utilisateur apportées au cours de l'année écoulée.
Points forts
- Une couche mathématique 3D unifiée — un pipeline de transformations composable qui fournit des primitives de premier ordre pour le système de coordonnées de référence de l'appareil (basis/frame), la transformation de montage (mount transform), la transformation de l'espace de travail (workspace transform) et la transformation de navigation (navigation transform), et qui prend en charge les conversions explicites entre les espaces local, de session, d'application et interne.
- Navigation par bulles (Bubble Navigation) —— Permet de se déplacer dans un vaste espace de travail virtuel à l'aide de zones de formation (éléments SDF). Prend en charge le contrôle de la vitesse via un mappage de vitesse, une détection des collisions tenant compte de l'hystérésis, ainsi qu'une dérive optionnelle vers la direction du curseur. Entièrement configurable via HTTP et WebSocket, et prend en charge la conversion aller-retour entre les espaces d'application.
- Flux d'événements classés par type — canaux d'événements WebSocket dédiés, couvrant le cycle de vie des appareils, les alertes de sécurité, l'étalonnage, l'état de la batterie, les avertissements relatifs au débit de commande et les notifications de fin de vie.
- API de configuration — Système complet de configuration sous forme de paires clé-valeur, prenant en charge les opérations CRUD (création, lecture, mise à jour, suppression) via HTTP, les suggestions de types, les contraintes de plage et les descriptions ; il remplace les anciens fichiers de configuration imbriqués.
- Configuration uniforme des équipements —— Tous les équipements partagent un seul système de routage HTTP :
basis,mount,preset,transform,filters,handedness,torque_scaling,gravity_compensation,home_return。 - Minverse Calibrage synchronisé du stylet — L'appareil et son stylet peuvent désormais être calibrés simultanément ; le calibrage reste verrouillé jusqu'à ce que le manche soit effectivement installé.
- Optimisation de l'expérience utilisateur HTTP —— Sélecteur d'appareils basé sur un index (permet de spécifier un appareil par son index, sans avoir besoin de son identifiant), structure de requête/réponse unifiée partagée avec WebSocket, activation facultative
{ok, error, data}Structure de l'encapsulation (?format=json), ainsi que les sélecteurs de session avec caractères génériques.
Nouvelles fonctionnalités
Équipements
- Minverse —— Cette version prend officiellement en charge : les processus de détection, de mise en service, les notifications de sécurité ainsi que les workflows de synchronisation et d'étalonnage.
- « Ruko » et « Kingfisher » ont été reconnus comme des types de poignées officiels.
- Prise en charge des simulateurs de périphériques: permet de détecter les périphériques simulés par un logiciel et de communiquer avec eux, tout en restant compatible avec le matériel physique.
- Protection contre les boucles de connexion —— Les ports présentant un comportement anormal sont automatiquement bloqués ; il est possible de
POST /ports/{port}/resetRéinitialiser. - Détection de la fixation du stylo — Une détection fiable de la fixation et du retrait du stylo grâce à la suppression des vibrations.
Sessions, commandes et WebSocket
- Filtrage et persistance des profils de session —— En spécifiant le nom du profil de session et la version requise du SDK, le service mémorise ces informations après la reconnexion ; le client et les outils de surveillance peuvent alors filtrer et identifier les sessions à l'aide de ce profil.
- Tampon de commandes par session — Une session particulièrement lente ne ralentit plus les autres sessions.
- Explicite pour les commandes ponctuelles
configureMappage —— Pour chaque appareil,basis,preset,mount,force_gate,damping, ainsi que pour chaque sessionprofileetbasis, à regrouper désormaisconfigureDans ce contexte, la correspondance est maintenue avec la configuration de sortie, ce qui permet d'assurer une correspondance biunivoque entre les données envoyées et celles récupérées. - Montage personnalisable des périphériques —— Possibilité de choisir parmi les préréglages d'espace de travail intégrés (
defaults,arm_front,arm_front_centered,led_front,led_front_centered), il est également possible d'envoyer une transformation explicite ; une fois la modification effectuée manuellement, le préréglage bascule automatiquement verscustom。 - Champs de commande nommés ——
position,vector,angles,torquesa remplacé le modèle génériquevaluesTableau. set_angular_torquesa remplacéset_angular_torque(La forme au singulier est obsolète).- Extension de trame de session —— Les trames de session des versions v3.0 et v3.1 contiennent désormais des champs extensibles
config,stateetstatusObjet ; les nouveaux champs de sortie comprennentcurrent_cursor_force,current_cursor_position,current_angular_torques,current_angular_position,control_domain,control_mode,transform,transform_velocity、plus variéconfig.*, ainsi questatus.safety(Masqué par défaut). - Mise à jour partielle de la transformation —— En ce qui concerne le montage, la transformation de l'espace de travail et la navigation dans les formes, il suffit d'envoyer les sous-champs à modifier (
position,rotation,scale).
HTTP
GET /—— Version du service.GET/POST/DELETE /settingset/settings/*—— Une API complète de configuration des clés-valeurs.GET /sessions/{session}ainsi queGET/POST/DELETE /sessions/{session}/profile。GET /devices?session=<selector>—— Convertit les coordonnées de l'appareil dans l'espace de l'application de la session spécifiée.- Sélecteur d'appareils basé sur un index —— Il n'est pas nécessaire de connaître l'ID de l'appareil pour le spécifier par index (le premier Inverse3 à utiliser
/inverse3/0/...; Tous les appareils de la gamme Inverse utilisent/inverse*/*/...). - Structure uniforme de requête/réponse —— Le corps des requêtes POST/GET utilise le même format que celui des WebSockets
command_dataStructure JSON ; le code écrit pour l'un de ces modes de transmission s'applique également à l'autre. - Structures d'encapsulation optionnelles —— Ajouter sur n'importe quelle route
?format=jsonPeut être activé immédiatement ;/settings*etGET /home_returnRetour par défaut{ok, error, data}. Si vous souhaitez conserver la structure d'origine, veuillez utiliser?format=plain。 - Caractères génériques du sélecteur de session —— dans le nom du profil
*(séquence de caractères quelconque) et?(un seul caractère). - Décodage du sélecteur de code en pourcentage ——
%2A,%3Aetc. seront d'abord décodés avant le routage.
Événement
- Situé à
communication/events/portsur le flux d'événements WebSocket dédié. - Il existe au total 24 catégories d'événements classés par type, notamment ceux liés au cycle de vie de l'équipement, aux incidents de sécurité (freinage électronique (e-brake), détection de corps étrangers, blocage), aux échecs d'étalonnage, aux alertes de batterie, aux avertissements de session, à une vitesse de contrôle faible ou très faible, à la validation des entrées et aux notifications de mise hors service.
observabilité
- Lors de l'analyse des performances, les messages de journalisation sont transmis à Tracy et colorés en fonction de leur niveau de journalisation.
- Ajouter une zone Tracy à chaque fonction de traitement HTTP.
- Chronométrage et comptage des événements dans la boucle principale.
- Il est possible de configurer le répertoire des journaux et le nom d'hôte du serveur (pour faciliter l'utilisation de Docker).
La version 3.6 sera bientôt disponible
- Effets tactiles SDF (SDF HFX) —— Les travaux de base ont été achevés dans la version 3.5 (modules, cycle de vie, sérialisation des commandes et des états fournis par les modules) ; l'API publique et la documentation complète seront publiées avec la version 3.6.
Améliorations
- Filtrage des oscillations de force — Détection des oscillations axe par axe, récupération progressive en 8 étapes, vote d'entrée avec hystérésis et fenêtre de libération asymétrique.
- Filtre à commande par force à l'exécution —— Disponible via
configure.force_gate.gainConfiguration via WebSocket ou HTTP, avec des valeurs par défaut persistantes. - La fréquence maximale de la boucle principale a été portée à 32 kHz, ce qui la rend adaptéeaux applications de haute précision.
- Une charge WebSocket réduite —— Sous-champ de transformation de la valeur par défaut d'identité (
position = 0,rotation = identity,scale = 1) N'est plus généré par défaut, ce qui permet de réduire le volume des données de support et de rétablir la compatibilité avec la limite de 4 Ko par message des paquets de données des anciennes versions de Unity. Deux paramètres avancés (serialization/explicit_fields,serialization/force_complete_transforms) permet de réactiver tous les champs pour les utilisateurs qui en ont besoin. - Réduction de la fluctuation du cycle principal — Le traitement des messages WebSocket ne bloque plus le rythme du cycle principal pendant l'analyse JSON et l'envoi sur le réseau ; la planification du rythme de la session a été déplacée avant la sérialisation de la réponse.
- Par défaut, le serveur n'écoute que sur « localhost ». —— Si vous avez besoin d'un accès Internet, veuillez passer par
communication/bind_all_interfacesActiver le paramètre. - Les caractères génériques du sélecteur d'équipement utilisent désormais la syntaxe des préfixes(par exemple
inverse*(Compatible avec tous les appareils de la gamme Inverse). - Commande d'amortissement A été transféré
configureDans la mise en correspondance, avecforce_gateMettre tout cela ensemble. - L'enregistreur de journaux à rotation remplace l'enregistreur précédent et prend en charge la configuration des répertoires.
- Commandes et états fournis par les modules — Les modules peuvent intégrer leurs propres commandes et champs de configuration, et écrire les états de sortie dans les trames WebSocket, sans avoir à modifier le schéma de base.
Réparation
Corrections de bogues effectuées tout au long de l'année ; les corrections les plus importantes sont répertoriées ci-dessous.
- Anomalie de la vitesse de la session, survenant dans certaines conditions.
- **GripHook (Verse Grip Stopper)** ne peut pas être libéré correctement lorsque la simulation n'est pas en cours.
- Inverse3 Les paramètresde délai d'expirationsont trop stricts, ce qui entraîne un boucle de déconnexion pour les appareils dont le démarrage est plus lent.
- Sous Windows, l'arrêt des services n'est pas toujours correct: le serveur HTTP n'est pas toujours fermé correctement lors de l'arrêt du système.
- Boucle de reconnexion: elle se produit lorsque le service envoie des commandes non prises en charge à une version plus ancienne du micrologiciel.
- L'énumération des périphériques Bluetoothgénère un volume important de journaux sur les systèmes équipés d'un adaptateur Bluetooth.
- Le service plante lorsqu'on le redémarre plusieurs fois de suite.
- Sur les ordinateurs portables Ubuntu, le récepteur sans fil Verse Grip se bloque après la mise en veille ou la sortie de veille.
- Le Verse Grip sans filfonctionne désormais correctement sousLinux et macOS : après un premier échec de détection, il revient désormais correctement à l'état initial.
- Emplacement des fichiers de configuration sous macOS——La configuration est désormais enregistrée dans
~/Library/Application Support/Dans ce contexte, on n'utilise plus le chemin erroné. - Gestion du signal SIGSEGV sous Linux et macOS: lorsque la capture des plantages multithread est activée, le processus ne se retrouve plus pris dans une boucle à la réception d'un signal fatal.
- Remplacement des commandes entre sessions— Une commande de configuration définie dans une session pouvait être discrètement remplacée par une commande d'une autre session ; désormais, ces commandes sont correctement filtrées et fusionnées.
- Configuration de la couverture des commandes de détection——Surveiller les sessions (par exemple, celles envoyées par Haply Hub)
probe_positionÀ ce moment-là, les modifications apportées à la base, au préréglage ou au profil qui doivent encore prendre effet ne seront plus masquées discrètement. - Erreur d'affichage de la poignée prototype: le matériel prototype est affiché à tort comme une poignée standard, et non comme une poignée personnalisée.
- Ancienne version
set_basisConvention relative aux matricesS'applique à nouveau aux clients qui n'ont pas encore été migrés. - Inverse3 Le « force kick » ne génère plus de pic de force résiduelle lorsque la session est interrompue.
- Condition de concurrence liée à la perte de connexion WebSocket— Se produit lors d'un cycle rapide de connexion/déconnexion.
- WebSocket
session_idsérialisé dans une partie du trafic sortant sous la forme de0。 - Sous Windows, l'utilisation simultanée de
--devOn va désormais suivre--log-level(qui était auparavant réinitialisé discrètement àdebug).
Éléments obsolètes
Il fonctionne toujours normalement, mais sera supprimé dans une prochaine version majeure. Le cas échéant, la réponse contiendra deprecation_warning Champ.
| Obsolète | Options alternatives |
|---|---|
POST /force_scale | POST /settings/devices/inverse*/filters/force_scale/gain |
POST /gravity_compensation | POST /{device}/{id}/config/gravity_compensation |
POST /torque_scaling | POST /{device}/{id}/config/torque_scaling |
POST /device_handedness | POST /{device}/{id}/config/handedness |
POST /serial_enable | POST /settings/communication/serial/enabled |
POST /experimental/features/grip_dropped_simulation_stopper | API des paramètres |
POST /experimental/features/screensaver_enable | API des paramètres |
WebSocket command_data.values | position, vector, angles, torques |
WebSocket set_angular_torque | set_angular_torques |
WebSocket probe_cursor_position | probe_position |
WebSocket set_coordinate_origin | configure.preset |
Au niveau de la session WebSocket set_basis | configure.basis |
Remarques sur la compatibilité
Il n'y a pas de modifications radicales ni de nature à causer des dysfonctionnements par rapport à la version 3.4.19. Deux remarques mineures concernant les intégrations existantes :
- Les points de terminaison HTTP obsolètes incluront désormais dans leur réponse
deprecation_warningChamp — Les clients effectuant une validation stricte du schéma de réponse doivent autoriser ce champ supplémentaire. - WebSocket
command_datadansvaluesCe champ est obsolète, mais il sera tout de même analysé ; il est recommandé de privilégier l'utilisation de champs nommés.
Tutoriels et documentation
- Nouveaux tutoriels: 05 Contrôle de position, 06 Combinaisons (Inverse3 + Verse Grip), 07 Références et installation, 08 Configurateur à distance HTTP, 09 Contrôle à distance via WebSocket, 10 Écouteur de flux d'événements.
- Ajouter une variante Glaze à chaque tutoriel C++(
cpp-glz/), qui coexiste avec la variante nlohmann/json existante. - Tous les tutoriels ont été réécrits conformément à l'API v3.1(port 10001,
configure.preset, champ de commande nommée,print_state()(fonctions auxiliaires). - L'ancientutoriel sur le Verse Grip Stopper a été supprimé; il a été remplacé par un nouveau tutoriel combiné.
- La documentation publiquea été mise à jour et comprend désormais les guides du SDK, la documentation de référence des API et les pages consacrées au matériel.