Gant tactile Juqiao

Collecte de données

Enregistrez la pression de contact ainsi que l’état des articulations du robot et la vidéo de la caméra. Le gant ajoute une modalité tactile qui capture comme c'est dur la pince du robot appuie – une information invisible à la seule vision.

Ce que le gant ajoute à votre ensemble de données Les ensembles de données de téléopération standard capturent les positions des articulations, les vitesses et les images des caméras. L'ajout du gant Juqiao enregistre une carte de pression à 64 nœuds, 200 Hz montrant la répartition spatiale de la force de contact lors de chaque prise. Les politiques formées sur ces données peuvent apprendre à moduler la force de préhension – cruciale pour les objets fragiles ou déformables.
Configuration du matériel

Connexions système

Connectez tous les appareils avant de démarrer un logiciel. Le gant est strictement câblé en USB – il n’y a pas de mode sans fil.

Bras + Main du Robot

Orca Hand (recommandé) ou autre effecteur final. Connecté via un adaptateur USB Feetech ou CAN, selon le bras.

/dev/ttyUSB0 or CAN0

Gant Juqiao

USB-C pour héberger un PC. Apparaît en tant que série CDC-ACM. Câble de 1,5 m ; utilisez une extension USB si nécessaire pour la liberté de mouvement.

/dev/ttyACM0

Caméra de poignet

Caméra USB ou GigE montée sur le poignet du robot, offrant une vue centrée sur l'objet pour l'entraînement.

/dev/video0 or GigE IP

Caméra aérienne

Caméra d'espace de travail fixe pour le contexte de la scène. Associez-le à la caméra-bracelet pour des ensembles de données multi-vues.

/dev/video2 or GigE IP

Dispositif de téléopération

Bras leader (SO-101 / OpenArm leader), contrôleur VR ou SpaceMouse conduisant le robot suiveur.

Capitaine de port/HID
Flux de travail d'enregistrement

Enregistrement étape par étape

1

Faites apparaître le bras et la main du robot

Démarrez le pilote de bras (et le pilote Orca Hand le cas échéant) dans des terminaux séparés. Vérifiez que les joint_states sont publiés avant de continuer.

# Terminal 1: Robot arm (example: OpenArm) ros2 lance openarm_ros2 openarm.launch.py ​​​​​​​​port :=/dev/ttyUSB0 # Terminal 2: Orca Hand (if using Orca Hand end-effector) ros2 lance orca_ros2 orca_hand.launch.py ​​​​​​​​port :=/dev/ttyUSB1 # Verify sujet ros2 hz /joint_states # Should be ~100 Hz sujet ros2 hz /orca_hand/joint_states # Should be ~100 Hz
2

Démarrez le pilote Juqiao Glove

Lancez le nœud du gant ROS2. Vérifiez que les données à 200 Hz circulent avant de démarrer toute session d'enregistrement.

# Terminal 3: Juqiao Glove ros2 lance le port juqiao_glove_ros2 Glove.launch.py ​​​​​​:=/dev/ttyACM0 # Verify pressure data is live sujet ros2 hz /juqiao_glove/tactile_array # Should be ~200 Hz sujet ros2 echo /juqiao_glove/grasp_region # Should print region strings
3

Caméras de lancement

Démarrez les nœuds de caméra pour les vues du poignet et du dessus. Vérifiez que les sujets d'images sont publiés à la fréquence d'images cible (généralement 30 ips).

# Wrist camera (USB) ros2 exécute usb_cam usb_cam_node_exe --ros-args -p video_device:=/dev/video0 -p framerate:=30.0 # Overhead camera (GigE example) ros2 lance camera_ros2 gige_camera.launch.py ​​​​​​​​ip:=192.168.1.100 # Verify sujet ros2 hz /wrist_camera/image_raw sujet ros2 hz /overhead_camera/image_raw
4

Vérifiez que tous les flux sont synchronisés

Utiliser liste de sujets ros2 pour confirmer que tous les sujets requis sont présents. Vérifiez que les horodatages sont dans les 20 ms pour toutes les modalités avant d'enregistrer des épisodes.

liste de sujets ros2 | grep -E "joint|tactile|image|saisir" # Expected topics: # /joint_states (arm, ~100 Hz) # /orca_hand/joint_states (hand, ~100 Hz) # /juqiao_glove/tactile_array (glove, ~200 Hz) # /juqiao_glove/grasp_region (glove, ~200 Hz) # /wrist_camera/image_raw (camera, 30 Hz) # /overhead_camera/image_raw (camera, 30 Hz)
5

Enregistrer un jeu de données avec LeRobot

Utilisez le script d'enregistrement de LeRobot. Le --tactile-sujet flag ajoute le flux de pression des gants sous forme de colonne d'ensemble de données aux côtés des états et des images des articulations.

# Record 50 episodes; press Enter to start each, Space to stop python -m lerobot.scripts.record \ --robot-path lerobot/configs/robot/orca_hand.yaml \ --fps 30 \ --repo-id $HUGGINGFACE_USER/orca_grasp_tactile \ --tags "gant juqiao, toucher, manipulation" \ --preheat-s 2\; --episode-time-s 30 \ --reset-time-s 5 \ --num-episodes 50 \ --push-to-hub \ --tactile-topic /juqiao_glove/tactile_array \ --tactile-key tactile_pressions
Pas encore d'indicateur LeRobot --tactile-topic ? Utilisez le wrapper d'enregistreur multimodal SVRC qui gère automatiquement la synchronisation et le schéma de l'ensemble de données : pip installer roboticscenter[enregistreur]
6

Revoir les épisodes avant de pousser

Rejouez chaque épisode avec la superposition de carte thermique pour vérifier la qualité des données tactiles avant de vous engager dans le HuggingFace Hub.

# Replay and overlay heatmap on video python -m roboticscenter.scripts.review_episode \ --dataset-path ./data/orca_grasp_tactile \ --index-épisode 0 \ --overlay-tactile \ --tactile-key tactile_pressions # Discard bad episodes python -m lerobot.scripts.delete_episodes \ --dataset-path ./data/orca_grasp_tactile \ --épisodes 3 7 12 # episode indices to discard
7

Pousser vers HuggingFace Hub

Téléchargez l'ensemble de données validé. La fiche de l'ensemble de données est générée automatiquement avec des descriptions de modalités, notamment tactiles.

connexion huggingface-cli # first time only python -m lerobot.scripts.push_dataset \ --dataset-path ./data/orca_grasp_tactile \ --repo-id $HUGGINGFACE_USER/orca_grasp_tactile # Verify upload python -c " à partir des ensembles de données importer load_dataset ds = load_dataset('$HUGGINGFACE_USER/orca_grasp_tactile', split='train') print(ds.column_names) print(ds.features['tactile_pressions']) "
Référence

Schéma de l'ensemble de données

Chaque image de l'ensemble de données contient les colonnes suivantes. Tous les tableaux sont stockés sous forme de colonnes float32 Parquet ; images sous forme de séquences vidéo MP4.

ColonneForme / TypeDescription
observation.état flotteur32[6] Positions des articulations du bras du robot (radians). L'index 6 est l'ouverture de la pince si vous utilisez un bras 6-DOF.
observation.hand_state flotteur32[17] Positions articulaires de la main Orca (radians), 17 DOF. Omettre si aucune main adroite. Étiqueté par nom commun dans les métadonnées.
observation.tactile_pressions flotteur32[64] Pression normalisée du Juqiao Glove par nœud, 0,0 (pas de contact) à 1,0 (pleine échelle). 200 Hz sous-échantillonnés pour correspondre à la fréquence d'images du robot.
observation.tactile_pressions_raw uint16[64] Valeurs ADC brutes 16 bits. Conserver pour renormalisation après recalibrage. Facultatif; omettre pour réduire la taille de l’ensemble de données.
observation.grasp_region str Heuristique de région de contact active : "palmier", "pouce", "indice", "milieu", "anneau", "pinky", ou "" (pas de contact).
observation.images.poignet uint8[H, W, 3] Image RVB de la caméra de poignet à 30 ips, stockée sous forme de séquence vidéo MP4.
observation.images.overhead uint8[H, W, 3] Cadre RVB de la caméra aérienne à 30 ips.
action float32[6 ou 23] Positions articulaires cibles pour le bras (6) et éventuellement la main (17). La forme dépend de la présence ou non d'une main adroite.
langue_instruction str Description de la tâche, par ex. "ramasser l'œuf sans le casser". Permet une formation aux politiques conditionnée par la langue.
épisode_index int Numéro de l'épisode dans l'ensemble de données.
cadre_index int Numéro d'image dans l'épisode (indexé à 0).
horodatage flotteur 64 Secondes écoulées depuis le début de l'épisode.

Sous-échantillonnage tactile

Le gant diffuse à 200 Hz ; le robot et les caméras fonctionnent généralement entre 30 et 100 Hz. L'enregistreur aligne les images en utilisant la correspondance d'horodatage du voisin le plus proche. Pour conserver l'intégralité du flux tactile de 200 Hz sous la forme d'un réseau distinct :

# Store full-rate tactile as a variable-length array per frame python -m roboticscenter.scripts.record \ --tactile-mode full_rate # default is "matched" (one per robot frame) # This produces a ragged column: observation.tactile_sequence # shape per row: float32[N, 64] where N varies (typically 6-7 frames at 200Hz/30fps)
Qualité

Liste de contrôle de la qualité des épisodes

Examinez chaque épisode par rapport à ces critères avant de l'inclure dans votre ensemble de données. Un mauvais épisode peut introduire de faux schémas tactiles qui dégradent la formation politique.

  • Le flux tactile est continu – pas d’espace entre les images Vérifier frame.séquence incréments sans sauts. Les pertes d’images apparaissent sous forme de valeurs répétées dans la colonne tactile.
  • La ligne de base au repos est proche de zéro (<0,03) Au début de l'épisode (avant tout contact), la pression maximale au nœud doit être inférieure à 0,03. Une dérive supérieure à 0,05 au repos indique que le gant doit être recalibré.
  • Les événements de contact s'alignent sur les prises visibles dans la vidéo Rejouer avec --overlay-tactile. Les pics de pression (nœud max > 0,4) doivent coïncider avec la fermeture visible de la pince dans la caméra du poignet.
  • La région de préhension est cohérente pendant la phase de contact saisir_region devrait se stabiliser sur une ou deux régions lors de chaque prise (par ex. "palmier" + "indice"). Des régions qui changent rapidement indiquent un mauvais alignement des gants ou un signal bruyant.
  • Latence du gant < 20 ms par rapport à l'état du robot Comparez le début de l’événement tactile au pic de vitesse de la pince. Une latence > 20 ms suggère une congestion du hub USB : connectez le gant directement à un port USB hôte.
  • L'enseignement de la langue correspond à la tâche démontrée Pour les ensembles de données conditionnés par le langage, assurez-vous que les instructions saisies au début de l’épisode décrivent avec précision ce que l’opérateur a réellement démontré.
  • Aucune interférence de câble avec le mouvement du robot Le câble USB de 1,5 m ne doit pas restreindre les mouvements de la main de l'opérateur ni retirer le gant pendant l'épisode. Utilisez un clip de gestion des câbles sur l'avant-bras.
Formation politique

Entraînement avec observations tactiles

Les politiques qui utilisent la saisie tactile voient généralement une amélioration de 15 à 30 % sur les tâches sensibles au contact (manipulation d'objets fragiles, insertion de chevilles, pliage de tissu) par rapport aux lignes de base basées uniquement sur la vision.

# ACT policy with tactile observations (SVRC fork adds tactile encoder) python -m lerobot.scripts.train \ --dataset-repo-id $HUGGINGFACE_USER/orca_grasp_tactile \ --acte politique \ --policy.observation_keys \ "observation.images.poignet" \ "observation.images.overhead" \ "observation.état" \ "observation.hand_state" \ "observation.tactile_pressions" \ --output-dir sorties/act_tactile # The tactile encoder maps float32[64] → latent via a small MLP # No special architecture changes required for ACT or Diffusion Policy
# Diffusion Policy with tactile (identical --observation_keys, different policy flag) python -m lerobot.scripts.train \ --dataset-repo-id $HUGGINGFACE_USER/orca_grasp_tactile \ --diffusion des politiques \ --policy.observation_keys \ "observation.images.poignet" \ "observation.état" \ "observation.tactile_pressions" \ --output-dir sorties/diffusion_tactile
Astuce : ablation tactile au moment de l'évaluation Passeuse observation.tactile_pressions = zéros (64) lors de l'inférence pour mesurer dans quelle mesure la politique repose sur le tactile par rapport à la vision. Cela permet d'identifier si votre tâche nécessite du toucher ou si la vision est suffisante.