Especificações de Teleoperação VR Meta Quest 3

Referência técnica completa: esquema do pacote UDP, tipos de campo e layout de bytes, detalhamento da latência de ponta a ponta, principais parâmetros ajustáveis e especificações de braço compatíveis.

Visão Geral do Sistema

Hardware e Tempo de Execução
Headset Meta Quest 3 (modo de rastreamento de mãos necessário)
Versão do Unity 2022.3 LTS ou posterior · pacote XR Hands · plugin OpenXR
Tempo de execução do host Python 3.10+ (Linux ou macOS; sem ROS necessário)
Requisito de rede Mesmo sub-rede LAN; ponto de acesso Wi-Fi 6 recomendado
Porta UDP da mão direita 8888
Porta UDP da mão esquerda 8889 (controle bilateral apenas; caso contrário, não utilizado)
Taxa de pacotes (emissor) ~50 Hz do Unity (loop de atualização fixa do Unity)
Taxa de comando do robô 30 Hz padrão (configurável via CONTROL_HZ)
SDK primário (Piper) piper_sdk · python-can · Adaptador CAN sobre USB

Esquema de Pacote UDP

Cada pacote é uma mensagem binária de comprimento fixo de 45 bytes. Todos os campos de múltiplos bytes usam little-endian ordem de bytes. Bytes desconhecidos adicionados no final são ignorados pelo receptor para compatibilidade futura.

Layout do Pacote Binário — 45 bytes no total
Campo Tipo Bytes Descrição
cabeçalho uint8[4] 4 bytes mágicos 0x52 0x43 0x54 0x50 — ASCII "RCTP". Pacotes com um valor mágico incorreto são descartados silenciosamente.
carimbo de data/hora float64 8 Unity Time.realtimeSinceStartup em segundos. Usado para medição de jitter; não interpretado pelo controlador do robô.
pos_x float32 4 Posição X do efetor final em metros, quadro do mundo VR (mão direita, Y para cima). Convertido para mm no quadro do robô por transform_position().
pos_y float32 4 Posição Y do efetor final em metros, quadro do mundo VR.
pos_z float32 4 Posição Z do efetor final em metros, quadro do mundo VR.
rot_x, rot_y, rot_z, rot_w float32 × 4 16 Rotação do efetor final como um quaternion unitário no quadro do mundo VR. Convertido para Euler (rolagem/inclinação/giro) por quat_to_euler() antes de passar para o SDK do robô.
garra float32 4 Abertura da garra: 0.0 = totalmente fechada, 1.0 = totalmente aberta. Derivada da força de pinça via VRGripperController.cs.
flags uint8 1 Bit 0: rastreamento válido (1 = mão detectada). Bit 1: parada de emergência solicitada (1 = operador pressionou Menu). Bits restantes reservados.

Resumo do deslocamento de byte: cabeçalho 0–3, timestamp 4–11, pos_x 12–15, pos_y 16–19, pos_z 20–23, rot_x 24–27, rot_y 28–31, rot_z 32–35, rot_w 36–39, garra 40–43, flags 44.

Python struct string de formato para desempacotar:

matéria struct

PACKET_MAGIC = b'\x52\x43\x54\x50'  # "RCTP"
PACKET_FMT   = '<4sdfffffffff f B'
#              ^  ^ ^^^^^^^^^^ ^ ^
#              |  | pos xyz    | flags (uint8)
#              |  timestamp   gripper (float32)
#              header (4 bytes)   rot xyzw (float32×4)

def analisar_pacote(data: bytes) -> dict | None:
    com len(data) < struct.calcsize(PACKET_FMT):
        retornar None
    fields = struct.unpack_from(PACKET_FMT, data)
    header, ts, px, py, pz, rx, ry, rz, rw, gripper, flags = fields
    com header != PACKET_MAGIC:
        retornar None
    retornar {
        "timestamp": ts,
        "posição": (px, py, pz),
        "rotação": (rx, ry, rz, rw),
        "garra":  gripper,
        "válido":    bool(flags & 0x01),
        "estop":    bool(flags & 0x02),
    }

Latência de Ponta a Ponta

Medido em uma LAN Wi-Fi 6 com o braço AgileX Piper a 30 Hz de taxa de controle e limite de velocidade de 25%. Os valores são típicos; a latência real depende das condições do Wi-Fi e da taxa de servo do robô.

~20 ms
Pipeline de Rastreamento Quest 3
Fusão de sensor de pose da mão para callback do Unity
<5 ms
Trânsito UDP
LAN Wi-Fi 6; até ~15 ms em Wi-Fi mais antigo
<2 ms
Python Analisar & Fila
Desempacotar struct + inserir na fila
30–80 ms
Execução de Trajetória do Robô
Depende do limite de velocidade e da distância de movimento
Total Típico de Ponta a Ponta
LAN Wi-Fi 6, 25% de velocidade 50–120 ms
LAN Wi-Fi 5, 25% de velocidade 80–150 ms
Resposta de e-stop de software (Caminho do Bit 1) 1 ciclo de controle (~33 ms a 30 Hz)
Detecção de perda de rastreamento Imediato (byte de flags no pacote atual)
Mantenha os limites de velocidade conservadores para reduzir a sensação de latência. O componente de latência perceptual dominante é a execução da trajetória do robô. Um menor SPEED_PERCENT faz o sistema parecer mais previsível, mesmo que o tempo de ida e volta real seja semelhante. Comece em 25% e aumente apenas após a validação total do movimento.

Parâmetros Chave Ajustáveis

Inspetor do Unity (VRHandPoseSender)
positionOffset (m) (0, 0, 0.3) — Ponto de partida do Piper
rotationOffset (deg) (0, 90, 0) — Ponto de partida do Piper
fatorDeEscala 0.75 — escala o movimento da mão para o espaço de trabalho do Piper
Limite do espaço de trabalho X (mm) ±400 (Piper); ±600 (xArm6)
Limite do espaço de trabalho Z (mm) 50 – 700 (Piper); 0 – 900 (xArm6)
Gateway de destino UDP 8888 (mão direita) / 8889 (mão esquerda)
Servidor Python (teleoperação_main.py)
CONTROL_HZ 30 Hz — taxa de comando do robô; igualar à taxa do servo
QUEUE_MAXSIZE 3 — quadros armazenados entre as threads do receptor e do controlador
piper_controller.py (AgileX Piper)
SPEED_PERCENT 25% — fração máxima da velocidade da junta; aumentar gradualmente
X_MIN / X_MAX (mm) −400 / +400
Y_MIN / Y_MAX (mm) −400 / +400
Z_MIN / Z_MAX (mm) 50 / 700
GRIPPER_MAX_UM (µm) 70 000 — abertura física de 70 mm
Unidades de posição SDK Micrômetros (inteiro) — multiplique os valores em mm por 1 000
Unidades de orientação SDK Milidegrees (inteiro) — multiplique os valores em graus por 1 000
Interface PODE can0 (padrão) — ative com can_activate.sh antes de executar

Braços Compatíveis no SVRC

Braço DOF SDK / Interface Arquivo do Controlador Status
AgileX Piper 6 piper_sdk · CAN sobre USB piper_controller.py Pronto para produção
OpenArm 7 SocketCAN / ROS 2 MoveIt2 openarm_controller.py Beta
Kit Bimanual DK1 Dual 6 Portas 8888 + 8889 simultaneamente dk1_controller.py Beta
VLAI L1 Dual 6 Ponte ROS 2 · TCP/IP vlai_l1_controller.py Em desenvolvimento

Requisitos de software

Quest 3 / Lado Unity
Unity 2022.3 LTS ou posterior
Pacote XR Mãos com.unity.xr.hands ≥ 1.3
Plug-in OpenXR com.unity.xr.openxr ≥ 1.9
Meta XR SDK Opcional, mas recomendado para passthrough
Modo de rastreamento de mãos Habilitado nas configurações do sistema Quest (Rastreamento de Movimento)
Controle PC / Lado Python
Python 3.10 ou posterior (usa sintaxe de tipo union)
piper_sdk pip install piper_sdk
python-can pip install python-can
Interface PODE Adaptador USB para CAN; ativado com can_activate.sh can0 1000000
Apenas biblioteca padrão socket, struct, queue, threading, signal, time

Pronto para Teleop?

Volte ao guia de configuração para fazer o streaming do seu Quest 3 para um braço robótico, ou leia a wiki completa para a referência completa do desenvolvedor.