Table of Contents

AR data flow

В этой статье описывается data flow в EasyAR Sense. EasyAR Sense использует компонентные API, а компоненты соединяются через data flow.

Входные и выходные данные

fundamentals dataflow input output

InputFrame: input frame. Содержит image, camera parameters, timestamp, camera transform относительно world coordinate system и tracking status. При этом camera parameters, timestamp, camera transform относительно world coordinate system и tracking status являются optional, но конкретные algorithm components имеют определенные требования к input.

OutputFrame: output frame. Содержит input frame и output results синхронных processing components.

FeedbackFrame: feedback frame. Содержит один input frame и один historical output frame, используется feedback-style synchronous processing components, такими как ImageTracker.

Camera components

CameraDevice: default camera на Windows, Mac, iOS и Android.

ARKitCameraDevice: default implementation ARKit на iOS.

ARCoreCameraDevice: default implementation ARCore на Android.

MotionTrackerCameraDevice: реализует motion tracking и вычисляет 6DoF coordinates устройства через multi-sensor fusion. (только Android)

ThreeDofCameraDevice: добавляет 3DoF orientation поверх default camera.

InertialCameraDevice: добавляет 3DoF orientation и plane translation на основе inertial estimation поверх default camera.

custom camera device: пользовательская реализация камеры.

Algorithm components

Feedback-style synchronous processing component: должен выдавать result для каждого camera image frame и нуждается в processing result предыдущего frame, чтобы избежать взаимных помех.

  • ImageTracker: реализует обнаружение и отслеживание плоских изображений.

  • ObjectTracker: реализует обнаружение и отслеживание 3D-объектов.

Компоненты синхронной обработки: должны выводить результаты, следуя изображению камеры на каждом кадре.

  • SurfaceTracker: реализует отслеживание поверхностей окружающей среды.

  • SparseSpatialMap: реализует sparse spatial map, предоставляя возможность сканировать физическое пространство, одновременно создавая карты облака точек и выполняя локализацию в реальном времени.

  • MegaTracker: реализует пространственную локализацию Mega.

Компоненты асинхронной обработки: не должны выводить результаты, следуя изображению камеры на каждом кадре.

  • CloudRecognizer: реализует cloud recognition.

  • DenseSpatialMap: реализует dense spatial map, который можно использовать для реализации эффектов, таких как collision и occlusion.

Проверка доступности компонентов

Все компоненты имеют функцию isAvailable, которую можно использовать, чтобы определить, доступен ли компонент.

Компонент может быть недоступен в следующих случаях:

  • Он не реализован в текущей operating system.

  • Отсутствуют dependencies, необходимые компоненту, например ARKit или ARCore.

  • Компонент отсутствует в текущей version (variant), например некоторые функции отсутствуют в упрощенных версиях.

  • Компонент недоступен под текущей License.

Перед использованием компонента обязательно проверяйте, доступен ли он, и выполняйте соответствующий fallback или показывайте prompt.

Data flow

Способ соединения компонентов показан на рисунке ниже.

fundamentals dataflow

Есть особый вариант, где input является feedback frame, как показано ниже.

fundamentals dataflow feedback

Data flow helper classes

Порты отправки и приема data flow. Каждый компонент должен включать эти порты.

Ветвление и объединение data flow

  • InputFrameFork: разделяет один InputFrame на несколько параллельных выходов.

  • OutputFrameFork: разделяет один OutputFrame на несколько параллельных выходов.

  • OutputFrameJoin: объединяет несколько OutputFrame в один и объединяет все результаты в Results. Обратите внимание, что его несколько входных соединений не следует подключать одновременно с поступлением данных, иначе он может перейти в состояние, в котором не сможет выдавать выходные данные. Рекомендуется завершить подключение data flow до запуска Camera.

  • FeedbackFrameFork: разделяет один FeedbackFrame на несколько параллельных выходов.

Ограничение потока и буферизация data flow

  • InputFrameThrottler: принимает и отправляет InputFrame, но отправляет только один за раз. Следующий InputFrame отправляется только после получения триггерного сигнала. При получении нескольких InputFrame последующие InputFrame могут перезаписать предыдущие InputFrame.

  • OutputFrameBuffer: принимает и буферизует OutputFrame, ожидает опроса пользователем и может отправить сигнал при получении OutputFrame.

  • Подключите сигнал, отправляемый OutputFrameBuffer, к InputFrameThrottler, чтобы завершить весь процесс throttling.

Преобразование data flow

Ограничение количества InputFrame

CameraDevice может задавать bufferCapacity, то есть максимальное количество InputFrame, которое он выдает. Текущее значение по умолчанию равно 8.

Custom camera может использовать BufferPool для реализации.

Количество InputFrame, необходимое каждому компоненту, см. в API documentation соответствующего компонента.

Если количества InputFrame недостаточно, data flow может зависнуть и привести к зависанию rendering.

Если количества InputFrame недостаточно, также возможна ситуация, когда rendering не зависает при первом запуске, но зависает после переключения в background или после pause/start компонентов. При тестировании обязательно покрывайте эту ситуацию.

Подключение и отключение

Не рекомендуется подключать и отключать соединения во время работы data flow.

Если нужно подключать или отключать во время runtime, обратите внимание, что это можно делать только на cut edge (после удаления этого edge data flow делится на две части). Нельзя делать это на edge в cycle (здесь cycle означает цикл, образованный edge, когда data flow рассматривается как undirected graph), на input OutputFrameJoin или на sideInput InputFrameThrottler. Иначе data flow может зависнуть на таких nodes, как OutputFrameJoin и InputFrameThrottler, и не выдавать output.

Все algorithm components имеют функции start/stop. В состоянии stop frames не обрабатываются, но все равно выходят из компонента, только без results.

Типичное использование

Ниже показано использование одного ImageTracker, которое можно применять для распознавания и tracking неповторяющихся planar image targets.

fundamentals dataflow single ImageTracker

Ниже показано использование одного ImageTracker, которое можно применять для распознавания и tracking повторяющихся planar image targets.

fundamentals dataflow multiple ImageTracker

Ниже показано использование SparseSpatialMap, которое можно применять для sparse spatial map building, localization и tracking.

fundamentals dataflow SparseSpatialMap

Ниже показано совместное использование SparseSpatialMap и DenseSpatialMap, которое можно применять для sparse spatial map building, localization, tracking и dense spatial map generation.

fundamentals dataflow Sparse-DenseSpatialMap