Nouvelle étape franchie dans l’univers des technologies d’intelligence artificielle.
Au cœur d’IsaacTeleop de NVIDIA : du suivi des mains et des manettes aux actions des robots grâce au moteur de retargeting basé sur des graphes
Dans ce tutoriel, nous allons découvrir le moteur de reciblage au cœur de NVIDIA Isaac Teleop, le framework qui transforme le suivi des mains en réalité mixte (XR) et les entrées des manettes de mouvement en commandes destinées à des robots simulés ou réels. Plutôt que de brancher un casque, nous créons nous-mêmes chaque entrée dans NumPy, de sorte que chaque étape s’exécute sur un simple processeur Colab et affiche le résultat de ses calculs. Nous commençons par définir le système de types utilisé par chaque nœud, générons des données synthétiques relatives à la main et au contrôleur, écrivons notre propre module de retargeting avec des paramètres réglables en temps réel, puis pilotons grâce à celui-ci la pince intégrée et les modules de retargeting SE(3). À partir de là, nous construisons un graphe complet qui génère un vecteur d’action à chaque étape, nous appliquons une transformation dans le repère mondial, nous exécutons le programme étape par étape, nous mettons en pause puis arrêtons la machine à états, et nous terminons par une mise en correspondance entre le contrôleur et la main habile de cette manière qu’un réglage des paramètres qui persiste d’un redémarrage à l’autre.
Fait intéressant, nous installons la version stable « isaacteleop » proposé sur PyPI avec l’extension « retargeters-lite », qui n’ajoute que SciPy, puis nous indiquons la version, l’interpréteur et la version de NumPy. Le package se compose de modules d’E/S de périphériques qui encapsulent OpenXR et CloudXR, d’un module de schéma contenant les types de messages FlatBuffer émis par chaque tracker, et du moteur de retargeting entièrement en Python que nous utilisons ici. La liste des types de schémas présente le vocabulaire de la couche de données, mais aucune des options ci-dessous ne permet d’ouvrir une session Headset ; à partir de là, chaque entrée est un tenseur que nous construisons manuellement.
Nous pilotons deux des systèmes de recalibrage intégrés à l’aide des mêmes groupes synthétiques.
Le contrat du moteur est de type `TensorGroupType`, une liste ordonnée de slots typés, et un `TensorGroup`, le conteneur d’exécution qui contient une valeur par slot et valide chaque écriture. HandInput contient quatre tableaux NumPy correspondant aux 26 articulations des mains OpenXR, tandis que ControllerInput comporte quatorze emplacements pour les poses, les boutons et les axes, accessibles via des indices IntEnum générés plutôt que par des nombres magiques. Tenter d’écrire dans un tableau de type float64 alors que le type float32 est déclaré entraîne un échec de l’écriture, et la lecture d’un emplacement dans lequel aucune donnée n’a été écrite déclenche une exception au lieu de renvoyer des données obsolètes. OptionalType indique les entrées qu’un tracker peut ne pas fournir ; le groupe OptionalTensorGroup correspondant est initialement absent et devient présent lors de sa première écriture, ce qui offre la possibilité à chaque nœud en aval de détecter qu’une main a quitté le volume de suivi.
Nous générons les informations de suivi qu’un casque fournirait normalement. La fonction `make_hand` définit 26 articulations dans l’ordre OpenXR autour d’une position de poignet, trace quatre chaînes de doigts et une chaîne de pouce à partir de la paume, et place le bout du pouce à une distance de pincement choisie par rapport au bout de l’index, de sorte que le seul chiffre dont dépendent les étapes suivantes soit sous notre contrôle. La fonction `make_controller` remplit chaque emplacement ControllerInput : les poses de préhension et de visée avec des indicateurs de validité, les quatre boutons, les axes du joystick, ainsi que les valeurs analogiques de pression et de gâchette. Les deux renvoient des TensorGroups ordinaires, ce qui correspond à tout ce qu’un retargeteur peut voir, que les nombres proviennent d’OpenXR ou de NumPy.
Un « retargeter » est une sous-classe de `BaseRetargeter` qui déclare les spécifications `input_spec` et `output_spec` et implémente la fonction `_compute_fn` ; le framework complète les entrées facultatives manquantes avec des groupes absents, valide les types, synchronise les paramètres, puis appelle notre code. PinchRetargeter mesure la distance entre le pouce et l’index et renvoie une valeur flottante et un booléen, en indiquant -1 lorsqu’aucune main n’est suivie, plutôt que de faire une estimation. Ses deux paramètres sont stockés dans un `ParameterState` dont les fonctions de synchronisation écrivent dans l’instance avant chaque calcul ; ainsi, une valeur définie depuis un autre thread via l’interface utilisateur de réglage prend effet dès l’image suivante. Nous reproduisons ce comportement en appelant directement la méthode `set` : le même pincement de 2,8 cm alterne entre l’absence de pincement et le pincement à mesure que le seuil évolue, et le fait de basculer la mesure vers les articulations distales modifie la distance elle-même.
En complément, nous pilotons deux des systèmes de recalibrage intégrés à l’aide des mêmes groupes synthétiques. Le « GripperRetargeter » convertit la distance de pincement en commande de préhenseur -1/+1 attendue par Isaac Lab, avec une hystérésis : la pince se ferme en dessous de 3 cm, s’ouvre au-delà de 5 cm et conserve son état entre ces deux valeurs ; ainsi, à 4,0 cm, elle reste fermée après une fermeture, et le retour vers 5,2 cm la rouvre. Un contrôleur actif a la priorité, et un déclenchement supérieur au seuil ferme une main ouverte. Se3AbsRetargeter mappe la pose de préhension du contrôleur vers une cible d’effecteur terminal à 7 degrés de liberté, en appliquant le décalage de roulis configuré et en ne conservant que le lacet lorsque l’option zero_out_xy_rotation est activée. Il conserve la dernière pose lorsque la préhension devient invalide, plutôt que de transmettre un quaternion nul en aval. Se3RelRetargeter génère plutôt des deltas : un pas constant de 2 cm par image semble multiplié par dix et lissé par la moyenne exponentielle mobile (EMA), pour converger vers 0,2.
Une chose est sûre : le secteur continue d’avancer à grande vitesse.
À lire également :
- Valor, Atreides et Sequoia investissent dans la start-up spécialisée dans l’IA Flow Engineering, dont la valorisation s’élève à 750 millions de dollars | TechCrunch
- Peak XV relève le plafond de ses investissements d’amorçage « Surge » à 5 millions de dollars et dévoile une promotion de 18 start-ups | TechCrunch
- Black Forest Labs lance FLUX 3 Action : un modèle d’action de la catégorie « 7B Open-Weights » qui surpasse le RoboLab-120
Article original : MarkTechPost : MarkTechPost