Guia de Configuração da Luva Tátil Juqiao

Caminho completo do desembalagem aos dados de pressão ao vivo e integração da plataforma. Planeje menos de 30 minutos no total.

1

Use a Luva e Conecte o Módulo de Aquisição

A luva Juqiao é enviada como uma luva de tecido trançado com um conector de cabo de fita no pulso. O módulo de aquisição é uma pequena caixa de PCB separada que lida com a conversão analógica-digital e comunicação USB.

  • Use a luva como você faria com uma luva padrão, com o conector FPC posicionado no pulso.
  • Encaixe o cabo de fita: Alinhe o cabo de fita FPC do conector do pulso da luva e pressione-o firmemente no receptáculo de fita do módulo de aquisição. Um leve clique indica que está bem encaixado. Se os nós mostrarem leituras zero, o cabo não está totalmente encaixado — veja a Solução de Problemas abaixo.
  • Monte o módulo: Prenda o módulo de aquisição a uma faixa de pulso ou suporte de antebraço com um clipe ou velcro para que não interfira no movimento do pulso durante a teleoperação.
  • Conectar USB: Conecte o módulo de aquisição ao seu PC host usando o cabo USB fornecido.
Nenhum driver é necessário no Linux e no macOS. O módulo de aquisição é apresentado como um dispositivo serial USB CDC ACM. No Linux, ele é enumerado como /dev/ttyUSB0 ou /dev/ttyACM0; não é como o macOS /dev/tty.usbserial-*. No Windows, instale o driver CP210x ou CH340 incluído se o dispositivo não for enumerado automaticamente como uma porta COM.
2

Instale o SDK Python (pyserial)

Nenhum SDK proprietário do fornecedor é necessário. O módulo de aquisição transmite pacotes binários emoldurados por meio de uma porta serial padrão — pyserial é a única dependência.

Instale o pyserial:

pip install pyserial

Verifique se a porta serial está visível:

# Linux
ls /dev/ttyUSB* /dev/ttyACM*

# macOS
ls /dev/tty.usbserial-*

# Or use pyserial's port listing tool
python -m serial.tools.list_ports

Confirme a transmissão ao vivo (verificação de sanidade):

# Replace /dev/ttyUSB0 with your port; 921600 is the default baud rate
python -m serial.tools.miniterm /dev/ttyUSB0 921600

Você deve ver um fluxo de dados binários na taxa de amostragem configurada do módulo de aquisição. Se o terminal estiver silencioso, verifique a conexão USB e o LED do módulo — ele deve piscar na taxa de amostragem.

Problema de permissão no Linux? Se você receber um erro de permissão negada no Linux, adicione seu usuário ao dialout grupo e saia e entre novamente: sudo usermod -aG dialout $USER
3

Execute o Leitor de Quadros Python

O módulo de aquisição envia quadros binários de comprimento fixo. Cada quadro começa com um delimitador de início de 2 bytes 0xAA 0x55, seguido por uma contagem de canais de 1 byte N, N × 2 bytes de valores de pressão de 16 bits em big-endian e um checksum CRC16 de 2 bytes. Comprimento total do quadro = 5 + 2N bytes.

Leitor de quadros básico — imprime uma lista de valores de pressão por quadro:

import serial, struct, time

BAUD = 921600
PORT = "/dev/ttyUSB0"   # /dev/tty.usbserial-* on macOS, COMx on Windows
HEADER = b"\xaa\x55"

def read_frame(ser: serial.Serial, n_channels: int) -> list[int] | None:
    # Sync to frame header
    buf = ser.read(2)
    if buf != HEADER:
        ser.read_until(HEADER[-1:])
        return None
    raw = ser.read(1 + n_channels * 2 + 2)
    n = raw[0]
    if n != n_channels:
        return None
    pressures = list(struct.unpack_from(f">{n}H", raw, 1))
    # CRC check omitted for brevity — validate in production
    return pressures

with serial.Serial(PORT, BAUD, timeout=0.1) as ser:
    N = 64   # number of sensing nodes — confirm from spec doc
    while True:
        frame = read_frame(ser, N)
        if frame:
            print(frame)   # list of N 16-bit pressure values

Aperte diferentes partes da luva e verifique se os valores dos nós sobem e descem. Todos os 64 nós devem responder. Se uma região não mostrar resposta, verifique novamente a conexão do cabo flat tanto no conector da luva quanto no módulo.

Sem hardware? Use o modo simulado. Para desenvolvimento de software sem o sensor físico, simule o fluxo serial usando um dispositivo de loopback ou um script simulado que emita quadros em formato válido. A ponte da plataforma aceita o mesmo formato JSONL, independentemente da fonte.
4

Calibração de Ponto Zero

Sensores de tecido estão sujeitos a desvio de linha de base devido à variação de temperatura e compressão repetida. Calibre no início de cada sessão para leituras precisas.

  • Relaxe a luva em uma superfície plana sem pressão aplicada — não a use durante a calibração, a menos que consiga manter sua mão completamente parada e relaxada.
  • Windows: Abra a ferramenta de configuração Juqiao, selecione sua porta COM, clique Conecte, em seguida, navegue até Calibrar → Zero. Todas as linhas de base dos nós são definidas para os valores de repouso atuais.
  • Linux / macOS: Envie o comando de zero do software conforme o documento do protocolo V2.3, ou aplique uma subtração de linha de base em seu script de ponte Python (capture 50 quadros em repouso e subtraia a média por canal).
# Simple software baseline subtraction (Linux/macOS alternative)
import serial, struct, numpy as np

BAUD, PORT, N = 921600, "/dev/ttyUSB0", 64
HEADER = b"\xaa\x55"

def read_frame(ser):
    ser.read_until(HEADER)
    raw = ser.read(1 + N * 2 + 2)
    return list(struct.unpack_from(f">{N}H", raw, 1))

with serial.Serial(PORT, BAUD, timeout=0.1) as ser:
    ser.reset_input_buffer()
    baseline = np.mean([read_frame(ser) for _ in range(50)], axis=0)
    print("Baseline captured. Starting calibrated stream...")
    while True:
        frame = read_frame(ser)
        if frame:
            calibrated = np.maximum(0, np.array(frame) - baseline)
            print(calibrated.astype(int).tolist())
Recalibre se a luva aquecer. Permita 1–2 minutos de aquecimento na temperatura operacional antes de calibrar. Para sessões de gravação longas (> 30 min), execute uma nova calibração entre os episódios.
5

Integração de Plataforma — Plataforma Fearless

A Plataforma Fearless em platform.roboticscenter.ai suporta o sensor Juqiao como um nó tátil em uma sessão de teleoperação. Quadros de pressão são registrados de forma síncrona junto com os estados das juntas do robô, fluxos de câmera e outras modalidades de sensor.

Sequência de registro:

  • Inicie uma sessão de teleoperação via POST /api/teleop/sessions/create-sdk com device_type: "juqiao_textile_skin".
  • Abra o WebSocket da plataforma em /api/teleop/ws e envie o handshake de registro: role: "operator", device_type: "tactile_sensor", capabilities: ["tactile", "pressure_array", "telemetry"].
  • Ao receber type: "ready", comece a encaminhar quadros de telemetria JSONL do leitor serial.

Emissor JSONL para a ponte da plataforma:

import serial, struct, time, json, sys

PORT = "/dev/ttyUSB0"
BAUD = 921600
N_CHANNELS = 64
HEADER = b"\xaa\x55"

def read_frame(ser):
    buf = ser.read_until(HEADER)
    if not buf.endswith(HEADER):
        return None
    raw = ser.read(1 + N_CHANNELS * 2 + 2)
    pressures = list(struct.unpack_from(f">{N_CHANNELS}H", raw, 1))
    return pressures

with serial.Serial(PORT, BAUD, timeout=0.05) as ser:
    while True:
        frame = read_frame(ser)
        if frame:
            record = {
                "ts": int(time.time() * 1000),
                "device": "juqiao_textile_skin",
                "variant": "high_frequency_v2.3",
                "pressures": frame,   # flat list, N_CHANNELS values
                "n_channels": N_CHANNELS
            }
            print(json.dumps(record), flush=True)  # JSONL for platform bridge

Formato do quadro de telemetria enviado para o WebSocket da plataforma:

{
  "type": "telemetry",
  "member_id": "juqiao-glove-right",
  "device": "juqiao_textile_skin",
  "variant": "high_frequency_v2.3",
  "pressures": [0, 512, 1024, ...],   // flat array, N_CHANNELS 16-bit values
  "n_channels": 64,
  "ts": 1743680400123                  // Unix millisecond timestamp
}

Emparelhamento com OpenArm ou DK1: Em uma configuração típica de teleoperação, três processos separados são executados no PC host e cada um se registra com o mesmo ID de sessão — a ponte de controle do braço robótico, a ponte serial Juqiao e as pontes de câmera para vistas do pulso e da cena. A plataforma alinha temporalmente todos os fluxos usando o ts campo e arquiva um único arquivo JSONL de episódio por demonstração. Durante a reprodução, o painel GloveWorkbench renderiza o mapa de calor de pressão tátil ao lado da trajetória das juntas do braço.

Configuração bimanual. Para teleoperação bimanual, registre dois nós de luva usando distintos member_id valores — juqiao-glove-right e juqiao-glove-left. Cada luva tem seu próprio módulo de aquisição e conexão USB. Agrupe ambas as luvas em um único objeto JSON por tick para reduzir pela metade a contagem de mensagens da plataforma a 200 Hz.

Para uma referência completa da API cobrindo criação de sessão, handshake WebSocket e download de episódio, veja o Referência da API do SDK da Plataforma.

!

Solução de Problemas

  • Nenhum dispositivo serial no Linux: Executar sudo usermod -aG dialout $USER e sair/entrar. Verifique com lsusb que o módulo enumera. Em kernels mais antigos, modprobe cdc_acm pode ser necessário.
  • Todas as leituras de pressão são zero: Desconecte o USB, reposicione o cabo FPC em ambas as extremidades (conector da luva e módulo), e depois reconecte. Verifique o LED do módulo — ele deve piscar na taxa de amostragem configurada.
  • Grande desvio de linha de base em nós não carregados: Execute a calibração do ponto zero em temperatura ambiente antes da sessão. Deixe a luva estabilizar por 1–2 minutos após colocá-la.
  • Erros de sincronização de quadro / dados embaralhados: Confirme que a taxa de transmissão é 921600. Limpe o buffer serial ao abrir: ser.reset_input_buffer(). Use read_until(HEADER) na inicialização para resincronizar em vez de leituras de comprimento fixo.
  • Os nós do sensor respondem lentamente ou parecem "pegajosos": Dobre suavemente a luva em toda a sua amplitude de movimento várias vezes antes de uma sessão. Problemas persistentes podem indicar fadiga das fibras — entre em contato com a Juqiao Precision para substituição.
  • A ponte da plataforma perde quadros a 200 Hz: Reduza a taxa de amostragem para 100 Hz para sessões com uma única luva. Para configurações bimanual, agrupe ambas as luvas em um único objeto JSON por tick para reduzir pela metade a contagem de mensagens.
Ainda preso? Contato Suporte do SVRC e inclua sua versão do SO e Python, a saída de lsusb -v (Linux) ou Gerenciador de Dispositivos (Windows), a versão da especificação (V2.3 ou V1.0 bilíngue) e uma breve descrição do sintoma.

Configuração Completa?

Verifique as especificações completas ou abra a plataforma para começar a gravar episódios.