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 intégrée, une prise en charge complète de l'Minverse , des flux d'événements typés, une API de configuration complète et une interface HTTP mieux structurée. Elle inclut également les corrections de bogues et les améliorations d'ergonomie apportées au cours de cette année.
Points clés
- Couche mathématique 3D intégrée — Il s'agit d'un pipeline de transformations combinables doté de primitives de premier ordre pour les transformations « device basis » (trame), de montage, d'espace de travail et de navigation, qui fournit également des transformations explicites entre les espaces locaux, de session, d'application et internes.
- Navigation par bulles — Permet d'explorer un espace de travail virtuel à grande échelle à l'aide de zones de forme définie (primitives SDF) et offre un contrôle de la vitesse basé sur la cartographie de vitesse, une détection des collisions tenant compte de l'hystérésis, ainsi qu'une dérive directionnelle sélective du curseur. La configuration complète s'effectue via HTTP et WebSocket, et le système prend en charge la conversion aller-retour entre l'espace de l'application et l'espace réel.
- Flux d'événements de type spécifié — Canaux d'événements WebSocket dédiés au cycle de vie des appareils, aux notifications de sécurité, à l'étalonnage, à la batterie, aux alertes de cycle de contrôle et aux avis de fin de prise en charge.
- API de configuration — Système complet de configuration clé-valeur prenant en charge les opérations CRUD HTTP, les indications de type, les contraintes de plage et les descriptions, qui remplace les fichiers de configuration imbriqués existants.
- Configuration cohérente des périphériques — Fournit un ensemble unique de routes HTTP pour tous les appareils :
basis,mount,preset,transform,filters,handedness,torque_scaling,gravity_compensation,home_return. - Minverse e synchronisé + étalonnage du stylet — L'appareil et le stylet sont désormais étalonnés ensemble, et l'état d'étalonnage reste verrouillé jusqu'à ce que le manche soit physiquement fixé.
- Amélioration de l'ergonomie HTTP — Sélecteur de périphérique basé sur un index (spécification du périphérique par index sans identifiant), format de requête/réponse unifié partagé entre les WebSockets, utilisation facultative de
{ok, error, data}Enveloppe (?format=json), propose des sélecteurs de session avec caractères génériques.
Nouvelles fonctionnalités
Appareil
- Minverse — Cette version inclut désormais la prise en charge officielle des fonctionnalités suivantes : détection des appareils, séquence de mise en état, notifications de sécurité et workflow de calibrage synchronisé.
- Les modèles « Ruko » et « Kingfisher» sont reconnus comme des types officiels de poignées.
- Prise en charge des simulateurs de périphériques — Permet de détecter et de communiquer avec des périphériques simulés par logiciel, en complément du matériel physique.
- Protection contre les boucles de connexion — Les ports qui ne fonctionnent pas correctement sont automatiquement bloqués, et
POST /ports/{port}/resetet le réinitialise. - Détection de la mise en place du stylo — Grâce à la technologie Debounce, la mise en place et le retrait du stylo sont détectés de manière fiable.
Sessions, commandes et WebSocket
- Filtrage et persistance des profils de session — Une session déclare un nom de profil et la version du SDK requise, que le service conserve en mémoire même après une reconnexion ; le client et les outils de surveillance peuvent ainsi filtrer et cibler les sessions à l'aide de ce profil.
- Tampon de commandes par session — Une session lente n'entrave plus le fonctionnement des autres sessions.
- Explicite pour les commandes ponctuelles
configureCarte — par appareilbasis,preset,mount,force_gate,dampinget par sessionprofile,basisC'est maintenant tout le mondeconfigureest inclus. Conformément à la table de configuration de sortie, les valeurs transmises et celles lues correspondent dans les deux sens. - Montage d'un périphérique personnalisé — Préréglages d'espace de travail intégrés (
defaults,arm_front,arm_front_centered,led_front,led_front_centered) ou envoyer une conversion explicite. En cas de modification manuelle du montage, les préréglages sont automatiquementcustomsera converti en. - Champ de commande nommé —
position,vector,angles,torquesqui est courantvaluesRemplace le tableau. set_angular_torquesaset_angular_torqueremplace (la forme au singulier n'est plus prise en charge).- Extension de la trame de session — Extensible aux trames de session v3.0 et v3.1
config,state,statusL'objet est inclus. Les nouveaux champs de sortie sont les suivants :current_cursor_force,current_cursor_position,current_angular_torques,current_angular_position,control_domain,control_mode,transform,transform_velocity, étenduconfig.*, etstatus.safety(masqué par défaut) est disponible. - Mise à jour de la conversion partielle — Montage, conversion de l'espace de travail, sous-champs à modifier dans la géométrie de navigation (
position,rotation,scale) Il suffit de l'envoyer.
HTTP
GET /— Version du service.GET/POST/DELETE /settingset/settings/*— API complète de configuration des paires clé-valeur.GET /sessions/{session}etGET/POST/DELETE /sessions/{session}/profile.GET /devices?session=<selector>— Convertit les coordonnées du périphérique dans l'espace applicatif de la session spécifiée.- Sélecteur de périphériques basé sur un index — Même si vous ne connaissez pas l'ID, vous pouvez spécifier tous les périphériques à l'aide d'un index (dans le cas du premier Inverse3, par exemple)
/inverse3/0/..., pour tous les appareils de la gamme Inverse/inverse*/*/...). - Format des requêtes et réponses intégrées — Le corps des requêtes POST/GET est identique à celui utilisé par WebSocket
command_dataLe format JSON est utilisé. Le code écrit pour un mode de transmission donné fonctionne également avec d'autres modes de transmission. - Enveloppe sélective — sur tous les itinéraires
?format=jsonpeut être activé via,/settings*etGET /home_returnest, par défaut,{ok, error, data}utilise. Si vous souhaitez le format brut,?format=plainutilise. - Caractères génériques dans les sélecteurs de session — Dans le nom du profil
*est une chaîne de caractères quelconque,?signifie un caractère unique. - Sélecteurs décodés en pourcentage —
%2A,%3ACes éléments sont décodés avant le routage.
Événement
communication/events/portIl s'agit du flux d'événements WebSocket dédié.- Il existe 24 catégories d'événements spécifiées, qui comprennent le cycle de vie de l'appareil, la sécurité (frein électronique, détection de corps étrangers, calage), les échecs d'étalonnage, les notifications relatives à la batterie, les alertes de session, les cycles de contrôle faibles/critiques, la validation des entrées et les avertissements de fin de prise en charge.
caractère observable
- Lors du profilage, les messages de journal sont transmis à Tracy avec des couleurs correspondant à chaque niveau.
- Une zone Tracy est configurée pour chaque gestionnaire HTTP.
- Événement statistique de synchronisation de la boucle principale.
- Vous pouvez configurer le répertoire des journaux et le nom d'hôte du serveur (compatible avec Docker).
3.6 Fonctionnalités prévues
- Les travaux liés à SDF HFX (SDF Haptic Effects) ont été intégrés dans la version 3.5 (module, cycle de vie, sérialisation des commandes et des états fournis par le module). L'API publique devrait être publiée dans la version 3.6, accompagnée de la documentation complète.
Améliorations apportées
- Filtrage des vibrations de force — comprend la détection des vibrations par axe, une récupération progressive en 8 étapes, un vote d'entrée avec hystérésis et une plage de désactivation asymétrique.
- Filtre « force-gate » à exécution dynamique — Via WebSocket ou HTTP
configure.force_gate.gainIl peut être configuré et fournit des valeurs par défaut qui sont enregistrées de manière permanente. - Augmentation de la fréquence maximale de la boucle principale à 32 kHz (pour les applications de précision).
- Une charge utile WebSocket plus petite — Le sous-champ de transformation d'identité (identity), qui est la valeur par défaut (
position = 0,rotation = identity,scale = 1) est par défaut omis dans la sortie. Cela permet de réduire la taille de la charge utile et de rétablir la compatibilité avec les anciens paquets Unity soumis à une limite de 4 Ko par message. Deux paramètres avancés (serialization/explicit_fields,serialization/force_complete_transforms) permet de réintégrer tous les champs pour les consommateurs qui en ont besoin. - Réduction de la gigue dans la boucle principale — Le traitement des messages WebSocket ne bloque plus les ticks de la boucle principale, même pendant l'analyse JSON et la transmission réseau ; de plus, la planification des ticks de session a été avancée par rapport à la sérialisation des réponses.
- Par défaut, le serveur fonctionne uniquement sur localhost. —
communication/bind_all_interfacesVous pouvez activer l'accès au réseau dans les paramètres. - Utilisation de la syntaxe des préfixes avec les caractères génériques dans les sélecteurs de périphériques (par exemple :
inverse*(est compatible avec tous les appareils de la gamme Inverse). - Commande d'amortissementce
force_gateavecconfigureIl a été déplacé vers la carte. - Le logger à rotationremplace l'ancien logger et permet de structurer les répertoires.
- Commandes et états fournis par le module — Le module peut injecter ses propres commandes et configurer des champs sans modifier le schéma de base, et ajouter des informations d'état aux trames WebSocket.
Modifications apportées
Cette mise à jour inclut les corrections de bogues apportées au cours de l'année écoulée ; les modifications les plus importantes sont les suivantes :
- Problème lié à l'irrégularité de la vitesse de connexion dans certaines conditions.
- Problème lié au **GripHook (Verse Grip Stopper)** qui ne se désactivait pas correctement lorsque la simulation n'était pas en cours d'exécution.
- Inverse3 Problème lié àun délai d'expirationtrop court, qui provoquait une boucle de déconnexion sur les appareils dont le démarrage était lent.
- Le service ne se ferme pas correctement sous Windows — problème lié au fait que le serveur HTTP n'était pas toujours nettoyé à la fermeture.
- Boucle de reconnexion qui se produisait lorsque le service envoyait des commandes non prises en charge par la version précédente du micrologiciel.
- Problème lié au fait que, sur les systèmes équipés d'un adaptateur Bluetooth, le répertoriagedes périphériques Bluetoothsaturait excessivement le journal.
- Un plantage qui se produisait lors du redémarrage successif et répété du service.
- Problème de blocage de la clé sans fil Verse Grip sur un ordinateur portable Ubuntu après la sortie du mode veille.
- Sous Linux et macOS, si la connexion sans fil du Verse Gripéchoue lors de la première tentative de détection, le système passe désormais correctement à la procédure de secours.
- Emplacement des fichiers de configuration de macOS — Au lieu d'un chemin d'accès incorrect
~/Library/Application Support/a été modifié pour être enregistré dans . - Gestion du signal SIGSEGV sous Linux et macOS — Lorsque la capture des conflits multithread est activée, le processus ne reste plus bloqué en boucle à l'infini en cas de signal fatal.
- Remplacement des commandes entre sessions — Alors qu’auparavant les commandes de configuration d’une session pouvaient être remplacées en silence par celles d’une autre session, elles sont désormais correctement filtrées et fusionnées.
- Remplacer les paramètres de la commande « Probe » —
probe_positionLes sessions de surveillance qui transmettent des données (par exemple, Haply Hub) ne remplaçent plus silencieusement les modifications en attente concernant les paramètres « basis », « preset » et « profile ». - Affichage des poignées des prototypes — Problème lié au fait que le matériel des prototypes s'affichait par erreur avec des poignées standard au lieu de poignées personnalisées.
- Pour les clients qui n'ont pas effectué la migration Héritage
set_basisRègles relatives aux matricesCette fonctionnalité est à nouveau prise en charge. - Lors de la déconnexion d'une session, le coup de pied puissant de« Inverse3 »ne génère plus de pic de puissance résiduelle.
- Situation de concurrence entraînant la perte de connexion WebSocket lors de la répétition de connexions et de déconnexions rapides.
- Dans certaines charges utiles sortantes, **WebSocket
session_id**a0Problème lié à la sérialisation. - Sous Windows
--devDésormais, lorsqu'on l'utilise avec--log-levelCela s'applique (auparavant,debuga été réinitialisé discrètement).
Avis d'arrêt de l'aide
Cette fonctionnalité fonctionne toujours, mais elle sera supprimée dans une prochaine version majeure. Le cas échéant, veuillez indiquer dans votre réponse deprecation_warning Il contient des champs.
| Personnes concernées par la suspension de l'aide | Élément de remplacement |
|---|---|
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 de configuration |
POST /experimental/features/screensaver_enable | API de configuration |
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 concernant la compatibilité
Il n'y a pas de modification majeure susceptible de nuire à la compatibilité avec la version 3.4.19. Voici deux remarques concernant les intégrations existantes :
- Les points de terminaison HTTP dont la prise en charge a été interrompue renvoient désormais dans leur réponse
deprecation_warningIl contient des champs. Les clients qui vérifient rigoureusement le schéma de réponse doivent accepter ces champs supplémentaires. - WebSocket
command_datadevaluesCe champ n'est plus pris en charge, mais il est toujours analysé. Il est recommandé d'utiliser des champs nommés.
Tutoriels et documentation
- Nouveaux tutoriels: 05 Contrôle de position (Position Control), 06 Intégration (Inverse3 +Verse Grip), 07 Basis et montage (Basis and Mount), 08 Configurateur à distance HTTP (Remote Configurator), 09 Contrôle à distance via WebSocket (Remote Control), 10 Écouteur de flux d'événements (Event Stream Listener).
- Nouvelle variante de Glaze: Outre la variante nlohmann/json existante, une nouvelle variante Glaze pour tous les tutoriels C++ (
cpp-glz/) a été ajouté. - Réécriture de tous les tutoriels: Réécrit pour être compatible avec l'API v3.1 (port 10001,
configure.preset, champ de commande nommé,print_state()(assistant). - Suppression: l'ancien tutoriel sur le Verse Grip Stopper a été supprimé et remplacé par un nouveau tutoriel intégré.
- Mise à jour de la documentation publique: le guide du SDK, la documentation de référence des API et l'ensemble des pages consacrées au matériel ont été mis à jour.