Создание гида в смешанной реальности с помощью Android XR, Geospatial API и Gemini
Время на чтение: 6 минут
На конференции Google I/O в этом году мы анонсировали обновление для пространственных технологий: Geospatial API теперь доступен в предварительной версии в ARCore для Jetpack XR. Благодаря системе визуального позиционирования (VPS) от Google на Android XR можно привязывать цифровой контент к физическому миру с точностью до метра и точной ориентацией в поддерживаемых областях*. Чтобы продемонстрировать возможности Geospatial API, наша команда создала демоверсию XR Geospatial Tour.
Представьте, что вы приехали в новый город, надели проводные XR-очки (например, XREAL Project Aura) и сразу же получили знающего местного гида, который готов показать вам окрестности. Вам не нужно смотреть на двухмерную карту – вместо этого 3D-модели мягко направляют вас, а умный голос рассказывает об исторических достопримечательностях прямо перед вами. Мы объединили Geospatial API, Gemini API с Firebase AI Logic, Google Maps Grounding и Jetpack XR SDK, чтобы создать иммерсивную пешеходную экскурсию, в которой не нужно использовать руки.
Примечание. Видео и приложение Tour Guide предназначены только для демонстрации. Некоторые последовательности действий сокращены. Изображенное оборудование может находиться в разработке, а характеристики конечного продукта могут отличаться.
Давайте рассмотрим детали реализации и покажем, как мы связали эти API вместе, чтобы создать пространственный опыт мирового масштаба.
1. Определение местоположения пользователя с помощью ARCore Geospatial API (VPS)
Улучшите навигацию в XR, объединив возможности GPS и точность VPS. Точность и ориентация, которые обеспечивает VPS, позволяют совмещать 3D-маркеры с физическим миром.
Поэтому Geospatial API для Android XR поможет вам создавать собственные решения. Используя передовые технологии компьютерного зрения, VPS пытается предоставить более точные данные GeospatialPose (включая широту, долготу и направление), чем GPS.
Вот как мы получаем пространственную позу пользователя, сопоставляя ориентацию устройства с пространственной координатой:
// 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 Картами
Получив местоположение, мы используем 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 Карт для обоснования ИИ.
3. Голос, который вас направляет: Gemini 2.5 TTS
Чтобы создать ощущение присутствия гида, мы добавили динамическую озвучку.
С помощью gemini-2.5-flash-tts model мы можем настроить конфигурацию генерации модели так, чтобы она возвращала аудиоданные, а не только текст. Вот как запросить 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 для XR. Чтобы показать интересные места на маршруте, мы создали composable-функцию InfoSphere, которая содержит GltfModel – 3D-сферу, парящую в пространстве. При взаимодействии с ней показывается информация.
С помощью Jetpack XR SDK мы можем размещать 3D-модели рядом с интерфейсом Compose, используя SpatialBox и SceneCoreEntity. Мы также использовали InteractableComponent, чтобы реагировать на нажатия пользователя.
Объединив AnimatedSpatialVisibility для традиционных поверхностей Compose UI с 3D-элементами SceneCoreEntity, мы можем легко интегрировать данные в физический мир.
@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() } }) } } ) } }
Узнайте, что можно делать с Android XR уже сегодня
Создание приложения XR Geospatial Tour показало нам, что барьер для входа в мир пространственных технологий мирового масштаба для разработчиков Android ниже, чем когда-либо. Geospatial API, который теперь доступен в предварительной версии на Android XR, позволяет приложениям легко распознавать окружающий физический мир. Объединив API Compose for XR с высокоточными данными о местоположении от VPS и генеративными возможностями Gemini, мы можем создавать приложения, которые понимают, где находится пользователь и на что он смотрит.
Чтобы помочь вам освоить Android XR, мы открываем прием заявок на участие в программе Android XR Developer Catalyst, которая включает XREAL Project Aura. С сегодняшнего дня вы можете подать заявку на получение набора для разработчиков XREAL Project Aura или видеоочков в ближайшие месяцы.
*Отказ от обязательств. Доступно не на всех устройствах. Необходимо подключение к интернету. Работает только с совместимыми приложениями и платформами. Результаты могут отличаться.
-
Новости о продуктахСегодня на Саммите для разработчиков Android мы объявляем о широкой доступности многих инструментов и API, которые помогут вам преодолевать повседневные трудности и дадут больше гибкости при создании отличных приложений для Android.
Matthew McCullough • Время на чтение: 4 минуты -
Новости о продуктахAndroid Studio Rabbit 2 теперь стабильна и готова к использованию в рабочей среде. В этом выпуске представлены ключевые функции, которые помогут вам в разработке, например Bring Your Own Agent, новые функции XR Emulator, обновление LeakCanary, новый инструмент управления навыками агента, код-ревью с помощью ИИ и многое другое.
Matthew Warner • Время на чтение: 3 минуты -
Новости о продуктахПриложения, предназначенные для предстоящего выпуска Android, больше не смогут напрямую записывать данные в контакты с помощью разрешения WRITE_CONTACTS.
Roxanna Aliabadi Walker • Время на чтение: 6 минут
Получайте еженедельную рассылку с последними новостями о разработке для Android.