Требования к данным входного кадра для внешних источников кадровых данных
Чтобы внешний источник кадровых данных работал корректно, самая важная и одновременно самая сложная задача заключается в обеспечении правильности данных. В этой статье описаны требования к данным входного кадра для внешних источников кадровых данных.
Перед началом
- Изучите базовые понятия, такие как камера и входной кадр.
- Изучите базовые понятия и распространенные типы внешних источников кадровых данных.
Типы данных входного кадра
В Unity внешний источник кадровых данных обычно должен получать разные данные в два разных момента времени. В зависимости от времени ввода внешних данных и их характеристик эти две группы данных называются:
- данные кадра камеры (camera frame data)
- данные кадра рендеринга (rendering frame data)
Разные типы внешних источников кадровых данных предъявляют разные требования к этим двум группам данных:
- Расширение ввода данных изображения и движения устройства: требуются и данные кадра камеры, и данные кадра рендеринга
- Расширение ввода изображения: требуются только данные кадра камеры
Данные кадра камеры
Требования к данным:
- timestamp
- необработанные данные изображения физической камеры (raw camera image data)
- внутренние параметры (intrinsics, включая размер изображения, фокусное расстояние и главную точку. Если есть дисторсия, также нужны модель и параметры дисторсии)
- внешние параметры (extrinsics, Tcw или Twc, калиброванная матрица, выражающая физическое смещение физической камеры относительно origin pose устройства/головы)
- состояние отслеживания (tracking status)
- pose устройства (device pose)
Время данных:
- Средняя точка экспозиции физической камеры
Использование данных:
- Время вызова API: может меняться в зависимости от проектирования внешнего кода. Распространенный способ, используемый большинством устройств, заключается в запросе во время обновления рендеринга 3D engine, после чего по timestamp данных устройства решается, требуется ли дальнейшая обработка данных
- Поток вызова API: game thread 3D engine или любой другой поток, если все используемые внешние API являются thread-safe
Пример вызова API в Unity:
void TryInputCameraFrameData()
{
double timestamp;
if (timestamp == curTimestamp) { return; }
curTimestamp = timestamp;
PixelFormat format;
Vector2Int size;
Vector2Int pixelSize;
int bufferSize;
var bufferO = TryAcquireBuffer(bufferSize);
if (bufferO.OnNone) { return; }
var buffer = bufferO.Value;
IntPtr imageData;
buffer.tryCopyFrom(imageData, 0, 0, bufferSize);
var historicalHeadPose = new Pose();
MotionTrackingStatus trackingStatus = (MotionTrackingStatus)(-1);
using (buffer)
using (var image = Image.create(buffer, format, size.x, size.y, pixelSize.x, pixelSize.y))
{
HandleCameraFrameData(deviceCamera, timestamp, image, cameraParameters, historicalHeadPose, trackingStatus);
}
}
Рендеринг frame data
Требования к данным:
- Timestamp
- Tracking status
- Device pose
Время данных:
- Момент вывода кадра на экран. TimeWarp не учитывается. Данные device pose в тот же момент будут использоваться внешней стороной, например device SDK, для настройки transform виртуальной камеры при рендеринге текущего кадра.
Примечание
TimeWarp, который иногда также называется Reprojection или ATW/PTW, является распространенной в VR/AR-шлемах техникой снижения задержки. После завершения рендеринга она повторно искажает изображение на основе самой новой pose головы, чтобы компенсировать движение головы, возникшее во время рендеринга. EasyAR требуется момент времени, соответствующий pose, использованной для настройки виртуальной камеры в начале рендеринга, а не фактический момент вывода на экран после TimeWarp.
Использование данных:
- Время вызова API: каждый кадр рендеринга 3D engine
- Поток вызова API: game thread 3D engine
Пример вызова API в Unity приведен ниже:
private void InputRenderFrameMotionData()
{
double timestamp = 0e-9;
var headPose = new Pose();
MotionTrackingStatus trackingStatus = (MotionTrackingStatus)(-1);
HandleRenderFrameData(timestamp, headPose, trackingStatus);
}
Подробности требований к данным
Данные изображения физической камеры:
- Система координат изображения: данные, полученные при горизонтальном положении сенсора, также должны быть горизонтальными. Данные должны использовать левый верхний угол как origin и храниться в порядке row-major. Изображение не должно быть отражено или перевернуто.
- FPS изображения: подходят обычные данные 30 или 60 fps. Если высокий fps имеет особое влияние, минимально допустимая частота кадров для разумного результата алгоритма равна 2. Рекомендуется использовать fps выше 2; обычно можно использовать исходную частоту кадров данных.
- Размер изображения: для получения лучших вычислительных результатов самая длинная сторона должна быть 960 или больше. Обычно не рекомендуется выполнять трудоемкое масштабирование изображения в цепочке данных. Рекомендуется напрямую использовать исходные данные, если только время копирования полноразмерных данных уже не стало неприемлемо большим. Разрешение изображения не должно быть меньше 640*480.
- Формат пикселей: при приоритете качества отслеживания и с учетом производительности обычный порядок предпочтения форматов: YUV > RGB > RGBA > Gray (компонент Y в YUV). При использовании данных YUV требуется полное определение данных, включая детали упаковки и padding. По сравнению с одноканальными изображениями цветные изображения дают лучший результат Mega, но мало влияют на другие функции.
- Доступ к данным: указатель на данные или эквивалентная реализация. Лучше устранить все возможные необязательные копирования в цепочке данных. В HandleRenderFrameData EasyAR копирует один экземпляр данных, а затем использует его асинхронно. После завершения синхронного вызова данные изображения больше не используются. Обратите внимание на владение данными.
Временные метки:
- Все временные метки должны быть синхронизированы по часам, предпочтительно аппаратно. Единица данных — секунды, но точность должна достигать наносекунд или быть максимально высокой.
Состояние отслеживания:
- Состояние отслеживания определяется устройством и должно включать состояние потери отслеживания, когда VIO недоступен. Если есть больше уровней, это лучше.
Поза устройства:
- Все pose, включая transform виртуальной камеры в 3D-движке, должны использовать одно начало координат.
- Все pose и extrinsics должны использовать одну и ту же систему координатных осей.
- В Unity тип системы координатных осей данных pose должен быть системой координатных осей Unity или EasyAR. Если input extension реализован EasyAR и использует другое определение системы координатных осей, предоставьте четкое определение системы или способ преобразования в систему координатных осей Unity или EasyAR.
- В Unity, если используется Unity XR framework, достаточно совместимости с режимом XROrigin.TrackingOriginMode.Device.
Intrinsics:
- Все значения должны соответствовать данным изображения. При необходимости масштабируйте intrinsics перед передачей в EasyAR.
- Если input extension реализован EasyAR, укажите, меняются ли intrinsics каждый кадр, поскольку от этого зависит, вызывать соответствующий API один раз или каждый кадр.
Extrinsics:
- На гарнитурах должны предоставляться реальные данные.
- Это калибровочная матрица, выражающая физическое смещение физической камеры относительно начала pose устройства/головы. Если pose устройства и pose физической камеры одинаковы, это должна быть единичная матрица.
- Соответствующий интерфейс Apple Vision Pro: CameraFrame.Sample.Parameters.extrinsics. Обратите внимание, что его определение данных отличается от данных, необходимых интерфейсу; EasyAR внутри использует их после преобразования.
- В Unity тип системы координатных осей extrinsics должен быть системой координатных осей Unity или EasyAR. Если input extension реализован EasyAR и использует другое определение системы координатных осей, предоставьте четкое определение системы или способ преобразования в систему координатных осей Unity или EasyAR.
- В гарнитурах обычно существуют несколько систем координат с разными определениями, включая различия начала координатных осей, направления и левостороннего/правостороннего представления. Extrinsics должны вычисляться в одной системе координат. Данные интерфейса требуют преобразования координат в одной системе координат, а не матрицы преобразования между двумя системами координат с разными определениями.
Производительность:
- Данные должны предоставляться с оптимальной эффективностью. В большинстве реализаций вызовы API происходят во время рендеринга, поэтому даже если на нижнем уровне нужны длительные операции, не блокируйте вызовы API или используйте эти API разумным способом.
- Если input extension реализован EasyAR, опишите все длительные вызовы API.
Несколько камер:
- Требуются данные как минимум одной камеры. Это может быть RGB-камера, VST-камера, камера локализации и т. д. На гарнитурах, если передаются данные только одной камеры, обычно рекомендуется использовать RGB- или VST-камеру около центра или около глаз.
- Использование нескольких камер может улучшить результат алгоритма EasyAR. Данные кадров всех доступных камер в данный момент должны одновременно передаваться в одну и ту же временную точку.
Несколько камер пока поддерживаются не полностью. Свяжитесь с EasyAR для подробностей.
Следующие шаги
- Создать расширение ввода данных изображения и движения устройства
- Создать расширение ввода изображения
- Создать пакет расширения для шлема
Связанные темы
- Системы координат EasyAR
- Пример расширения ввода изображения Workflow_FrameSource_ExternalImageStream