Table of Contents

Поток данных в AR

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

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

fundamentals dataflow input output

InputFrame: Входной кадр. Содержит изображение, параметры камеры, временную метку, преобразование камеры относительно мировой системы координат и состояние отслеживания. Параметры камеры, временная метка, преобразование и состояние отслеживания являются опциональными, но определенные алгоритмические компоненты могут предъявлять специфические требования ко входным данным.

OutputFrame: Выходной кадр. Содержит входной кадр и результаты синхронной обработки компонентов.

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

Компоненты камеры

CameraDevice: Камера по умолчанию на Windows, Mac, iOS, Android.

ARKitCameraDevice: Реализация по умолчанию с использованием ARKit на iOS.

ARCoreCameraDevice: Реализация по умолчанию с использованием ARCore на Android.

MotionTrackerCameraDevice: Реализует отслеживание движения, вычисляя 6 степеней свободы (6DoF) устройства с помощью мультисенсорного слияния. (Только Android)

ThreeDofCameraDevice: Расширяет камеру по умолчанию, добавляя 3 степени свободы (3DoF) для ориентации.

InertialCameraDevice: Расширяет камеру по умолчанию, добавляя 3 степени свободы (3DoF) для ориентации и инерционно оцениваемое планарное перемещение.

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

Алгоритмические компоненты

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

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

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

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

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

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

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

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

  • CloudRecognizer:Реализует облачное распознавание.

  • DenseSpatialMap:Реализует плотную пространственную карту, которая может использоваться для достижения эффектов столкновений, окклюзии и т.д.

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

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

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

  • Отсутствует реализация для текущей операционной системы.
  • Отсутствуют необходимые зависимости, например ARKit, ARCore.
  • Компонент отсутствует в текущей редакции (варианте) продукта, например, в некоторых упрощенных версиях определенные функции могут отсутствовать.
  • Компонент недоступен при текущей лицензии.

Перед использованием компонента обязательно проверяйте его доступность и предусматривайте соответствующие fallback-решения или информирование пользователя.

Поток данных

Компоненты соединяются, как показано на схеме ниже.

fundamentals dataflow

Существует особый способ использования входа в виде обратного кадра, как показано ниже.

fundamentals dataflow feedback

Вспомогательные классы потока данных

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

Ветвление и слияние потоков данных

  • InputFrameFork: Разделяет один InputFrame на несколько, издавая их параллельно.
  • OutputFrameFork: Разделяет один OutputFrame на несколько, издавая их параллельно.
  • OutputFrameJoin: Объединяет несколько OutputFrame в один, сливая все результаты в Results. Важно, что подключение его нескольких входов не должно производиться одновременно с потоком данных, иначе он может попасть в состояние невозможности вывода. (Рекомендуется завершить подключение потока данных до запуска камеры.)
  • FeedbackFrameFork: Разделяет один FeedbackFrame на несколько, издавая их параллельно.

Регулирование скорости и буферизация потока данных

  • InputFrameThrottler: Принимает и издает InputFrame, но только один за раз. Он издает следующий InputFrame только после получения триггерного сигнала. Если получено несколько InputFrame, последующие могут перезаписать предыдущие.
  • OutputFrameBuffer: Принимает OutputFrame и буферизирует его, ожидая опроса пользователем. Может издавать сигнал при получении OutputFrame.
  • Подключив сигнал от OutputFrameBuffer к InputFrameThrottler, можно завершить весь процесс регулирования скорости.

Преобразование потоков данных

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

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

Пользовательские камеры могут реализовать это с помощью BufferPool.

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

Недостаточное количество InputFrame может привести к зависанию потока данных, что вызовет задержки в рендеринге.

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

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

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

Если необходимо выполнять подключение/отключение в процессе работы, это можно делать только на "разрезающих" ребрах (удаление такого ребра разделяет поток данных на две части). Нельзя делать это на ребрах, образующих циклы (если рассматривать поток как неориентированный граф), на входах OutputFrameJoin или на sideInput InputFrameThrottler. В противном случае поток данных может зависнуть в узлах типа OutputFrameJoin или InputFrameThrottler и перестать выдавать выходные данные.

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

Типовые сценарии использования

Ниже показано использование одного ImageTracker для распознавания и отслеживания неповторяющихся плоских целевых изображений.

fundamentals dataflow single ImageTracker

Ниже показано использование одного ImageTracker для распознавания и отслеживания повторяющихся плоских целевых изображений.

fundamentals dataflow multiple ImageTracker

Ниже показано использование SparseSpatialMap для создания разреженной пространственной карты (SLAM), локализации и отслеживания.

fundamentals dataflow SparseSpatialMap

Ниже показано одновременное использование SparseSpatialMap и DenseSpatialMap для создания разреженной карты, локализации, отслеживания и генерации плотной пространственной карты.

fundamentals dataflow Sparse-DenseSpatialMap