Guante Táctil Juqiao

Recolección de Datos

Graba la presión de contacto junto con el estado de las articulaciones del robot y el video de la cámara. El guante añade una modalidad táctil que captura qué tan difícil lo que la pinza del robot está presionando — información invisible solo para la visión.

Lo que el guante añade a tu conjunto de datos Los conjuntos de datos estándar de teleoperación capturan posiciones articulares, velocidades e imágenes de la cámara. Agregar el Guante Juqiao registra un mapa de presión de 64 nodos a 200 Hz que muestra la distribución espacial de la fuerza de contacto durante cada agarre. Las políticas entrenadas con estos datos pueden aprender a modular la fuerza de agarre, crucial para objetos frágiles o deformables.
Configuración de Hardware

Conexiones del sistema

Conecta todos los dispositivos antes de iniciar cualquier software. El guante está estrictamente cableado por USB; no hay modo inalámbrico.

Brazo robótico + mano

Mano Orca (recomendada) u otro efector final. Conectado a través de un adaptador USB de Feetech o CAN, dependiendo del brazo.

/dev/ttyUSB0 or CAN0

Guantee Juqiao

USB-C a PC host. Aparece como serial CDC-ACM. Cable de 1.5 m; usa una extensión USB si es necesario para mayor libertad de movimiento.

/dev/ttyACM0

Cámara de muñeca

Cámara USB o GigE montada en la muñeca del robot, proporcionando una vista centrada en el objeto para el entrenamiento.

/dev/video0 or GigE IP

Cámara aérea

Cámara de espacio de trabajo fija para contexto de escena. Combínala con la cámara de muñeca para conjuntos de datos de múltiples vistas.

/dev/video2 or GigE IP

Dispositivo de teleoperación

Brazo líder (SO-101 / líder OpenArm), controlador VR o SpaceMouse que controla el robot seguidor.

Puerto líder / HID
Flujo de Trabajo de Grabación

Grabación paso a paso

1

Levanta el brazo y la mano robóticos

Inicia el controlador del brazo (y el controlador de la Mano Orca si es aplicable) en terminales separadas. Verifica que joint_states esté publicando antes de continuar.

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

Iniciar el controlador del guante Juqiao

Lanzar el nodo ROS2 del guante. Verifique que los datos de 200 Hz estén fluyendo antes de comenzar cualquier sesión de grabación.

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

Lanzar cámaras

Iniciar nodos de cámara para vistas de muñeca y cenital. Confirme que los temas de imagen se están publicando a la tasa de fotogramas objetivo (típicamente 30 fps).

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

Verifique que todos los flujos estén sincronizados

para usar ros2 topic list para confirmar que todos los temas requeridos están presentes. Verifique que las marcas de tiempo estén dentro de 20 ms entre modalidades antes de grabar cualquier episodio.

ros2 topic list | grep -E "joint|tactile|image|grasp" # 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

Grabar un conjunto de datos con LeRobot

Utilice el script de grabación de LeRobot. El --tactile-topic indicador agrega el flujo de presión del guante como una columna de conjunto de datos junto a los estados de las articulaciones y las imágenes.

# Record 50 episodes; press Enter to start each, Space to stop python -m lerobot.scripts.record \
¿No hay aún la bandera --tactile-topic de LeRobot? Usa el envoltorio del grabador multimodal SVRC que maneja la sincronización y el esquema del conjunto de datos automáticamente: pip install roboticscenter[recorder]
6

Revisa los episodios antes de enviar

Reproduce cada episodio con la superposición del mapa de calor para verificar la calidad de los datos táctiles antes de comprometerse con el HuggingFace Hub.

# Replay and overlay heatmap on video python -m roboticscenter.scripts.review_episode \ # Discard bad episodes python -m lerobot.scripts.delete_episodes \ # episode indices to discard
7

Empuje al HuggingFace Hub

Sube el conjunto de datos validado. La tarjeta del conjunto de datos se genera automáticamente con descripciones de modalidad que incluyen táctil.

huggingface-cli login # first time only python -m lerobot.scripts.push_dataset \ # Verify upload pitón -c "
Referencia

Esquema del conjunto de datos

Cada cuadro en el conjunto de datos contiene las siguientes columnas. Todos los arreglos se almacenan como columnas Parquet float32; imágenes como secuencias de video MP4.

ColumnaForma/TipoDescripción
observación.estado float32[6] Posiciones de las articulaciones del brazo robótico (radianes). El índice 6 es la apertura del agarre si se utiliza un brazo de 6 grados de libertad.
observation.hand_state float32[17] Posiciones de las articulaciones de la mano Orca (radianes), 17 grados de libertad. Omitir si no hay mano hábil. Etiquetado por nombre de articulación en los metadatos.
observación.presiones_táctiles float32[64] Presión normalizada del guante Juqiao por nodo, de 0.0 (sin contacto) a 1.0 (escala completa). 200 Hz submuestreado para coincidir con la tasa de fotogramas del robot.
observación.presiones_táctiles_crudas uint16[64] Valores crudos de ADC de 16 bits. Conservar para re-normalización después de la recalibración. Opcional; omitir para reducir el tamaño del conjunto de datos.
observación.región_de_agarrado str Heurística de región de contacto activa: "palma", "pulgar", "índice", "medio", "Cancelar", "meñique", oh "" (sin contacto).
observación.imágenes.muñeca uint8[H, W, 3] Marco RGB de la cámara de la muñeca a 30 fps, almacenado como secuencia de video MP4.
observación.imágenes.sobrehead uint8[H, W, 3] Marco RGB de cámara superior a 30 fps.
acción flotador32[6 o 23] Posiciones de las articulaciones objetivo para el brazo (6) y opcionalmente la mano (17). La forma depende de si la mano hábil está presente.
instrucción_de_idioma str Descripción de la tarea, por ejemplo. "recoge el huevo sin romperlo". Habilita el entrenamiento de políticas condicionado al lenguaje.
índice_de_episodio int Número de episodio dentro del conjunto de datos.
índice_de_frame int Número de frame dentro del episodio (indexado desde 0).
marca de tiempo float64 Segundos transcurridos desde el inicio del episodio.

Submuestreo táctil

El guante transmite a 200 Hz; el robot y las cámaras generalmente funcionan a 30–100 Hz. El grabador alinea los frames utilizando coincidencia de marcas de tiempo de vecino más cercano. Para preservar el flujo táctil completo de 200 Hz como un array separado:

# Store full-rate tactile as a variable-length array per frame python -m roboticscenter.scripts.record\ # 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)
Calidad

Lista de Verificación de Calidad del Episodio

Revisa cada episodio contra estos criterios antes de incluirlo en tu conjunto de datos. Un mal episodio puede introducir patrones táctiles espurios que degradan el entrenamiento de políticas.

  • El flujo táctil es continuo — sin huecos de frames. para comprobar marco.secuencia incrementos sin saltos. Las caídas de frames aparecen como valores repetidos en la columna táctil.
  • La línea base en reposo está cerca de cero (< 0.03) Al inicio del episodio (antes de cualquier contacto), el nodo de presión máxima debe leer por debajo de 0.03. Un desplazamiento por encima de 0.05 en reposo indica que el guante necesita recalibración.
  • Los eventos de contacto se alinean con los agarres visibles en el video Repetir con --superponer-táctilLos picos de presión (nodo máximo > 0.4) deben coincidir con el cierre visible del agarre en la cámara de la muñeca.
  • La región de agarre es consistente durante la fase de contacto región_de_agarre debe estabilizarse en una o dos regiones durante cada agarre (por ejemplo, "palma" + "índice"). Las regiones que cambian rápidamente indican desalineación del guante o señal ruidosa.
  • Latencia del guante < 20 ms en relación con el estado del robot Comparar el inicio del evento táctil con el pico de velocidad del agarre. Una latencia > 20 ms sugiere congestión en el hub USB — conecta el guante directamente a un puerto USB del host.
  • La instrucción en lenguaje coincide con la tarea demostrada Para conjuntos de datos condicionados por lenguaje, asegúrate de que la instrucción ingresada al inicio del episodio describa con precisión lo que el operador realmente demostró.
  • Sin interferencia de cables con el movimiento del robot El cable USB de 1.5 m no debe restringir los movimientos de la mano del operador ni quitar el guante durante el episodio. Usa un clip de gestión de cables en el antebrazo.
Entrenamiento de Políticas

Entrenamiento con Observaciones Táctiles

Las políticas que consumen entrada táctil típicamente ven una mejora del 15–30% en tareas sensibles al contacto (manejo de objetos frágiles, inserción de clavijas, plegado de telas) en comparación con líneas base solo de visión.

# ACT policy with tactile observations (SVRC fork adds tactile encoder) python -m lerobot.scripts.train \ # 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 \
Consejo: abla táctil en el tiempo de evaluación Mercado observación.presiones_táctiles = ceros(64) durante la inferencia para medir cuánto depende la política de lo táctil frente a la visión. Esto identifica si tu tarea requiere táctil o si la visión es suficiente.