Создание гида по смешанной реальности с помощью Android XR, Geospatial API и Gemini
Время на чтение: 6 минут
На конференции Google I/O в этом году мы объявили об обновлении для пространственных приложений: геопространственный API теперь доступен в предварительной версии ARCore для Jetpack XR. Благодаря системе визуального позиционирования (VPS) от Google, встроенной в Android XR, эта ОС позволяет привязывать цифровой контент к физическому миру с точностью до метра и определять ориентацию в поддерживаемых областях.* Чтобы показать, на что способен Geospatial API, наша команда создала демоверсию – XR Geospatial Tour.
Представьте, что вы приехали в новый город, надели проводные XR-очки (например, XREAL Project Aura) и сразу же получили опытного местного гида, который показывает вам окрестности. Вам не нужно смотреть на плоскую карту. Вместо этого 3D-модели будут показывать вам путь, а умный голосовой помощник расскажет о достопримечательностях, которые вы видите. Мы объединили геопространственные API, Gemini API с использованием Firebase AI Logic, Google Maps Grounding и Jetpack XR SDK, чтобы создать иммерсивный пешеходный тур с управлением без помощи рук.
Отказ от обязательств. Приложения "Видео" и "Гид по городу" приведены только в качестве примера. Некоторые последовательности действий сокращены. Изображенные устройства могут находиться на стадии разработки. Окончательные характеристики продукта могут отличаться.
Давайте рассмотрим детали реализации и узнаем, как мы объединили эти 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 с 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 в мир пространственных приложений стал ниже, чем когда-либо. Теперь в Android XR доступна предварительная версия Geospatial API, с помощью которой приложения могут распознавать окружающий физический мир. Сочетая API Compose for XR с высокоточными данными о местоположении VPS и генеративными возможностями Gemini, мы можем создавать приложения, которые понимают, где находится пользователь и на что он смотрит.
Чтобы помочь вам освоить Android XR, мы открываем прием заявок на участие в программе Android XR Developer Catalyst, в которую входит XREAL Project Aura. С сегодняшнего дня вы можете подать заявку на получение комплекта разработчика XREAL Project Aura или комплекта разработчика дисплейных очков в ближайшие месяцы.
*Примечание. Доступно не на всех устройствах. Необходимо подключение к интернету. Работает только с совместимыми приложениями и платформами. Результаты могут отличаться.
-
Новости продуктовУ разработчиков Android есть множество вариантов выбора агентов, больших языковых моделей (LLM), инструментов и интерфейсов командной строки (CLI), которые можно использовать для разработки приложений. Наша цель – помочь вам создавать красивые и качественные приложения для Android, независимо от того, как вы это делаете.
Simona Milanovic • Время на чтение: 4 минуты -
Новости продуктовМы постоянно расширяем возможности платформы подписок в Google Play, чтобы помочь вам развивать бизнес, адаптироваться к новым бизнес-моделям и привлекать пользователей.
Sheenam Mittal • Время на чтение: 4 минуты -
Новости продуктовВ прошлом году мы открыли Android Studio для любых моделей ИИ. Сегодня мы делаем следующий шаг и добавляем поддержку агентов для написания кода.
Matthew Warner • Время на чтение: 3 минуты
Получайте свежие новости о разработке приложений для Android на свою электронную почту каждую неделю.