Технические характеристики Meta Quest 3 VR Teleop

Полный технический справочник: схема пакета UDP, типы полей и расположение байтов, сквозная задержка, ключевые настраиваемые параметры и совместимые характеристики рычага.

Обзор системы

Аппаратное обеспечение и время выполнения
Гарнитура Meta Quest 3 (требуется режим отслеживания рук)
Версия Unity 2022.3 LTS или более поздняя версия · Пакет XR Hands · Плагин OpenXR
Среда выполнения хоста Python 3.10+ (Linux или macOS; ROS не требуется)
Требования к сети Та же подсеть локальной сети; Рекомендуется точка доступа Wi-Fi 6.
Правый UDP-порт 8888
Левый порт UDP 8889 (только двусторонний контроль; в противном случае не используется)
Скорость передачи пакетов (отправитель) ~50 Гц от Unity (фиксированный цикл обновления Unity)
Скорость команд робота 30 Гц по умолчанию (настраивается через CONTROL_HZ)
Основной SDK (Piper) piper_sdk · python-can · Адаптер CAN через USB

Схема UDP-пакетов

Каждый пакет представляет собой двоичное сообщение фиксированной длины длиной 45 байт. Все многобайтовые поля используют прямой порядок байтов порядок байтов. Неизвестные байты, добавленные в конце, игнорируются получателем в целях прямой совместимости.

Двоичная структура пакета — всего 45 байт
Поле Тип Байты Описание
заголовок uint8[4] 4 Магические байты 0x52 0x43 0x54 0x50 — ASCII «RCTP». Пакеты с неправильным магическим значением автоматически отбрасываются.
временная метка float64 8 Единство Time.realtimeSinceStartup в секундах. Используется для измерения джиттера; не интерпретируется контроллером робота.
pos_x поплавок32 4 Положение конечного исполнительного органа X в метрах, рамка мира VR (правша, Y-вверх). Робот переоборудован в миллиметровую раму transform_position().
pos_y поплавок32 4 Положение концевого эффектора Y в метрах, рамка мира VR.
pos_z поплавок32 4 Положение концевого исполнительного органа Z в метрах, мировая рамка VR.
rot_x, rot_y, rot_z, rot_w плавающее32 × 4 16 Вращение конечного эффектора как единичный кватернион в системе координат VR. Преобразовано в Эйлер (крен/тангаж/рыскание) с помощью quat_to_euler() перед переходом к SDK работа.
захват поплавок32 4 Открытость захвата: 0.0 = полностью закрыто, 1.0 = полностью открыт. Получено из силы сжатия с помощью VRGripperController.cs.
флаги uint8 1 Бит 0: отслеживание действительно (1 = рука обнаружена). Бит 1: запрошен аварийный останов (1 = оператор нажал меню). Остальные биты зарезервированы.

Сводка смещений байтов: заголовок 0–3, метка времени 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, захват 40–43, флаги 44.

Питон struct строка формата для распаковки:

импортировать struct

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

защита parse_packet(data: bytes) -> dict | None:
    если len(data) < struct.calcsize(PACKET_FMT):
        возвращаться None
    fields = struct.unpack_from(PACKET_FMT, data)
    header, ts, px, py, pz, rx, ry, rz, rw, gripper, flags = fields
    если header != PACKET_MAGIC:
        возвращаться None
    возвращаться {
        "метка времени": ts,
        "позиция": (px, py, pz),
        "вращение": (rx, ry, rz, rw),
        "захват":  gripper,
        "действительный":    bool(flags & 0x01),
        "останавливаться":    bool(flags & 0x02),
    }

Сквозная задержка

Измерено в локальной сети Wi-Fi 6 с использованием манипулятора AgileX Piper при частоте управления 30 Гц и ограничении скорости 25 %. Значения типичны; фактическая задержка зависит от условий Wi-Fi и скорости сервопривода робота.

~20 мс
Квест 3 Отслеживание конвейера
Объединение датчика положения руки с обратным вызовом Unity
<5 мс
UDP-транзит
Wi-Fi 6 локальных сетей; до ~15 мс на старом Wi-Fi
<2 мс
Разбор и очередь Python
Распаковка структуры + вставка в очередь
30–80 мс
Выполнение траектории робота
Зависит от ограничения скорости и расстояния перемещения
Типичный общий сквозной
Wi-Fi 6 LAN, скорость 25% 50–120 мс
Wi-Fi 5 LAN, скорость 25% 80–150 мс
Реакция программного аварийного останова (путь бита 1) 1 цикл управления (~33 мс при 30 Гц)
Обнаружение потери отслеживания Немедленно (помечает байт в текущем пакете)
Сохраняйте ограничения скорости консервативными, чтобы уменьшить ощущение задержки. Доминирующим компонентом задержки восприятия является выполнение траектории робота. Нижний SPEED_PERCENT делает систему более предсказуемой, хотя фактическое время прохождения туда и обратно одинаково. Начните с 25% и повышайте только после того, как движение будет полностью подтверждено.

Ключевые настраиваемые параметры

Инспектор Unity (VRHandPoseSender)
позицияСмещение (м) (0, 0, 0,3) — Начальная точка Пайпера
смещение вращения (градусы) (0, 90, 0) — Начальная точка Пайпера
масштабный фактор 0,75 — масштабирует движение руки в рабочее пространство Piper.
Зажим X рабочего пространства (мм) ±400 (Пайпер); ±600 (xArm6)
Зажим Z рабочего пространства (мм) 50 – 700 (Пайпер); 0–900 (xArm6)
целевой порт UDP 8888 (правая рука) / 8889 (левая рука)
Серверный Python (teleoperation_main.py)
CONTROL_HZ 30 Гц — частота команд робота; соответствие скорости сервопривода
QUEUE_MAXSIZE 3 — кадры буферизуются между потоками получателя и контроллера
piper_controller.py (AgileX Piper)
SPEED_PERCENT 25% — максимальная доля скорости сустава; поднимать постепенно
X_MIN / X_MAX (мм) −400 / +400
Г_МИН/Г_МАКС (мм) −400 / +400
Z_MIN / Z_MAX (мм) 50 / 700
GRIPPER_MAX_UM (мкм) 70 000 — физическое отверстие 70 мм
SDK позиционные единицы Микрометры (целое число) — умножьте значения в миллиметрах на 1 000.
Единицы ориентации SDK Миллиградусы (целое число) — умножьте значения градусов на 1 000.
CAN-интерфейс can0 (по умолчанию) — активировать с помощью can_activate.sh перед запуском

Совместимое оружие в SVRC

Рука DOF SDK/Интерфейс Файл контроллера Статус
AgileX Пайпер 6 piper_sdk · CAN через USB piper_controller.py Готов к производству
OpenArm 7 РазъемCAN/ROS 2 MoveIt2 openarm_controller.py Бета
Бимануальный комплект DK1 Двойной 6 Порты 8888+8889 одновременно dk1_controller.py Бета
ВЛАИ Л1 Двойной 6 Мост ROS 2 · TCP/IP vlai_l1_controller.py В разработке

Требования к программному обеспечению

Квест 3 / Сторона Единства
Единство 2022.3 LTS или новее
Пакет XR для рук com.unity.xr.hands ≥ 1,3
Плагин OpenXR com.unity.xr.openxr ≥ 1,9
Мета XR SDK Необязательно, но рекомендуется для сквозной передачи
Режим отслеживания рук Включено в настройках системы Квест (Отслеживание движения)
Управляющий ПК/сторона Python
Питон 3.10 или новее (использует синтаксис типа объединения)
piper_sdk pip install piper_sdk
Python-банка pip install python-can
CAN-интерфейс адаптер USB-CAN; активирован с помощью can_activate.sh can0 1000000
Только стандартная библиотека сокет, структура, очередь, поток, сигнал, время

Готовы к Телеопу?

Вернитесь к руководству по настройке, чтобы обеспечить потоковую передачу Quest 3 на манипулятор робота, или прочитайте полную вики-страницу, чтобы получить полную информацию для разработчиков.