Oct 27 13:11 · AI content
Pico 4 Pro и Lighthouse без трекера на голове: порт QuestLHSync
Всё что ниже - это обработанный пересказ утренних изысканий относительно возможности избавиться от трекера на голове для синхронизации с Lighthouse девайсами в частности - базовыми станциями. Спасибо технологиям что позволяют набросать прототипы за пару часов, а не 1-2 недели плотных задротских технических вечеров. Спасибо.
Кто играет в VRChat с фулбоди на Lighthouse и шлемом не от Valve, знает эту боль: пространство трекеров и пространство шлема живут отдельно, и их приходится постоянно сводить. Обычно это SpaceCalibrator плюс трекер на голове или перекалибровка каждые полчаса. Для Quest уже есть QuestLHSync от CreoleVR: шлем сам видит базовые станции своими камерами и держит всё выровненным, без трекера на голове. Для Pico такого не было. Теперь есть: я портировал QuestLHSync на Pico 4 Pro. Ниже история целиком: как это устроено, на какие грабли наступил и как поставить себе.
⚠️ Сначала о рисках и ограничениях
- Нужен root (Magisk) на шлеме. Как я его получал, есть в прошлом посте про раздельные глаза: разблокировка загрузчика стирает все данные в шлеме.
- Порт экспериментальный. Проверен на одном шлеме: Pico 4 Pro, PICO OS 5.13.3S, стриминг через Virtual Desktop, три станции 2.0. На обычном Pico 4 и других прошивках не проверялся.
- Готовых сборок пока нет, собирать из исходников. Это несложно, команды ниже.
- Модуль на шлеме ничего не прошивает и не меняет в системе. Удаляется из Magisk одной кнопкой.
Как работает QuestLHSync
Базовые станции 2.0 крутят лазерные плоскости. Если в момент короткой экспозиции камеры шлема через неё проходит лазер, в кадре вспыхивает яркая точка. Направление на неё - это луч из камеры на станцию. Шлем знает свою позу, SteamVR знает, где стоят станции. Если набрать достаточно таких лучей, можно найти поворот и сдвиг, при которых все лучи попадают в станции. Это и есть выравнивание двух пространств, и драйвер применяет его ко всем Lighthouse-устройствам прямо на лету.
Устроено из двух частей:
- на шлеме: модуль Magisk. Читает кадры камер трекинга, ищет яркие точки и отдаёт их по сети (TCP 47280);
- на ПК: драйвер SteamVR. Принимает точки, решает задачу выравнивания и добавляет свою страницу в дашборд SteamVR.
Чтобы запустить это на Pico, нужно было переписать часть на шлеме под его камеры и научить драйвер понимать калибровку Pico. Дальше самое интересное.
Шаг 1. Найти камеры
У Pico 4 Pro четыре камеры трекинга OV9282: глобальный затвор, 640×480, 10 бит. Все кадры живут в системном процессе pvrtrackingservice, в кольце из 32 буферов dmabuf, по 8 на камеру. Камеры снимают 50 кадров в секунду, чередуя длинную и короткую экспозицию. Лазеры видны только в коротких.
Грабля №1: буферы не читаются снаружи. Даже из-под root /proc/pid/mem на этих областях отвечает ошибкой ввода-вывода. Пришлось делать как в оригинале для Quest: внедрять Frida прямо в процесс трекинга и искать точки там, на маленьком C-коде, скомпилированном на лету.
Грабля №2: двойные кадры. Сначала я видел около 80 кадров в секунду вместо 50: один и тот же кадр иногда засчитывался дважды. Оказалось, что в конце каждого буфера есть служебный «хвост» с номером кадра и точным временем экспозиции в наносекундах. По нему кадры идут ровно 50,0 в секунду. Заодно время каждого кадра теперь точное, без задержки опроса.
гайд
vr
pico 4 pro
root
magisk
vrchat
steamvr
lighthouse
questlhsync
Ar'Vi
Джип-штука +- доведена до ума, но основные тесты под нагрузкой постоянного движения и перекрытия пройдут в выходные.
Oct 28 08:34




