Table of Contents

Точка входа Unity AR — AR Session

AR-сеанс (session) — это входная точка для всех AR-функций. В этом разделе вы узнаете базовые понятия AR Session, ее состав, процесс выполнения и то, как она соотносится с AR Session в Unity AR Foundation. Вы также узнаете, как именно работает поток данных EasyAR Sense в Unity.

Что такое AR Session

Все AR-процессы, например отслеживание объектов, выполняются внутри нативной библиотеки, то есть EasyAR Sense. session — это основная входная точка AR-функций в Unity. Она управляет процессом работы и состоянием AR-системы, включая чтение данных из физической камеры и сенсоров, анализ реального мира, управление перемещением и рендерингом виртуальной камеры и других объектов в сцене.

flowchart LR
  A((Изображения<br>и другие данные))
  B[Session]
  C([Camera])
  O([Origin])
  T([Target])
  A --> B
  B -. transform .-> C
  B -. transform .-> O
  B -. transform .-> T

[Необязательно] session EasyAR и session AR Foundation

EasyAR session — это ключевой компонент EasyAR в Unity, который может работать независимо от любых сторонних или системных AR-функций. А session AR Foundation является частью Unity XR framework и может использовать только функции, предоставляемые Unity XR-плагинами, такими как ARKit или ARCore.

flowchart TD
  A1[EasyAR<br>AR Session]
  A2[EasyAR Sense]
  A1 --> A2

  B1[AR Foundation<br>AR Session]
  B2[ARKit Plugin]
  B3[ARCore Plugin]
  B1 --> B2
  B1 --> B3

При использовании EasyAR обычно не требуется одновременно устанавливать и использовать AR Foundation. Например, функции отслеживания изображений, отслеживания движения и другие предоставляются EasyAR Sense самостоятельно.

В некоторых случаях может потребоваться совместить EasyAR Sense с AR Foundation, чтобы использовать дополнительные функции и интерфейсы, предоставляемые AR Foundation, например обнаружение плоскостей на части устройств. В этом случае EasyAR Sense взаимодействует с Unity Engine через интерфейсы, предоставляемые AR Foundation.

Однако, поскольку EasyAR предоставляет больше функций и более полную адаптацию устройств, чем системный AR, самостоятельное использование AR Foundation обычно не позволяет получить такой же эффект, как EasyAR.

Состав session

Типичная session в основном состоит из следующих частей:

  • frame source: компонент, предоставляющий изображения физической камеры и данные сенсоров; иногда эти компоненты также предоставляют данные отслеживания движения. Например, CameraDeviceFrameSource и MotionTrackerFrameSource
  • frame filter(s): компоненты, предоставляющие конкретные AR-функции, например ImageTrackerFrameFilter
  • camera: объект виртуальной камеры в сцене
  • origin: объект источника координат для отслеживания движения
Примечание

В понятиях AR Foundation отслеживание движения является обязательной функцией, поэтому origin предоставляется всегда.
В системе EasyAR отслеживание движения является необязательной функцией, поэтому origin также является необязательным.

[Необязательно] поток данных session

Поток данных — одно из ключевых понятий EasyAR Sense. Он не влияет на разработку AR-приложений в Unity. Если вы хотите глубже понять принцип работы session, можно прочитать этот раздел.

В Unity одна session обычно выражает один поток данных EasyAR Sense.

flowchart LR
  S[Frame Source]
  R[Input Frame Recorder<br>Video Input Frame Recorder]
  ift[iFrameThrottler]
  iff[iFrameFork]
  i2f[i2FAdapter]
  fb[fbFrameFork]  
  i2o[i2OAdapter]

  FOT[Object Tracker]
  FIT[Image Tracker]
  FMT[Mega Tracker]
  FSSM[Sparse Spatial Map]
  FST[Surface Tracker]
  FDS[Dense Spatial Map]
  FCR[Cloud Recognizer]
  
  ofj[oFrameJoin]
  off[oFrameFork]
  ofb[oFrameBuffer]

  O(( ))
  ODS(( ))
  OCR(( ))

  S ==> R ==> ift ==> iff
  iff --> i2f
  i2f --> fb
  fb -.-> FOT -.-> ofj
  fb -.-> FIT -.-> ofj
  iff ==> i2o ==> ofj ==> off ==> ofb ==> O
  iff -.-> FMT -.-> ofj
  iff -.-> FSSM -.-> ofj
  iff -.-> FST -.-> ofj
  iff -.-> FDS -.-> ODS
  iff -.-> FCR -.-> OCR
  off --> i2f
  ofb --> ift

Этот поток данных создается во время запуска session. За исключением выделенных на схеме путей данных, подключение остальных частей зависит от AR-компонентов, включенных во время запуска.

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

Процесс session

flowchart LR
  i[Инициализация<br>Initialize]
  a[Сборка<br>Assemble]
  starta["Запуск (собранной)<br>StartSession(Assembled)"]
  start[Запуск<br>StartSession]
  update((Обновление<br>update))
  stop[Остановка<br>StopSession]
  di[Деинициализация<br>Deinitialize]

  i --> a --> starta --> update --> stop --> di
  i --> start --> update

  • Инициализация
    Инициализация — это процесс запуска EasyAR Sense с использованием license key. До инициализации доступны только очень немногие интерфейсы EasyAR Sense. После инициализации AR-функции активируются.

  • Сборка (Assembling)
    Процесс сборки на основе параметров сборки выбирает подходящие компоненты из сцены и соединяет их в единую рабочую единицу. Обычно этот процесс выполняется автоматически при запуске, но до запуска также можно вручную вызвать интерфейс сборки. После завершения сборки можно запустить уже собранную session, чтобы пропустить процесс сборки и ускорить запуск.
    У процесса сборки есть еще одно важное назначение: определять доступность AR-компонентов и источников ввода, а также выбирать самый подходящий источник ввода из всех кандидатов. Этот шаг также можно использовать для определения, может ли текущая session работать на текущем устройстве.

    Процесс сборки делится на два этапа

    1. На первом этапе запускается обновление списка поддержки устройств, и после фиксированного времени ожидания согласно конфигурации начинается сборка. Если после ожидания первого этапа список поддержки устройств уже обновлен, процесс сборки завершается;
    2. Иначе процесс сборки переходит ко второму этапу, который выполняется после завершения обновления списка поддержки устройств. На этом этапе, если доступный frame source меняется с отсутствия доступного frame source на наличие доступного frame source и запуск session после первого этапа завершился ошибкой, будет выполнена попытка повторно запустить session.

    Независимо от того, завершилось ли обновление списка устройств на первом этапе, session продолжит выполнять последующие шаги после завершения первого этапа.

  • Запуск
    Запуск — это процесс начала работы AR-функций. До запуска компоненты AR-функций не обрабатывают никакие данные. После нормального запуска session начинает управлять перемещением некоторых объектов сцены и, при использовании некоторых источников ввода, управлять рендерингом изображения физической камеры.

  • Обновление
    Процесс обновления выполняется в каждом кадре рендеринг-цикла Unity. На основе результатов работы текущих AR-функций он каждый кадр изменяет transform виртуальной камеры (для некоторых источников ввода), origin и отслеживаемых targets. На разных устройствах момент выполнения процесса обновления отличается, но он обязательно выполняется до рендеринга.

  • Остановка
    Остановка завершает работу AR-функций; объекты в сцене больше не будут управляться session, а данные источника ввода не будут обрабатываться.

  • Деинициализация
    Деинициализация освобождает часть глобальных ресурсов (динамическая библиотека не выгружается). После деинициализации компоненты AR-функций нельзя использовать.

Примечание

Все AR-функции можно использовать только после ARSession.StartSession.

Жизненный цикл session по умолчанию

flowchart LR
  uload("BeforeSceneLoad")
  ustart("MonoBehaviour.Start")
  udestroy("MonoBehaviour.OnDestroy")
  oi{Initialize<br>OnStartup}
  ostart{AutoStart}
  i[Инициализация<br>Initialize]
  start[Запуск<br>StartSession]
  update((Обновление<br>update))
  stop[Остановка<br>StopSession]
  
  uload -.-> ustart -.-> udestroy
  uload --> oi -. true .-> i
  ustart --> ostart -. true .-> start
  udestroy --> stop
  i --> start --> update --> stop

Жизненный цикл session обычно определяется временем вызова интерфейсов. При настройках по умолчанию session автоматически выполняется в следующие моменты:

Состояние session

ARSession.State описывает состояние session. У session есть следующие состояния:

Состояние Описание
None Начальное состояние, session не запущена и не собрана
Broken session повреждена из-за ошибки сборки или другой причины
Assembling В процессе сборки; обычно процесс сборки может длиться несколько кадров
Assembled Сборка успешно завершена, но session еще не запущена
Ready session успешно запущена; это состояние длится только один кадр
Running session выполняется
Paused session приостановлена

Обычно состояние session изменяется при вызове интерфейсов запуска, остановки и подобных. Во время выполнения, если возникает серьезная ошибка, session также может перейти в состояние Broken. session, перешедшая в состояние Broken, не может возобновить работу; необходимо вызвать остановку и затем запустить ее заново.

По состоянию session можно понять, находится ли текущая session в доступном состоянии. Подавляющее большинство функций можно использовать только в состояниях Ready или Running.

Состояние отслеживания движения

ARSession.TrackingStatus описывает состояние отслеживания движения session; оно показывает качество отслеживания движения устройства и имеет следующие состояния:

Состояние Описание
Optional<MotionTrackingStatus>.Empty Функция отслеживания движения не включена или session не выполняется
NotTracking Результат отслеживания движения недоступен; возможные причины: идет инициализация, отслеживание потеряно или выполняется релокализация
Limited Отслеживание движения действительно, но результат не очень хороший; возможные причины: слишком слабая текстура текущей области или слишком быстрое движение
Tracking Хорошее качество отслеживания движения
Примечание

В понятиях AR Foundation отслеживание движения является обязательной функцией, поэтому его состояние отслеживания объединено с состоянием session.
В системе EasyAR отслеживание движения является необязательной функцией, поэтому состояние отслеживания существует отдельно и может быть пустым.

Где находятся состояния отслеживания других AR-функций

Поскольку AR-функции могут одновременно отслеживать несколько объектов, состояние отслеживания изображений и состояния отслеживания других AR-функций находятся не в session, а в компонентах отслеживаемых целей.

Можно использовать TargetController.IsTracked, чтобы узнать, находится ли отслеживаемая цель в состоянии отслеживания, или использовать события TargetController.TargetFound иTargetController.TargetLost, чтобы корректировать логику содержимого приложения при изменении состояния отслеживания.

Дальнейшие шаги

Создание

Управление выполнением

Доступ к компонентам и результатам

Справочник компонентов

  • Справочник компонента ARSession