Работа с геопространственными позами с использованием ARCore для Jetpack XR

Применимые устройства XR
Это руководство поможет вам создать опыт использования этих типов XR-устройств.
Очки ИИ

Благодаря геопространственному API в ARCore для Jetpack XR ваше приложение может удалённо прикреплять контент к любой области, охватываемой Google Street View , и создавать дополненную реальность (AR) в глобальном масштабе. Геопространственный API использует данные датчиков устройства и GPS для определения окружения устройства, а затем сопоставляет распознаваемые элементы этого окружения с моделью локализации, предоставленной системой визуального позиционирования Google (VPS), для определения точного местоположения устройства пользователя. API также обеспечивает объединение локальных координат пользователя с географическими координатами VPS, что позволяет работать в единой системе координат.

Включить API ARCore

Перед использованием системы визуального позиционирования (VPS) в вашем приложении необходимо включить API ARCore в новом или существующем проекте Google Cloud. Эта служба отвечает за размещение, хранение и определение геопространственных привязок.

Добавить дополнительные библиотечные зависимости

Для использования Geospatial 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")
}

Запросить необходимые разрешения

Чтобы использовать Geospatial API в ARCore с Jetpack XR, вашему приложению необходимо запросить следующие разрешения времени выполнения:

Объявите разрешения приложения

Прежде чем вы сможете запросить эти разрешения во время выполнения, вам необходимо объявить их в манифесте вашего приложения:

<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>

Запросить разрешения

После объявления необходимых разрешений ваше приложение должно запросить их во время выполнения . Обязательно объясните, зачем вашему приложению нужны эти разрешения .

Geospatial API не может функционировать, если не может определить точное местоположение пользователя. Поэтому следуйте инструкциям по запросу разрешений на определение местоположения во время выполнения , чтобы вашему приложению были предоставлены как разрешения ACCESS_FINE_LOCATION , так и разрешения ACCESS_COARSE_LOCATION .

Доступ к сеансу

Доступ к геопространственной информации осуществляется через Session выполнения Jetpack XR, который должно создать ваше приложение .

Настройте сеанс

Информация о положении устройства по умолчанию отключена в сеансах 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() выполнен успешно, устройство поддерживает эти режимы.

Запросить у пользователя разрешение на использование данных устройства

Приложения, использующие Geospatial 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 для определения геопространственной позы, API можно использовать до тех пор, пока устройство способно определять своё местоположение. В областях с низкой точностью 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
    }
}