Благодаря геопространственному API в ARCore для Jetpack XR ваше приложение может удаленно прикреплять контент к любой области, охватываемой Google Street View , и создавать AR-приложения в глобальном масштабе. Геопространственный API использует данные датчиков устройства и GPS для определения окружающей среды устройства, а затем сопоставляет распознаваемые части этой среды с моделью локализации, предоставляемой системой визуального позиционирования Google (VPS), чтобы определить точное местоположение устройства пользователя. API также обеспечивает объединение локальных координат пользователя с географическими координатами из VPS, что позволяет работать в единой системе координат.
Включите API ARCore
Прежде чем использовать систему визуального позиционирования (VPS) в своем приложении, необходимо сначала включить API ARCore в новом или существующем проекте Google Cloud. Этот сервис отвечает за размещение, хранение и разрешение геопространственных привязок.
Добавьте дополнительные зависимости библиотеки.
Для использования геопространственного API требуются дополнительные зависимости от библиотек. Добавьте их в файл build.gradle.kts вашего приложения:
Классный
dependencies { // ... Other required dependencies for the Jetpack XR SDK implementation "com.google.android.gms:play-services-location:21.3.0" }
Котлин
dependencies { // ... Other required dependencies for the Jetpack XR SDK implementation("com.google.android.gms:play-services-location:21.3.0") }
Запросить необходимые разрешения
Для использования геопространственного API в ARCore с Jetpack XR вашему приложению необходимо запросить следующие разрешения во время выполнения:
-
ACCESS_INTERNET: Этот параметр необходим для связи с облачным сервисом ARCore Geospatial API. -
ACCESS_COARSE_LOCATION: Требуется для определения приблизительного местоположения пользователя. -
ACCESS_FINE_LOCATION: Необходим для определения точного местоположения пользователя.
Объявить разрешения приложения
Прежде чем запрашивать эти разрешения во время выполнения, необходимо указать их в манифесте вашего приложения:
<manifest ... >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
Запросить разрешения
После указания необходимых разрешений ваше приложение должно запросить их во время выполнения . Обязательно объясните, зачем вашему приложению нужны эти разрешения .
Геопространственный API не сможет функционировать, если не сможет определить точное местоположение пользователя. Поэтому следуйте инструкциям по запросу разрешений на определение местоположения во время выполнения , чтобы вашему приложению были предоставлены разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION .
Получить доступ к сессии
Доступ к геопространственной информации осуществляется через Session , которую должно создать ваше приложение .
Настройте сессию
Информация о положении устройства по умолчанию отключена в сессиях XR. Чтобы ваше приложение могло получать информацию о положении устройства, настройте сессию и установите режимы GeospatialMode.VPS_AND_GPS и DeviceTrackingMode.LAST_KNOWN :
// Define the configuration object to enable Geospatial features.
val newConfig = session.config.copy(
// Set the GeospatialMode to VPS_AND_GPS.
geospatial = Config.GeospatialMode.VPS_AND_GPS
// Set the DeviceTrackingMode to LAST_KNOWN.
deviceTracking = Config.DeviceTrackingMode.LAST_KNOWN
)
// Apply the configuration to the session.
try {
when (val configResult = session.configure(newConfig)) {
is SessionConfigureGooglePlayServicesLocationLibraryNotLinked -> {
// This case generally indicates a missing library dependency.
}
is SessionConfigureSuccess -> {
// The session is now configured to use the Geospatial API.
}
else -> {
// Catch-all for other configuration errors returned using the result class.
}
}
} catch (e: UnsupportedOperationException) {
// Handle configuration failure. For example, if the specific mode is not supported on the current device or API version.
}
Режим GeospatialMode.VPS_AND_GPS использует данные как системы визуального позиционирования (VPS), так и системы глобального позиционирования (GPS) для точного определения геопространственного положения устройства.
Не все устройства XR поддерживают режимы GeospatialMode.VPS_AND_GPS и DeviceTrackingMode.LAST_KNOWN . Если Session.configure() завершился успешно, значит, устройство поддерживает эти режимы.
Предложить пользователю разрешить использование данных устройства.
Приложения, использующие геопространственный API с ARCore для Jetpack XR, должны отображать пользователю запрос на подтверждение и разрешение использования данных с его устройства. Дополнительную информацию см. в требованиях к конфиденциальности пользователей .
Получите геопространственный объект.
После настройки сессии получите объект Geospatial , используя Geospatial.getInstance(session) :
// Get the Geospatial instance
var geospatial = Geospatial.getInstance(session)
Объект Geospatial следует использовать только тогда, когда его состояние равно State.RUNNING . Вы можете отслеживать состояние с помощью класса Geospatial.state StateFlow<Geospatial.State> .
Проверить доступность VPS
Поскольку геопространственный API использует комбинацию VPS и GPS для определения геопространственного положения, его можно использовать до тех пор, пока устройство способно определять свое местоположение. В областях с низкой точностью GPS, таких как помещения и плотная городская застройка, API полагается на покрытие VPS для получения высокоточных данных о местоположении.
В типичных условиях можно ожидать, что VPS обеспечит точность позиционирования примерно в 5 метров и точность вращения в 5 градусов. Проверить наличие покрытия VPS в определенном месте можно с помощью функции приостановки Geospatial.checkVpsAvailability(latitude, longitude) . Этот вызов является асинхронной операцией и не требует настройки сессии в режиме GeospatialMode.VPS_AND_GPS .
Приведенный ниже код демонстрирует, как проверить доступность VPS с заданной широты и долготы:
// You can query the GPS to get the current device's location and check if it has VPS
val latitude = getLatitudeFromGPS()
val longitude = getLongitudeFromGPS()
// Must be called from a coroutine.
val result = geospatial.checkVpsAvailability(latitude, longitude)
if (result is VpsAvailabilityAvailable) {
// VPS is available
} else if (result is VpsAvailabilityUnavailable) {
// VPS is not available
}
Ваше приложение должно быть правильно настроено для взаимодействия с API ARCore в Google Cloud ; в противном случае ваше приложение получит результат VpsAvailabilityNotAuthorized .
Преобразовать положение устройства в геопространственное положение.
Вы можете преобразовать положение устройства в геопространственное положение, чтобы очки с искусственным интеллектом могли взаимодействовать с данными о местоположении и генерировать их. Этот конвейер преобразует текущее положение и ориентацию устройства в его локальной системе координат (положение устройства) в глобально распознаваемые координаты.
Это может вам помочь:
- Создавайте постоянно доступный контент дополненной реальности, в котором размещенный пользователем виртуальный объект точно привязан к глобальному местоположению для последующего доступа.
- Запускайте интерактивные функции, основанные на местоположении, путем непрерывного обновления координат пользователя на карте, что позволит осуществлять навигацию в реальном времени или игровой процесс в рамках географических ограничений.
- Определите точный реальный контекст пользователя для запуска логики приложения, зависящей от его местоположения.
Для преобразования положения устройства в геопространственное положение используйте Geospatial.createGeospatialPoseFromPose() :
// Get the current device Pose from the AR Session's state
// This is the device's position and orientation relative to the AR tracking origin.
val devicePose = ArDevice.getInstance(session).state.value.devicePose
// Convert the device Pose into a GeospatialPose
when (val geospatialPoseResult = geospatial.createGeospatialPoseFromPose(devicePose)) {
is CreateGeospatialPoseFromPoseSuccess -> {
val currentGeospatialPose = geospatialPoseResult.pose
val horizontalAccuracy = geospatialPoseResult.horizontalAccuracy
// ... use pose and accuracy
val latitude = currentGeospatialPose.latitude
val longitude = currentGeospatialPose.longitude
// The orientation is stored as a Quaternion in the EUS (East-Up-South) system. The EUS coordinate system has X+ pointing east, Y+ pointing up, and Z+ pointing south. True North is aligned with the -Z axis.
val eusQuaternion = currentGeospatialPose.eastUpSouthQuaternion
}
is CreateGeospatialPoseFromPoseNotTracking -> {
// Geospatial is not currently tracking
}
}
Преобразование геопространственного положения в положение устройства.
Вы можете преобразовать геопространственную координату в координаты устройства, чтобы обеспечить контекстно-ориентированный, учитывающий местоположение опыт использования очков с искусственным интеллектом. Это преобразование берет информацию, определяемую реальными координатами — например, местоположением ориентира, маршрутом навигации или постоянно отображаемым контентом дополненной реальности — и преобразует ее в точное визуальное пространство очков пользователя.
Для преобразования геопространственной позы в позу устройства используйте Geospatial.createPoseFromGeospatialPose() :
when (val poseResult = geospatial.createPoseFromGeospatialPose(geospatialPose)) {
is CreatePoseFromGeospatialPoseSuccess -> {
val devicePose = poseResult.pose
// devicePose is now ready to be used
}
is CreatePoseFromGeospatialPoseNotTracking -> {
// Geospatial is not currently tracking
}
}