Tworzenie przewodnika po rzeczywistości mieszanej za pomocą Androida XR, interfejsu Geospatial API i Gemini
6 min czytania
Na tegorocznej konferencji Google I/O ogłosiliśmy aktualizację dotyczącą rozwiązań przestrzennych: Geospatial API jest teraz dostępny w wersji testowej w ARCore dla Jetpack XR. Dzięki wprowadzeniu systemu pozycjonowania wizualnego (VPS) Google do Androida XR platforma ta umożliwia zakotwiczanie treści cyfrowych w świecie fizycznym z dokładnością do centymetra i precyzyjną orientacją w obsługiwanych obszarach*. Aby sprawdzić, jakie możliwości otwiera Geospatial API, nasz zespół stworzył wersję demonstracyjną – XR Geospatial Tour.
Wyobraź sobie, że wchodzisz do nowego miasta, zakładasz przewodowe okulary XR (takie jak nadchodzące XREAL Project Aura) i od razu masz do dyspozycji kompetentnego lokalnego przewodnika. Nie musisz patrzeć na mapę 2D – zamiast tego modele 3D delikatnie wskazują Ci drogę, a inteligentny głos opowiada o zabytkach znajdujących się przed Tobą. Połączyliśmy Geospatial API, Gemini API z użyciem Firebase AI Logic, Google Maps Grounding i Jetpack XR SDK, aby stworzyć wciągającą wycieczkę pieszą bez użycia rąk.
Zastrzeżenie: film i aplikacja Tour Guide służą wyłącznie do celów demonstracyjnych. Niektóre sekwencje zostały skrócone. Przedstawiony sprzęt może być w trakcie opracowywania. Szczegóły dotyczące produktu mogą się różnić.
Przyjrzyjmy się szczegółom implementacji i pokażmy, jak połączyliśmy te interfejsy API, aby stworzyć rozwiązanie przestrzenne na skalę światową.
1. Określanie pozycji użytkownika za pomocą ARCore Geospatial API (VPS)
Zwiększ komfort nawigacji w rzeczywistości rozszerzonej, łącząc moc GPS z precyzją VPS. Dzięki dokładności i precyzyjnej orientacji, jaką zapewnia VPS, punkty orientacyjne 3D mogą być dopasowane do świata fizycznego.
Dlatego Geospatial API na Androidzie XR może pomóc Ci w tworzeniu niestandardowych rozwiązań. Dzięki zaawansowanemu rozpoznawaniu obrazów VPS próbuje podać GeospatialPose (w tym szerokość i długość geograficzną oraz kierunek), która jest dokładniejsza niż GPS.
Oto jak pobieramy pozycję geoprzestrzenną użytkownika, mapując orientację urządzenia na współrzędne geoprzestrzenne:
// 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}") }
Ponieważ całe rozwiązanie opiera się na tej dokładności, monitorujemy wartości horizontalAccuracy i orientationYawAccuracy, dopóki nie osiągną one naszych progów. Jeśli użytkownik znajduje się w pomieszczeniu lub w nierozpoznanym obszarze, prosimy go o „wyjście na zewnątrz i rozejrzenie się”.
2. Tworzenie planu podróży za pomocą Gemini API i Google Maps Grounding
Gdy mamy już lokalizację, używamy Gemini API z użyciem Firebase AI Logic, aby poprosić model Gemini o pełnienie funkcji lokalnego przewodnika. Przekazujemy modelowi współrzędne użytkownika i prosimy go o zwrócenie uporządkowanej odpowiedzi JSON zawierającej pobliskie trasy piesze:
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.")
Duże modele językowe świetnie sprawdzają się w generowaniu bogatych opisów, ale czasami mogą podawać nieprawidłowe współrzędne geograficzne. Aby rozwiązać ten problem, użyliśmy Google Maps Grounding do powiązania AI z rzeczywistością.
3. Głos, który Cię poprowadzi: Gemini 2.5 TTS
Aby przewodnik był bardziej realistyczny, zaimplementowaliśmy dynamiczne komentarze głosowe.
Dzięki gemini-2.5-flash-tts model możemy skonfigurować generowanie modelu tak, aby zamiast tekstu zwracał on dane audio. Oto jak możesz poprosić o 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. Ożywianie świata w 3D za pomocą Jetpack XR
Ostatnim elementem układanki jest renderowanie tych danych w polu widzenia użytkownika. Jetpack XR SDK ułatwia przejście z interfejsu Androida 2D na obliczenia przestrzenne.
Do tworzenia komponentów przestrzennych użyliśmy Jetpack Compose dla XR. Aby przedstawić ciekawe miejsca na trasie, stworzyliśmy komponent Composable o nazwie InfoSphere, który zawiera GltfModel kuli 3D unoszącej się w przestrzeni. Można z nią wchodzić w interakcje, aby wyświetlić informacje.
Za pomocą Jetpack XR SDK możemy umieszczać modele 3D obok interfejsu Compose za pomocą SpatialBox i SceneCoreEntity. Użyliśmy też InteractableComponent, aby reagować na dotknięcia użytkownika.
Łącząc AnimatedSpatialVisibility dla tradycyjnych powierzchni interfejsu Compose z elementami 3D SceneCoreEntity, możemy płynnie łączyć dane ze światem fizycznym.
@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() } }) } } ) } }
Poznaj możliwości Androida XR
Tworzenie aplikacji XR Geospatial Tour pokazało nam, że bariera wejścia dla deweloperów Androida w zakresie rozwiązań przestrzennych na skalę światową jest niższa niż kiedykolwiek. Dzięki Geospatial API, który jest teraz dostępny w wersji testowej na Androidzie XR, Twoje aplikacje mogą płynnie rozpoznawać otaczający je świat fizyczny. Łącząc interfejsy API Compose for XR z precyzyjnymi danymi o lokalizacji z VPS i możliwościami generatywnymi Gemini, możemy tworzyć rozwiązania, które rozpoznają zarówno miejsce, w którym znajduje się użytkownik, jak i to, na co patrzy.
Aby pomóc Ci w praktycznym zapoznaniu się z Androidem XR, z przyjemnością otwieramy nabór do Programu dla deweloperów Androida XR, który obejmuje XREAL Project Aura. Od dziś możesz zgłosić się, aby w najbliższych miesiącach uzyskać dostęp do zestawu deweloperskiego XREAL Project Aura lub zestawu deweloperskiego okularów z wyświetlaczem.
*Zastrzeżenie: dostępne na wybranych urządzeniach. Wymagane jest połączenie z internetem. Wymaga zgodnych aplikacji i platform. Wyniki mogą się różnić.
-
Nowości dotyczące produktówTo jest ostatnia stabilna wersja Android Studio Quail. Nowe funkcje w Android Studio umożliwiają wydajne i skuteczne tworzenie aplikacji premium z wykorzystaniem AI.
Amman Asfaw • 5 min czytania -
Nowości dotyczące produktówUtrzymanie zdrowego ekosystemu Androida to wspólne zobowiązanie, w którym każda aplikacja i gra ma do odegrania swoją rolę.
Raghavendra Hareesh Pottamsetty • 4 min czytania -
Nowości dotyczące produktówW Google Play bezpieczeństwo użytkowników i sukces deweloperów idą w parze. Stale obserwujemy wzrost liczby aplikacji z funkcjami generowanymi przez AI. Dodanie generatywnej AI do aplikacji to świetny sposób na odblokowanie niesamowitych możliwości twórczych.
Ron Aquino • 4 min czytania
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.