Connect with us

Разработка

Создание гида в смешанной реальности с использованием Android XR, геопространственного API и Gemini

Создание приложения XR Geospatial Tour показало нам, что порог входа для разработчиков Android в пространственные проекты мирового масштаба ниже, чем когда-либо.

Опубликовано

/

     
     

На конференции Google I/O этого года мы объявили об обновлении для пространственных приложений: геопространственный API теперь доступен в предварительной версии ARCore для Jetpack XR. Благодаря интеграции системы визуального позиционирования Google — Visual Positioning System, или VPS — в Android XR платформа позволяет привязывать цифровой контент к объектам физического мира с точностью менее одного метра и правильно задавать его ориентацию в поддерживаемых регионах. Чтобы показать возможности Geospatial API, наша команда создала демонстрационное приложение — геопространственную экскурсию в расширенной реальности.

Представьте, что вы приезжаете в незнакомый город, надеваете проводные очки расширенной реальности — например, готовящиеся к выпуску XREAL Project Aura — и сразу получаете персонального местного экскурсовода, который хорошо знает город. Вам больше не нужно постоянно смотреть на плоскую карту: трёхмерные модели ненавязчиво указывают путь, а интеллектуальный голосовой помощник рассказывает об исторических достопримечательностях, находящихся прямо перед вами.

Мы объединили геопространственные программные интерфейсы, программный интерфейс Gemini с использованием Firebase AI Logic, привязку данных Google Maps к реальному миру и комплект средств разработки Jetpack XR. В результате получилось иммерсивное приложение для пешеходных экскурсий, которым можно пользоваться без помощи рук.

Рассмотрим подробности реализации и разберём, как мы связали эти программные интерфейсы, чтобы создать пространственное приложение, работающее в масштабе реального мира.

1. Точное определение местоположения пользователя с помощью ARCore Geospatial API (VPS)

Навигацию в расширенной реальности можно улучшить, объединив возможности GPS с точностью системы визуального позиционирования. Высокая точность координат и ориентации, которую обеспечивает VPS, позволяет правильно совмещать трёхмерные путевые точки с объектами физического мира.

Именно поэтому Geospatial API в Android XR подходит для создания собственных пространственных сценариев. Используя современные алгоритмы компьютерного зрения, VPS пытается определить геопространственную позицию GeospatialPose — включая широту, долготу и направление взгляда — точнее, чем обычная спутниковая система позиционирования.

Ниже показано, как получить геопространственную позу пользователя, сопоставив ориентацию устройства с географическими координатами:

// Retrieve the current geospatial pose from the ARCore session
val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)
if (result is CreateGeospatialPoseFromPoseSuccess) {
    val pose = result.pose
    Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")
}

Поскольку вся работа системы зависит от этой точности, мы отслеживаем значения horizontalAccuracy и orientationYawAccuracy до тех пор, пока они не достигнут наших пороговых значений. Если пользователь находится в помещении или в незнакомой зоне, мы предлагаем ему «пройтись до общественного места на открытом воздухе и осмотреться».

2. Создание маршрута с помощью Gemini API и Google Maps Grounding

После определения местоположения мы используем Gemini API с помощью Firebase AI Logic, чтобы заставить модель Gemini выступать в роли местного гида. Мы передаем координаты пользователя модели и просим ее вывести структурированный JSON-ответ, содержащий информацию о ближайших пешеходных маршрутах:

val configForTools = ToolConfig(
      functionCallingConfig = null,
      retrievalConfig = retrievalConfig {
        latLng = FirebaseLatLng(pose.latitude, pose.longitude)
        languageCode = "en"
      }
    )
    val responseJsonSchema = Schema.obj(
      mapOf(
        "locationIntro" to Schema.string(),
        "tours" to Schema.array(
          Schema.obj(
            mapOf(
              "title" to Schema.string(),
              "description" to Schema.string(),
              "stops" to Schema.array(
                Schema.obj(
                  mapOf(
                    "name" to Schema.string(),
                    "detailedName" to Schema.string(),
                    "description" to Schema.string()
                  )
                )
              )
            )
          )
        )
      )
    )
    val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
      modelName = "gemini-3.5-flash",
      tools = listOf(Tool.googleMaps()),
      generationConfig = generationConfig {
        responseMimeType = "application/json"
        responseSchema = responseJsonSchema
      }
    )
   val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")

Большие языковые модели отлично справляются с генерацией подробных описаний, но иногда могут давать неточные координаты широты/долготы. Для решения этой проблемы мы использовали Google Maps Grounding для привязки ИИ к конкретным координатам.

3. Голос-гид: Gemini 2.5 TTS

Чтобы гид действительно ощущался живым, мы реализовали динамическую озвучку.

Используя модель gemini-2.5-flash-tts, мы можем настроить конфигурацию генерации модели таким образом, чтобы она возвращала аудиоданные вместо просто текста! Вот как можно запросить ResponseModality.AUDIO:

val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-2.5-flash-tts",
        generationConfig = generationConfig {
            // Instruct the model to return Audio
            responseModalities = listOf(ResponseModality.AUDIO)
        }
    )
val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")
// Extract the raw audio bytes from the response
val audioBytes = response.candidates.firstOrNull()?.content?.parts
    ?.filterIsInstance<InlineDataPart>()
    ?.firstOrNull { it.mimeType.contains("audio") }?.inlineData

4. Оживление в 3D с помощью Jetpack XR

Последним элементом головоломки является отображение этих данных в поле зрения пользователя. Jetpack XR SDK делает переход от 2D-интерфейса Android к пространственным вычислениям интуитивно понятным.

Мы использовали Jetpack Compose for XR для создания пространственных компонентов. Для представления точек интереса вдоль маршрута мы создали компонент InfoSphere, который содержит GltfModel 3D-шара, парящего в пространстве, с которым можно взаимодействовать для получения информации.

Используя Jetpack XR SDK, мы можем размещать 3D-модели вместе с пользовательским интерфейсом Compose, используя SpatialBox и SceneCoreEntity. Мы также использовали InteractableComponent для реагирования на касания пользователя.

@Composable
fun InfoSphere(
    content: InfoBubbleContent,
    session: Session,
    sphereModel: GltfModel,
    isSelected: Boolean,
    onClick: () -> Unit
) {
    // SpatialBox lets us arrange 3D components and SpatialPanels together
    SpatialBox(
        SubspaceModifier
            .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space
    ) {
        // Smoothly animate the visibility of our 2D Compose UI Panel
        AnimatedSpatialVisibility(visible = isSelected) {
            SpatialPanel {
                InfoBubble(content) // Regular 2D Compose UI
            }
        }
        // Render our interactive 3D sphere
        SceneCoreEntity(
            factory = {
                GltfModelEntity.create(session, sphereModel).also { entity ->
                    // Make the 3D model respond to user taps
                    entity.addComponent(InteractableComponent.create(session) { inputEvent ->
                        if (inputEvent.action == InputEvent.Action.UP) {
                            onClick()
                        }
                    })
                }
            }
        )
    }
}

Сочетая AnimatedSpatialVisibility для традиционных поверхностей пользовательского интерфейса Compose с 3D-элементами SceneCoreEntity, мы можем бесшовно интегрировать данные в физический мир.

Изучите возможности Android XR уже сегодня

Создание приложения XR Geospatial Tour показало нам, что порог входа для разработчиков Android в пространственные проекты мирового масштаба ниже, чем когда-либо. Благодаря тому, что Geospatial API теперь доступен в предварительной версии для Android XR, ваши приложения могут беспрепятственно понимать окружающий их физический мир. Сочетая Compose for XR API с высокоточными данными о местоположении VPS и генеративными возможностями Gemini, мы можем создавать приложения, которые понимают как местоположение пользователя, так и то, на что он смотрит.

Чтобы помочь вам освоить Android XR, мы рады объявить об открытии приема заявок на участие в программе Android XR Developer Catalyst Program, которая включает в себя проект XREAL Project Aura. Начиная с сегодняшнего дня, вы можете подать заявку на получение доступа к комплекту разработчика XREAL Project Aura или к нашему комплекту разработчика для очков-дисплеев в течение ближайших месяцев.

Источник 

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: