Table of Contents

Управление процессом отслеживания Mega

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

Перед началом

Рабочий процесс tracker

Рабочий процесс tracker следующий:

flowchart LR
  subgraph startup_graph[启动]
    direction TB
    sstart((session 启动))
    create[原生创建]
    load(加载 target)
    init_g[[初始化]]
  end
  
  subgraph init_graph[初始化]
    direction TB
    init_{6DoF 初始化成功<br>或非 6DoF}
    init[[本地跟踪初始化过程]]
    localization_g[[初始定位]]
  end

  subgraph localization_graph[初始定位]
    direction TB
    localize__{定位开启且<br>超过请求间隔}
    localize[云端定位]
    localize_{定位到 block 且<br>block 已加载}
    tracking_g[[跟踪]]
  end
  
  subgraph tracking_graph[跟踪]
    direction TB
    tracking[[持续跟踪]]
  
    localizet_{定位开启且<br>超过请求间隔}
    localize2[云端定位]
    localize2_{定位到 block 且<br>block 已加载}
    localization_g2[[初始定位]]
  end

  subgraph stopping_graph[停止]
    direction TB
    unload(卸载 target)
    dispose[原生销毁]
    sstop([session 停止])
  end

  sstart --> create --> load --> init_g
  init --> init_ --> |Yes| localization_g
  localize --> localize_ --> |Yes| tracking_g
  localize_ --> |No| localize__ --> |Yes| localize
  unload --> dispose --> sstop
  init_ --> |No| init

  tracking --> localizet_ --> |Yes| localize2 --> localize2_ --> |Yes| tracking
  localizet_ --> |No| tracking
  localize2_ --> |No| localization_g2

  startup_graph --> init_graph
  init_graph --> localization_graph
  localization_graph --> tracking_graph
  tracking_graph --> localization_graph
  tracking_graph --> stopping_graph

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

  • Запуск:
    • После запуска session создается tracker нативного уровня.
    • После вызова Start() самого target он загружается в соответствующий tracker.
  • Инициализация:
    • При использовании 6DoF frame source начинается процесс инициации локального отслеживания.
    • При использовании не 6DoF frame source этап инициализации пропускается, переход сразу к этапу начальной локализации.
    • Этот процесс может занять некоторое время, он зависит от сложности сцены и производительности устройства, и обычно связан с алгоритмом, используемым на нижнем уровне frame source.
    • При конфигурации по умолчанию содержимое этого этапа не отображается, это поведение можно контролировать через опции компонента ActiveController.
  • Начальная локализация:
    • Если локализация включена и истек интервал запроса, tracker отправляет запрос на локализацию в облако.
      • После успешной локализации, если block, соответствующий id, возвращенному сервисом локализации, уже загружен, переход к этапу отслеживания; если block не загружен, продолжается ожидание завершения загрузки block и следующего запроса локализации.
      • После неудачной локализации tracker продолжает ожидать следующий запрос локализации.
    • Этот процесс может занять некоторое время, он зависит от легкости локализации сцены и состояния сети.
    • При конфигурации по умолчанию содержимое этого этапа не отображается, это поведение можно контролировать через опции компонента ActiveController.
  • Отслеживание:
    • tracker постоянно отслеживает текущий block.
    • Если локализация включена и истек интервал запроса, tracker отправляет запрос на локализацию в облако.
      • После успешной локализации, если id, возвращенный сервисом локализации, не изменился, отслежив

Настройка уровня поддержки устройства

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

alt text

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

По умолчанию Mega выбирает для отслеживания источник кадров данных с наивысшим уровнем поддержки, доступным на устройстве. Сессия, поддерживающая Mega в конфигурации по умолчанию, уже настроена на работу с источниками кадров данных, поддерживающими 6DoF и 5DoF.

Для поддержки источника кадров данных определенного уровня во время работы Mega необходимо выполнение двух условий:

  • Требуемый источник кадров данных должен находиться в группе доступных источников сессии.
  • Значение MegaTrackerFrameFilter.MinInputFrameLevel должно быть больше или равно уровню CameraTransformType требуемого источника кадров данных.

Например, для поддержки отслеживания 3DoF в сессии по умолчанию необходимо:

Или, например, чтобы удалить поддержку отслеживания 5DoF в сессии по умолчанию, необходимо:

  • Удалить InertialCameraDeviceFrameSource из группы источников кадров данных сессии.
  • Изменить значение MegaTrackerFrameFilter.MinInputFrameLevel на SixDof (даже если это не изменить, 5DoF не будет использоваться, так как источника кадров данных 5DoF не будет).

Если нет доступного источника кадров данных, удовлетворяющего условиям, сборка сессии завершится неудачей.

Узнайте текущее состояние системы

При настройке сессии по умолчанию UI-сообщения отображаются на экране, содержа информацию о состоянии отслеживания Mega.

Совет

NotFound — это нормальное состояние, которое часто возникает в течение всего процесса работы Mega. При его появлении отслеживание продолжается. Обычно в разработке приложений не требуется специальной обработки состояния NotFound.

Используя событие MegaTrackerFrameFilter.LocalizationRespond, можно получать текущий статус локализации, чтобы понимать, нашел ли система цель отслеживания в данный момент.

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

private void Awake()
{
    megaTracker.LocalizationRespond += HandleLocalizationStatusChange;
}
        
private void HandleLocalizationStatusChange(MegaLocalizationResponse response)
{
    var status = response.Status;
    wakingUpCount = status == MegaTrackerLocalizationStatus.WakingUp ? wakingUpCount + 1 : 0;
    if (wakingUpCount >= 5)
    {
        // Сервис пробуждается, необходимо, чтобы конечный пользователь подождал
    }

    if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
    {
        // Превышен лимит QPS, у случайных конечных пользователей локализация будет неудачной (общее качество отслеживания снизится)
        // В этом случае обычно требуется оплатить повышение лимита QPS для обеспечения качества отслеживания при текущем количестве пользователей
    }

    if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
    {
        // Срок действия токена истёк, это происходит только при использовании API с токеном для доступа к сервису
        // Для решения этой проблемы приложению необходимо запросить токен у своего бэкенда и обновить его, вызвав MegaTrackerFrameFilter.UpdateToken
    }
}

Если приложение часто сталкивается с состоянием MegaTrackerLocalizationStatus.RequestTimeout, это обычно указывает на плохое сетевое соединение устройства с сервисом. Рекомендуется оптимизировать сетевую среду для повышения качества отслеживания. В ситуациях, когда улучшить сетевое состояние невозможно, можно рассмотреть увеличение времени ожидания запроса.

Примечание

Через это событие невозможно получить pose, возвращаемый локализацией.

Фактически, pose, возвращаемый локализацией, не требуется в разработке приложений. EasyAR после возврата локализации вычисляет более точный pose с помощью локального алгоритма и возвращает его разработчику для использования. Этот pose уже отражён в transform блока, смотрите Получение результатов работы сессии.

Пауза и продолжение

Функции отслеживания и определения местоположения Mega можно приостанавливать и продолжать отдельно.

Приостановка отслеживания

Установка MegaTrackerFrameFilter.enabled в значение false позволяет приостановить отслеживание.

По умолчанию после приостановки отслеживания все содержимое под узлами block скрывается.

Приостановка локализации

Установка MegaTrackerFrameFilter.EnableLocalization в значение false позволяет приостановить локализацию.

Предупреждение

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

Если во время выполнения приложения локализация была приостановлена, обязательно укажите это при обращении в техническую поддержку EasyAR с вопросом.

Управление службами и запросами

Поведение запроса служб можно контролировать, изменив параметры компонента MegaTrackerFrameFilter.

Интервал запросов и таймаут

Выберите объект Mega Tracker в разделе session и измените параметры в разделе Request Time Parameters, чтобы настроить интервал запросов к сервису и время таймаута.

alt text

В скрипте вы можете изменить MegaTrackerFrameFilter.RequestTimeParameters для достижения того же эффекта.

Предупреждение

Изменение интервала запросов может повлиять на качество отслеживания. Как правило, не рекомендуется изменять этот параметр. Используйте данную возможность только по инструкции технической поддержки EasyAR.

Если интервал запросов был изменен во время выполнения приложения, обязательно укажите это при обращении в техническую поддержку EasyAR.

Переключение библиотеки позиционирования

Используйте MegaTrackerFrameFilter.SwitchEndPoint для переключения библиотеки позиционирования во время выполнения. При использовании этого интерфейса камерный экран и сессия не будут прерываться.

Связанные темы

  • AR Session Best Practices for Mega описывает, как создать и настроить AR Session для Mega
  • Adding Mega Tracking Targets описывает, как добавить блок отслеживания целей Mega и как загрузить модель блока в редакторе Unity для помощи в разработке
  • Adding a Frame Data Source Group описывает, как изменить группу источников данных кадров сессии
  • Getting Session Output описывает, как получить результаты отслеживания компонента сессии
  • UI Messages описывает, как использовать UI-сообщения для отображения состояния сессии