Управление процессом отслеживания 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 отправляет запрос локализации в облако.
- Отслеживание:
- 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.
![]()
Mega может работать почти на всех типах источников кадров, но разные источники кадров по-разному влияют на результат отслеживания.
По умолчанию Mega выбирает для отслеживания frame source самого высокого уровня, поддерживаемого устройством. Session с поддержкой Mega при настройках по умолчанию уже настроен с поддержкой 6DoF и 5DoF frame source.
Чтобы во время работы Mega поддерживать frame source определенного уровня, должны выполняться два условия:
- нужный frame source находится в группе опциональных frame source у session.
- MegaTrackerFrameFilter.MinInputFrameLevel больше или равен уровню CameraTransformType нужного frame source.
Например, чтобы поддержать 3DoF-отслеживание в session по умолчанию, нужно:
- добавить ThreeDofCameraDeviceFrameSource в группу frame source у session.
- изменить MegaTrackerFrameFilter.MinInputFrameLevel на ThreeDof.
Еще пример: чтобы удалить поддержку 5DoF-отслеживания из session по умолчанию, нужно:
- удалить InertialCameraDeviceFrameSource из группы frame source у session.
- изменить MegaTrackerFrameFilter.MinInputFrameLevel на SixDof (даже если не менять, 5DoF не будет использоваться, потому что нет 5DoF frame source).
Если доступного 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.
![]()
При успешной локализации информация о локализованном, но не загруженном block отображается как Block [scnObj=?]: <name> (<id>).
![]()
Совет
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, использующие данную глобальную конфигурацию.
![]()
Совет
Конфигурацию сервиса можно получить в центре разработчиков EasyAR.

Если нужно использовать разные базы локализации в разных session, можно установить Access Source в API Key, а затем изменить параметры сервиса ниже.
![]()
В скрипте можно изменить 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, чтобы настроить интервал запросов к сервису и время ожидания.
![]()
В скрипте можно изменить MegaTrackerFrameFilter.RequestTimeParameters, чтобы получить тот же эффект.
Предупреждение
Изменение интервала запроса влияет на результат отслеживания и обычно не рекомендуется. Используйте его под руководством технической поддержки EasyAR.
Если интервал запросов изменялся во время выполнения приложения, обязательно сообщите об этом при отправке проблемы в EasyAR.
Переключение базы локализации
С помощью MegaTrackerFrameFilter.SwitchEndPoint можно переключать базу локализации во время выполнения. При использовании этого интерфейса изображение камеры и session не прерываются.
Связанные темы
- Лучшие практики AR Session для Mega описывают, как создать и настроить AR Session, подходящую для Mega
- Добавление цели отслеживания Mega описывает, как добавить цель отслеживания block для Mega и как загрузить модель block в Unity Editor, чтобы упростить разработку
- Добавление группы источников кадров описывает, как изменить группу frame source у session
- Получение результата работы session описывает, как получить результат отслеживания от компонента session
- UI-сообщения описывает, как использовать UI-сообщения для отображения состояния session