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.
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.
/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.
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.
dialout grupo e saia e entre novamente: sudo usermod -aG dialout $USER
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.
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())
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-sdkcomdevice_type: "juqiao_textile_skin". - Abra o WebSocket da plataforma em
/api/teleop/wse 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.
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 $USERe sair/entrar. Verifique comlsusbque o módulo enumera. Em kernels mais antigos,modprobe cdc_acmpode 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(). Useread_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.
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.