Luva Tátil Juqiao

Configuração de Software e Driver

Instale o driver USB CDC, transmita dados de pressão de 64 nós em Python, visualize mapas de calor de contato e integre com os pipelines de gravação Orca Hand.

Passo 1 — Instalação

Instale o Pacote juqiao-glove

A luva se comunica via USB CDC serial — sem módulos de kernel, sem drivers personalizados. O pacote Python envolve pyserial e lida com o protocolo de quadro binário.

Qualquer sistema operacional suportado A luva aparece como um dispositivo serial padrão CDC-ACM. Windows, macOS e Linux a enumeram automaticamente com drivers inbox. Nenhum instalador de driver do fornecedor é necessário.
# Python 3.10+ recommended pip install juqiao-glove # Or with optional visualization extras (matplotlib, numpy) pip install "juqiao-glove[viz]" # Or with ROS2 bridge extras (requires ROS2 Humble or later) pip install "juqiao-glove[ros2]"

Verifique a instalação:

python -c "import juqiao_glove; print(juqiao_glove.__version__)" # Expected: 0.4.x or later
Passo 2 — Detecção de Porta

Detectando a Porta USB

Conecte a luva via cabo USB-C de 1,5 m. O dispositivo é enumerado como uma porta serial CDC-ACM.

OSNome da porta típicaNotas
Linux/dev/ttyACM0Adicione o usuário a dialout grupo se a permissão for negada
macOS/dev/tty.usbmodem*Usar ls /dev/tty.usb* para encontrar o nome exato
WindowsCOM3 (variável)Verifique o Gerenciador de Dispositivos → Portas (COM e LPT)

Detectar automaticamente a luva a partir do Python:

de juqiao_glove importar JuqiaoGlove # Auto-scan all serial ports and return the first Juqiao device found luva = JuqiaoGlove.find() # → '/dev/ttyACM0' or 'COM3' etc. print(luva.info()) # → firmware version, node count, sample rate

Ou especifique a porta explicitamente:

luva = JuqiaoGlove(port="/dev/ttyACM0", taxa de transmissão=3000000)
Erro de permissão no Linux? Executar sudo usermod -aG dialout $USER então saia e entre novamente. Alternativamente, use sudo chmod 666 /dev/ttyACM0 para uma solução alternativa de uma sessão.
Passo 3 — API de Streaming

API de streaming Python

A luva transmite a 200 Hz. Cada quadro contém um array de pressão de 64 elementos (ADC de 16 bits, normalizado de 0.0 a 1.0) mais um timestamp.

de juqiao_glove importar JuqiaoGlove # Single-frame read quadro = luva.read_frame() # float, seconds since epoch imprimir(quadro.pressões) # np.ndarray shape (64,), float32, range 0.0-1.0 imprimir(quadro.pressões.reshape(8, 8)) # 8×8 spatial grid # Continuous callback stream def on_frame(quadro): # stream for 5 seconds # Or use as an iterator com luva.stream() como quadros:

Referência do Objeto Quadro

AtributoTipoDescrição
frame.timestampflutuanteTempo de recebimento do lado do host (segundos, época Unix)
frame.pressuresnp.ndarray (64,)Pressão normalizada por nó, 0.0 (nenhum) a 1.0 (máx)
frame.pressures_rawnp.ndarray (64,)Contagens brutas de ADC de 16 bits (0–65535)
frame.contact_masknp.ndarray (64,) boolVerdadeiro onde a pressão excede o limite (padrão 0.05)
frame.contact_nodesLista[você]Índices dos nós atualmente em contato
frame.grasp_regionstr ou NenhumRegião heurística: "palma", "polegar", "indicador", "médio", "anel", "mínimo", Nenhum
quadro.sequênciaintContador de quadros (reinicia em 65535); use para detectar quadros perdidos
Referência — Layout do Sensor

Layout do Sensor de 64 Nós

Os 64 taxéis estão dispostos como uma matriz de fibra tecida cobrindo a palma e todos os cinco segmentos dos dedos. Os índices dos nós seguem uma ordem consistente de linha principal vista dorsal.

0–12
Palma (almofada central)
13–23
Polegar (3 segmentos)
24–34
Dedo indicador
35–45
Dedo médio
46–54
Dedo anelar
55–63
Dedo mínimo
# Access region slices by name de juqiao_glove.layout importar REGION_SLICES # Reshape to 8×8 spatial grid (dorsal view, row-major) grid = frame.pressures.reshape(8, 8)
Opcional — Visualização

Visualização do Mapa de Calor de Pressão

A [viz] extra instala um renderizador de mapa de calor matplotlib ao vivo útil para calibração e depuração.

# Requires: pip install "juqiao-glove[viz]" de juqiao_glove import JuqiaoGlove # Opens a matplotlib window; press Q to quit

Para ambientes sem interface gráfica ou revisão de dados, salve os quadros como um vídeo:

de juqiao_glove.viz importar record_heatmap_video # shape (N, 64) saved during recording saída_mp4="heatmap.mp4",
Opcional — ROS2

Interface ROS2

A juqiao_glove_ros2 pacote publica um customizado TactileArray mensagem a 200 Hz. Compatível com ROS2 Humble e Iron.

# Install the package (requires ROS2 to be sourced) pip install "juqiao-glove[ros2]" # Or build from source in your workspace cd ~/ros2_ws/src

Inicie o nó do driver:

fonte /opt/ros/humble/setup.bash # Auto-detect port ros2 launch juqiao_glove_ros2 glove.launch.py # Specify port explicitly ros2 launch juqiao_glove_ros2 glove.launch.py port:=/dev/ttyACM0

Tópicos publicados:

TópicoTipo de mensagemTáxonsDescrição
/juqiao_glove/tactile_arrayjuqiao_glove_ros2/TactileArray200 HzMatriz de pressão completa de 64 nós
/juqiao_glove/contact_maskstd_msgs/UInt8MultiArray200 HzContato binário por nó (0 ou 1)
/juqiao_glove/grasp_regionstd_msgs/String200 HzHeurística de região ativa ou string vazia
/juqiao_glove/statusdiagnostic_msgs/DiagnosticStatus1 HzVersão do firmware, taxa de queda de quadros

Lançamento combinado da Mão Orca + Luva

Ao usar a luva junto com a Mão Orca para gravação sincronizada:

# Launch Orca Hand driver ros2 launch orca_ros2 orca_hand.launch.py port:=/dev/ttyUSB0 # In a second terminal, launch Juqiao Glove driver ros2 launch juqiao_glove_ros2 glove.launch.py port:=/dev/ttyACM0 # Verify synchronized topics lista de tópicos ros2 | grep -E "orca|juqiao"
Passo 4 — Calibração

Calibração de Base

A luva é enviada com calibração de fábrica. Recalibre se notar desvio de base (nós lendo não zero em repouso) ou após armazenamento prolongado.

Remova a luva antes de calibrar A calibração captura a linha de base de pressão zero. Não use ou toque a luva durante a sequência de calibração — coloque-a plana em uma superfície.
# CLI calibration — lay glove flat, do not touch python -m juqiao_glove.calibrate --port /dev/ttyACM0 # Or from Python de juqiao_glove import JuqiaoGlove # averages 3 seconds of idle frames glove.save_calibration("~/.juqiao_glove_cal.json")

Carregar calibração em tempo de execução:

luva = JuqiaoGlove.find() # Now frame.pressures reflects calibrated values quadro = luva.read_frame() # Should be ~0.0 at rest

Ajuste de Limite

O limite de contato padrão é 0.05 (5% da escala total). Ajuste por tarefa:

# For delicate objects (lower threshold detects light touch) glove.set_contact_threshold(0.02) # For heavy manipulation tasks (reduce false positives) glove.set_contact_threshold(0.10) # Per-region thresholds glove.set_contact_threshold({"palma": 0.08, "polegar": 0.03, "indicador": 0.03})
Solução de Problemas

Problemas Comuns

SerialException: [Errno 13] Permissão negada: '/dev/ttyACM0'
Executar sudo usermod -aG dialout $USER então faça logout e login novamente. Alternativamente: sudo chmod 666 /dev/ttyACM0 (reinicializa ao desconectar).
JuqiaoGlove.find() retornou None — nenhum dispositivo encontrado
Verifique a conexão USB. Execute dmesg | tail -20 (Linux) ou ls /dev/tty.usb* (macOS) para verificar se o sistema operacional enumerou o dispositivo. Tente uma porta USB ou cabo diferente (o conector é USB-C, mas deve ser um cabo de dados, não apenas de carga).
Todos os 64 nós leram 0.0 — sem dados de pressão
Chamar glove.info() para confirmar se o firmware responde. Se sim, verifique se o arquivo de calibração não está subtraindo demais. Exclua ~/.juqiao_glove_cal.json e recalibre com a luva deitada plana.
Deriva de base — nós leem 0.1–0.2 em repouso
Recalibre: coloque a luva plana sem pressão e execute glove.calibrate_baseline(). Pode ocorrer após mudanças de temperatura ou armazenamento prolongado. Se a deriva > 0.4 com a luva plana, o tecido sensível pode precisar de substituição (entre em contato com o suporte da Juqiao).
Quedas de quadro — números de sequência pulam
Verifique a qualidade do cabo USB e da porta. Use uma porta USB 3.0. No Linux, evite hubs USB com outros dispositivos de alta largura de banda. Certifique-se de que seu on_frame callback retorne rapidamente — faça processamento pesado em uma thread separada.
O nó ROS2 inicia, mas sem mensagens em /juqiao_glove/tactile_array
Verifique o argumento da porta: ros2 launch juqiao_glove_ros2 glove.launch.py port:=/dev/ttyACM0. Verifique os logs do nó: ros2 node info /juqiao_glove_driver. Certifique-se de que o dialout conserto do grupo foi aplicado ao usuário que está executando o nó ROS2.