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, la prise en charge complète de «Minverse », des flux d'événements typés, une API de configuration complète et une interface HTTP simplifiée. Elle comprend également toutes les corrections de bogues et améliorations de l'ergonomie apportées au cours de l'année écoulée.
Points forts
- Couche mathématique 3D intégrée — Ce pipeline de transformations composable offre des primitives de premier ordre pour les transformations de base (cadre), de montage, d'espace de travail et de navigation de l'appareil, tout en prenant en charge les transformations explicites entre les espaces local, de session, d'application et interne.
- Navigation par bulles — Les zones dotées d’une forme (primitives SDF) permettent de se déplacer au sein d’un espace de travail virtuel de grande envergure. Ce système prend en charge le contrôle de la vitesse par mappage de vitesse, la détection des collisions tenant compte de l’hystérésis, ainsi qu’une dérive optionnelle dans la direction du curseur. Il est entièrement configurable via HTTP et WebSocket, et prend également en charge les allers-retours au sein de l’espace de l’application.
- Flux d'événements typés — Il s'agit de canaux d'événements WebSocket dédiés, correspondant au cycle de vie de l'appareil, aux alertes de sécurité, à l'étalonnage, à la batterie, aux avertissements relatifs au taux de contrôle et aux conseils concernant les pratiques déconseillées.
- API de configuration — Système complet de configuration clé-valeur intégrant les opérations CRUD via HTTP, des indications de type, des contraintes de plage et des descriptions. Il remplace les fichiers de configuration imbriqués traditionnels.
- Cohérence des paramètres des appareils — Utilisez une route HTTP commune à tous les appareils :
basis,mount,preset,transform,filters,handedness,torque_scaling,gravity_compensation,home_return。 - Minverse Calibrage synchronisé du stylet — Il est désormais possible de calibrer simultanément l'appareil et le stylet. Le calibrage reste verrouillé jusqu'à ce que la poignée soit physiquement fixée.
- Amélioration de la facilité d'utilisation du protocole HTTP — Sélecteur de périphériques basé sur un index (qui ne nécessite pas d’ID et permet de spécifier un périphérique à l’aide d’un index), format de requête/réponse commun à WebSocket, option d’adhésion
{ok, error, data}Enveloppe (?format=json), nous avons intégré un sélecteur de session avec caractères génériques.
Nouvelles fonctionnalités
Appareil
- Minverse — Cette version inclut désormais la prise en charge officielle des workflows suivants : détection, séquence de préparation, notifications de sécurité et étalonnage synchronisé.
- Les modèles « Ruko » et « Kingfisher » sont désormais reconnus comme des types de produits de poignées officiels.
- Prise en charge des simulateurs d'appareils — Outre les appareils physiques, vous pouvez détecter et communiquer avec des appareils simulés par logiciel.
- Protection contre les boucles de connexion — Les ports présentant un comportement anormal sont automatiquement bloqués.
POST /ports/{port}/resetVous pouvez le réinitialiser. - Capteur de battement cardiaque avec stylo — Doté d'un système anti-bruit (débounce), il détecte de manière fiable la mise en place et le retrait de la poignée.
Session, commande, WebSocket
- Filtrage et persistance des profils de session — Une session déclare un nom de profil et la version requise du SDK. Le service mémorise ces informations d'une reconnexion à l'autre, ce qui permet aux clients et aux outils de surveillance de filtrer et de spécifier les sessions en fonction de ce profil.
- Tampon de commandes par session — Les sessions lentes ne ralentissent plus les autres sessions.
- Explicite pour les commandes à exécution unique
configureCarte — Par appareilbasis,preset,mount,force_gate,damping, ainsi que par sessionprofileetbasisMais toutconfigurea été regroupé. Comme il a été aligné sur la table de correspondance des paramètres de sortie, les données correspondront lorsque le contenu envoyé sera relu. - Support d'appareil personnalisable — 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. Si vous modifiez manuellement le montage, les préréglages sont automatiquementcustompasse à. - Champ de commande nommé — à usage général
valuesAu lieu d'un tableau,position,vector,angles,torquesOn utilise. set_angular_torquesmaisset_angular_torquea remplacé (la forme au singulier est déconseillée).- Extension du cadre de session — Les trames de session des versions v3.0 et v3.1 sont extensibles
config,state,statusNous disposons désormais d'un objet. Le nouveau champ de sortie contient :current_cursor_force,current_cursor_position,current_angular_torques,current_angular_position,control_domain,control_mode,transform,transform_velocity, plus détailléesconfig.*, etstatus.safety(masqué par défaut) est inclus. - Mise à jour partielle de la conversion — Concernant les montages, la conversion des espaces de travail et les formes de navigation, les sous-champs que vous souhaitez modifier (
position,rotation,scale) uniquement.
HTTP
GET /— Version du service.GET/POST/DELETE /settingset/settings/*— Une API complète de configuration clé-valeur.GET /sessions/{session}etGET/POST/DELETE /sessions/{session}/profile。GET /devices?session=<selector>— Convertit les coordonnées de l'appareil dans l'espace applicatif de la session spécifiée.- Sélecteur de périphériques basé sur un index — Il est possible de spécifier n'importe quel périphérique à l'aide de son index, sans indiquer d'ID (le premier « Inverse3 » correspond à
/inverse3/0/...、Tous les appareils de la gamme Inverse sont/inverse*/*/...). - Formats unifiés de requêtes et de réponses — Le corps des requêtes POST/GET est identique à celui des WebSockets
command_dataLe format JSON est utilisé. Le code écrit pour l'un des protocoles de transport fonctionne également avec l'autre. - Enveloppe « opt-in » — par n'importe quel itinéraire
?format=jsonSpécifiez ./settings*etGET /home_returnLa valeur par défaut est{ok, error, data}. Si vous utilisez le format brut,?format=plainSpécifiez . - Caractères génériques du sélecteur de session — Dans le nom du profil,
*(chaîne de caractères quelconque) et?(Un caractère quelconque) peut être utilisé. - Sélecteur décodé en pourcentage —
%2A,%3ACes éléments, entre autres, sont décodés avant le routage.
Événement
communication/events/portLe flux d'événements WebSocket dédié ci-dessus.- 24 catégories d'événements typés, comprenant notamment le cycle de vie des appareils, la sécurité (freinage d'urgence, détection de corps étrangers, calage), les échecs d'étalonnage, les alertes de batterie, les avertissements de session, les taux de contrôle faibles ou dangereux, la validation des entrées et les conseils déconseillés.
Observabilité
- Lors du profilage, les messages de journal sont transférés vers Tracy avec une couleur correspondant à leur niveau.
- Configurer une zone Tracy pour tous les gestionnaires HTTP.
- Événements statistiques relatifs au timing de la boucle principale.
- Possibilité de configurer le répertoire des journaux et le nom d'hôte du serveur (compatible avec Docker).
Disponibilité prévue dans la version 3.6
- Effets tactiles SDF (SDF HFX) — Les fondements ont été introduits dans la version 3.5 (modules, cycle de vie, sérialisation des commandes et des états fournis par les modules). L'API publique devrait être publiée dans la version 3.6, accompagnée d'une documentation complète.
Points à améliorer
- Filtrage des vibrations de puissance — Détection des vibrations par axe, récupération progressive en 8 étapes, vote d'entrée avec hystérésis, fenêtre de relâchement asymétrique.
- Filtre de puissance en temps réel —
configure.force_gate.gain(via WebSocket ou HTTP). Des valeurs par défaut permanentes sont disponibles. - Pour les applications de haute précision, la fréquence maximale de la boucle principale a été portée à 32 kHz.
- Réduction de la taille de la charge utile WebSocket — Sous-champ de la transformation où la transformation identique est définie par défaut (
position = 0,rotation = identity,scale = 1) est omis par défaut dans la sortie. Cela permet de réduire la taille de la charge utile et de rétablir la compatibilité avec la limite de 4 Ko imposée aux messages par les anciennes versions de Unity. Deux paramètres avancés (serialization/explicit_fields,serialization/force_complete_transforms) permet de restaurer tous les champs pour les consommateurs concernés. - Réduction de la gigue dans la boucle principale — Même pendant l'analyse du JSON et la transmission sur le réseau, le traitement des messages WebSocket ne bloque plus les ticks de la boucle principale. La planification des ticks de session a été déplacée avant la sérialisation des réponses.
- Par défaut, le serveur n'accepte que l'hôte local. — Pour activer l'accès au réseau,
communication/bind_all_interfacesVeuillez activer cette option dans les paramètres. - Utilisation de la syntaxe des préfixes avec les caractères génériques du sélecteur de périphériques(Exemple :
inverse*(compatible avec tous les appareils de la gamme Inverse). - Commande de déchargement ,
force_gatepar ailleursconfigureVous êtes désormais sur la carte. - L'enregistreur de fichiers doté d'une fonction de rotation a remplacé l'ancien modèle, et il est désormais possible de configurer le répertoire.
- Commandes et états fournis par le module — Le module peut définir ses propres commandes et champs, sans modifier le schéma de base, et intégrer la sortie d'état dans les trames WebSocket.
Correction
Il s'agit des corrections de bogues effectuées au cours de l'année. Les bogues ayant eu un impact important sont répertoriés ci-dessous.
- Problèmed'instabilité de la vitesse de connexiondans certaines conditions.
- Problème : lorsque la simulation n'est pas en cours d'exécution, le **GripHook (Verse Grip Stopper)** ne se déverrouille pas correctement.
- Problème lié au délai d'expirationtrop court d'Inverse3, qui provoquait une boucle de déconnexion sur les appareils à démarrage lent.
- Arrêt incomplet des services sous Windows — Problème lié au fait que le serveur HTTP n'est pas toujours correctement arrêté lors de la mise hors tension.
- Boucle de reconnexionlorsque le service envoie une commande non prise en charge par une ancienne version du micrologiciel.
- Problème lié à un système équipé d'un adaptateur Bluetooth :la liste des périphériques Bluetoothgénère un volume important de journaux.
- Plantagesurvenant après plusieurs redémarrages consécutifs du service.
- Problèmede blocage du dongle Wireless Verse Gripaprès la sortie du mode veille sur un ordinateur portable Ubuntu.
- La procédure d'établissement de la connexion du Wireless Verse Grip sous Linux et macOSs'adapte désormais correctement en cas d'échec de la première tentative de détection.
- Emplacement des fichiers de configuration de macOS — La configuration ne doit pas comporter de chemin d'accès erroné, mais
~/Library/Application Support/est désormais enregistré dans. - Gestion des signaux 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 suite d'un signal fatal.
- Remplacement des commandes entre sessions — Il existait auparavant un problème : les commandes de configuration d'une session pouvaient être remplacées à l'insu de l'utilisateur par des commandes provenant d'une autre session. Désormais, celles-ci sont correctement filtrées et fusionnées.
- Remplacement des paramètres via les commandes de sondage —
probe_positionLes sessions de surveillance envoyées (par exemple :Haply Hub) ne remplaient plus les modifications en attente apportées aux paramètres « basis », « preset » et « profile » sans que l'utilisateur en soit informé. - Affichage de la poignée du prototype — Problème lié au fait que le matériel du prototype s'affichait par erreur comme une poignée standard au lieu d'une poignée personnalisée.
- Pour les clients qui n'ont pas encore effectué la migration,L'héritage de
set_basisRègles relatives aux colonnesa été réactivée. - Le coup de pied de force d'Inverse3 lors de la déconnexion de la sessionne provoque plus de pic de force résiduel.
- Une course à la perte de connexion WebSocketqui se produit lors d'une succession rapide de connexions et de déconnexions.
- Dans certaines charges utiles d'envoi, **le WebSocket
session_id**が0Problème lié à la sérialisation. - Sous Windows,
--devmême en cas d'utilisation conjointe avec--log-levelest désormais pris en compte (auparavant, sans que l'on s'en rende compte)debug(avait été réinitialisé).
Non recommandé
Cette fonctionnalité continue de fonctionner, mais elle devrait être supprimée dans une prochaine version majeure. Le cas échéant, la réponse contiendradeprecation_warningIl contient des champs.
| Non recommandé | à la place |
|---|---|
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 WebSocketset_basis | configure.basis |
Remarques concernant la compatibilité
Il n'y a pas eu de changements majeurs depuis la version 3.4.19. Il convient toutefois de noter les deux points suivants concernant les intégrations existantes :
- Les points de terminaison HTTP désormais obsolètes renvoient, dans leur réponse,
deprecation_warningIl inclut désormais ce champ. Les clients qui vérifient rigoureusement le schéma de réponse doivent accepter ce champ supplémentaire. - WebSocket
command_datasitué àvaluesCe champ est obsolète, mais il continue d'être analysé. Il est recommandé d'utiliser des champs nommés.
Tutoriels et documentation
- Nouveaux tutoriels: 05 Contrôle de position, 06 Combiné (Inverse3 + Verse Grip), 07 Base et support, 08 Configurateur à distance HTTP, 09 Commande à distance via WebSocket, 10 Écouteur de flux d'événements.
- Outre les variantes nlohmann/json existantes, une nouvelle variante Glaze (
cpp-glz/) a été ajouté. - Réécrire tous les tutoriels, prise en charge de l'API v3.1 (port 10001,
configure.preset, champ de commande nommé,print_state()(aide). - Nous avons supprimé l'ancien tutoriel sur le « Verse Grip Stopper». Il a été remplacé par le nouveau tutoriel « Combined ».
- Nous avons mis à jour nos documents publics. Cette mise à jour concerne le guide du SDK, la documentation de référence des API et l'ensemble des pages consacrées au matériel.