Luva Tátil Juqiao

Coleta de Dados

Registre a pressão de contato junto com o estado das juntas do robô e vídeo da câmera. A luva adiciona uma modalidade tátil que captura quão difícil o que o gripper do robô está pressionando — informações invisíveis apenas à visão.

O que a luva adiciona ao seu conjunto de dados Conjuntos de dados padrão de teleoperação capturam posições articulares, velocidades e imagens de câmera. Adicionando a Luva Juqiao, registra um mapa de pressão de 64 nós, 200 Hz, mostrando a distribuição espacial da força de contato durante cada apreensão. Políticas treinadas com esses dados podem aprender a modular a força de aperto — crucial para objetos frágeis ou deformáveis.
Configuração de Hardware

Conexões do Sistema

Conecte todos os dispositivos antes de iniciar qualquer software. A luva é estritamente conectada por USB — não há modo sem fio.

Braço Robótico + Mão

Mão Orca (recomendada) ou outro efetor final. Conectado via adaptador USB Feetech ou CAN, dependendo do braço.

/dev/ttyUSB0 or CAN0

Luva Juqiao

USB-C para PC host. Aparece como serial CDC-ACM. Cabo de 1,5 m; use uma extensão USB se necessário para liberdade de movimento.

/dev/ttyACM0

Câmera de Pulso

Câmera USB ou GigE montada no pulso do robô, fornecendo uma visão centrada no objeto para treinamento.

/dev/video0 or GigE IP

Câmera Superior

Câmera de espaço de trabalho fixa para contexto da cena. Emparelhe com a câmera do pulso para conjuntos de dados de múltiplas vistas.

/dev/video2 or GigE IP

Dispositivo de Teleoperação

Braço líder (SO-101 / líder OpenArm), controlador VR ou SpaceMouse dirigindo o robô seguidor.

Líder/Titular HID
Fluxo de Trabalho de Gravação

Gravação Passo a Passo

1

Levante o braço e a mão do robô

Inicie o driver do braço (e o driver da Mão Orca, se aplicável) em terminais separados. Verifique se os joint_states estão publicando antes de prosseguir.

# 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 tópico hz /orca_hand/joint_states # Should be ~100 Hz
2

Inicie o driver da luva Juqiao

Inicie o nó ROS2 da luva. Verifique se os dados de 200 Hz estão fluindo antes de iniciar qualquer sessão de gravação.

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

Inicie as câmeras

Inicie os nós da câmera para vistas do pulso e superiores. Confirme que os tópicos de imagem estão publicando na taxa de quadros alvo (tipicamente 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 tópico hz /wrist_camera/image_raw
4

Verifique se todos os fluxos estão sincronizados

Usar ros2 tópico list para confirmar que todos os tópicos necessários estão presentes. Verifique se os timestamps estão dentro de 20 ms entre modalidades antes de gravar qualquer episódio.

lista de tópicos ros2 | grep -E "junta|tátil|imagem|agarrar" # 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

Grave um conjunto de dados com LeRobot

Use o script de gravação do LeRobot. O --tactile-topic flag adiciona o fluxo de pressão da luva como uma coluna de conjunto de dados ao lado dos estados das juntas e imagens.

# Record 50 episodes; press Enter to start each, Space to stop python -m lerobot.scripts.record\
Nenhuma bandeira --tactile-topic do LeRobot ainda? Use o wrapper multi-modal do gravador SVRC que lida com sincronização e esquema de dataset automaticamente: pip install roboticscenter[recorder]
6

Revise os episódios antes de enviar

Reproduza cada episódio com a sobreposição do mapa de calor para verificar a qualidade dos dados táteis antes de se comprometer com o 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

Envie para o HuggingFace Hub

Faça o upload do dataset validado. O cartão do dataset é gerado automaticamente com descrições de modalidade, incluindo tátil.

huggingface-cli login # first time only python -m lerobot.scripts.push_dataset\ # Verify upload python -c "
Referência

Esquema do Dataset

Cada quadro no dataset contém as seguintes colunas. Todos os arrays são armazenados como colunas Parquet float32; imagens como sequências de vídeo MP4.

ColunaForma / TipoDescrição
observação.estado float32[6] Posições das juntas do braço robótico (radianos). O índice 6 é a abertura do gripper se estiver usando um braço de 6 DOF.
observation.hand_state float32[17] Posições das juntas da mão Orca (radianos), 17 DOF. Omitir se não houver mão destra. Rotulado por nome da junta no metadados.
observação.pressões_táteis float32[64] Pressão normalizada do Luva Juqiao por nó, 0.0 (sem contato) a 1.0 (escala total). 200 Hz reduzido para corresponder à taxa de quadros do robô.
observação.pressões_táteis_raw uint16[64] Valores brutos de ADC de 16 bits. Preservar para re-normalização após recalibração. Opcional; omitir para reduzir o tamanho do conjunto de dados.
observação.região_de_aperto str Heurística da região de contato ativa: "palma", "polegar", "indicador", "médio", "anel", "mínimo", ou "" (sem contato).
observação.imagens.pulso uint8[H, W, 3] Quadro RGB da câmera do pulso a 30 fps, armazenado como sequência de vídeo MP4.
observação.imagens.sobreposição uint8[H, W, 3] Quadro RGB da câmera superior a 30 fps.
ação float32[6 ou 23] Posições das articulações alvo para o braço (6) e opcionalmente para a mão (17). A forma depende de se a mão destra é presente.
instrução_de_linguagem str Descrição da tarefa, por exemplo. "pegue o ovo sem quebrá-lo". Habilita o treinamento de política condicionado à linguagem.
índice_do_episódio int Número do episódio dentro do conjunto de dados.
índice_do_quadro int Número do quadro dentro do episódio (indexado a partir de 0).
carimbo de data/hora float64 Segundos decorridos desde o início do episódio.

Amostragem tátil

A luva transmite a 200 Hz; o robô e as câmeras normalmente operam a 30–100 Hz. O gravador alinha os quadros usando correspondência de timestamp por vizinho mais próximo. Para preservar o fluxo tátil completo de 200 Hz como um 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)
Qualidade

Lista de Verificação de Qualidade do Episódio

Revise cada episódio em relação a esses critérios antes de incluí-lo em seu conjunto de dados. Um episódio ruim pode introduzir padrões táteis espúrios que degradam o treinamento da política.

  • O fluxo tátil é contínuo — sem lacunas de quadro. Verificar quadro.sequência incrementos sem pulos. Quedas de quadro aparecem como valores repetidos na coluna tátil.
  • A linha de base em repouso está próxima de zero (< 0,03) No início do episódio (antes de qualquer contato), o nó de pressão máxima deve ler abaixo de 0,03. Um desvio acima de 0,05 em repouso indica que a luva precisa de recalibração.
  • Eventos de contato se alinham com garras visíveis no vídeo Repetir com --sobreposição-tátilPicos de pressão (nó máximo > 0,4) devem coincidir com o fechamento visível do gripper na câmera do pulso.
  • A região de garra é consistente durante a fase de contato região_garra deve estabilizar em uma ou duas regiões durante cada garra (por exemplo, "palma" + "indicador"). Regiões que mudam rapidamente indicam desalinhamento da luva ou sinal ruidoso.
  • Latência da luva < 20 ms em relação ao estado do robô Compare o início do evento tátil com o pico de velocidade do gripper. Latência > 20 ms sugere congestionamento do hub USB — conecte a luva diretamente a uma porta USB do host.
  • A instrução de linguagem corresponde à tarefa demonstrada Para conjuntos de dados condicionados por linguagem, certifique-se de que a instrução inserida no início do episódio descreve com precisão o que o operador realmente demonstrou.
  • Sem interferência de cabos com o movimento do robô O cabo USB de 1,5 m não deve restringir os movimentos das mãos do operador ou puxar a luva durante o episódio. Use um clipe de gerenciamento de cabos no antebraço.
Treinamento de Políticas

Treinamento com Observações Táteis

Políticas que consomem entrada tátil geralmente apresentam uma melhoria de 15–30% em tarefas sensíveis ao contato (manipulação de objetos frágeis, inserção de pinos, dobragem de tecidos) em comparação com linhas de base apenas visuais.

# 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 \
Dica: ablate tátil no tempo de avaliação Passar observation.tactile_pressures = zeros(64) durante a inferência para medir quanto a política depende do tátil em comparação com a visão. Isso identifica se sua tarefa requer tátil ou se a visão é suficiente.