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 начинается процесс инициализации локального отслеживания.
    • При использовании frame source не-6DoF этап инициализации пропускается, и процесс сразу переходит к начальному этапу локализации.
    • Этот процесс может занять некоторое время; оно зависит от сложности сцены и производительности устройства, а также обычно связано с алгоритмом, используемым нижним уровнем frame source.
    • При настройках по умолчанию содержимое этого этапа не отображается; этим поведением можно управлять через параметры компонента ActiveController.
  • Начальная локализация:
    • Если локализация включена и интервал запроса превышен, tracker отправляет запрос локализации в облако.
      • После успешной локализации, если block, соответствующий id, возвращенному сервисом локализации, уже загружен, процесс переходит к этапу отслеживания; если block не загружен, он продолжает ожидать завершения загрузки block и следующего запроса локализации.
      • После неудачной локализации tracker продолжает ожидать следующего запроса локализации.
    • Этот процесс может занять некоторое время; оно зависит от того, насколько легко локализуется сцена, качества сбора данных и построения карты, а также состояния сети.
    • При настройках по умолчанию содержимое этого этапа не отображается; этим поведением можно управлять через параметры компонента ActiveController.
  • Отслеживание:
    • tracker продолжает отслеживать текущий block.
    • Если локализация включена и интервал запроса превышен, tracker отправляет запрос локализации в облако.
      • После успешной локализации, если id, возвращенный сервисом локализации, не изменился, отслеживание продолжается; если id изменился и block уже загружен, выполняется переключение на новый block и отслеживание продолжается; если id изменился, но block не загружен, tracker продолжает ожидать завершения загрузки block и следующего запроса локализации.
      • После неудачной локализации tracker продолжает отслеживать текущий block и ожидает следующего запроса локализации.
    • При настройках по умолчанию на этом этапе отображается только содержимое под узлом target, находящимся в состоянии отслеживания (TargetController.IsTracked == true); этим поведением можно управлять через параметры компонента ActiveController.
  • Остановка:
    • После остановки session target выгружается, а tracker нативного уровня уничтожается.

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

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

alt text

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

По умолчанию Mega выбирает для отслеживания frame source самого высокого уровня, поддерживаемого устройством. Session с поддержкой Mega при настройках по умолчанию уже настроен с поддержкой 6DoF и 5DoF frame source.

Чтобы во время работы Mega поддерживать frame source определенного уровня, должны выполняться два условия:

Например, чтобы поддержать 3DoF-отслеживание в session по умолчанию, нужно:

Еще пример: чтобы удалить поддержку 5DoF-отслеживания из session по умолчанию, нужно:

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

Понимание текущего состояния системы

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

При успешной локализации под информацией сервиса Mega будет отображаться текст состояния Found; при неудачной локализации под информацией сервиса Mega будет отображаться текст состояния NotFound.

Загруженный block отображается как Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>). Здесь <objName> - имя объекта сцены, соответствующего block, <name> - имя block, а <id> - ID block. trackingStatus может быть Tracking или NotTracking; они показывают, отслеживается ли текущий block.

alt text alt text

При успешной локализации информация о локализованном, но не загруженном block отображается как Block [scnObj=?]: <name> (<id>).

alt text

Совет

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; у части конечных пользователей локализация может случайно завершаться неудачно (общее качество tracking снижается)
        // обычно нужно оплатить повышение лимита QPS, чтобы обеспечить качество tracking при текущем числе пользователей
    }

    if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
    {
        // Token истек; это происходит только при доступе к сервису через интерфейс Token
        // для решения проблемы приложение должно запросить Token у собственного backend и вызвать MegaTrackerFrameFilter.UpdateToken для обновления
    }
}

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

Примечание

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

На самом деле pose, возвращенный локализацией, не нужен при разработке приложения. После ответа локализации EasyAR вычисляет более точный pose локальным алгоритмом и возвращает его разработчику для использования; этот pose уже отражен в transform блока. См. получение результата работы session.

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

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

Пауза отслеживания

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

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

Пауза локализации

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

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

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

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

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

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

Выбор базы локализации

Выберите объект Mega Tracker под session и измените параметры в разделе Service, чтобы настроить подключаемую базу локализации. Этот параметр нужно задать до запуска session.

При настройках по умолчанию Access Source равен Global Config, используется глобальная конфигурация сервиса. Параметры сервиса можно изменить в Project Settings в разделе EasyAR > Sense > Mega > Mega Block; эта настройка влияет на все session, использующие данную глобальную конфигурацию.

alt text

Совет

Конфигурацию сервиса можно получить в центре разработчиков EasyAR.
Mega Config Detail

Если нужно использовать разные базы локализации в разных session, можно установить Access Source в API Key, а затем изменить параметры сервиса ниже.

alt text

В скрипте можно изменить MegaTrackerFrameFilter.ServiceAccessSource и MegaTrackerFrameFilter.ServiceAccessData, чтобы получить тот же эффект.

Например, следующий код показывает, как до запуска session настроить tracker на подключение к сервису с параметрами времени выполнения:

megaTracker.ServiceType = easyar.MegaApiType.Block;
megaTracker.ServiceAccessSource = easyar.MegaServiceAccessSourceType.APIKey;
megaTracker.ServiceAccessData = new easyar.APIKeyAccessData
{
    ServerAddress = serverAddress,
    APIKey = apiKey,
    APISecret = apiSecret,
    AppID = appID
};

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

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

alt text

В скрипте можно изменить MegaTrackerFrameFilter.RequestTimeParameters, чтобы получить тот же эффект.

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

Изменение интервала запроса влияет на результат отслеживания и обычно не рекомендуется. Используйте его под руководством технической поддержки EasyAR.

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

Переключение базы локализации

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

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