Android XR, Geospatial API, Gemini로 혼합 현실 투어 가이드 빌드
7분 읽기
올해 Google I/O에서는 공간 환경 업데이트를 발표했습니다. 이제 Geospatial API를 Jetpack XR용 ARCore에서 미리보기로 사용할 수 있습니다. Android XR은 Google의 시각적 위치 지정 시스템 (VPS)을 Android XR에 도입하여 지원되는 영역에서 디지털 콘텐츠를 1미터 미만의 정확도와 정밀한 방향으로 실제 세계에 고정할 수 있도록 지원합니다.* Geospatial API로 무엇을 할 수 있는지 알아보기 위해 Google팀은 XR Geospatial Tour라는 데모를 빌드했습니다.
새로운 도시로 걸어 들어가 곧 출시될 XREAL Project Aura와 같은 유선 XR 글라스를 착용하면 현지 가이드가 즉시 주변을 안내해 준다고 상상해 보세요. 2D 지도를 내려다볼 필요가 없습니다. 대신 3D 모델이 경로를 부드럽게 안내하고 지능형 음성이 바로 앞에 있는 역사적 랜드마크에 관해 알려줍니다. Google은 Geospatial API, Firebase AI Logic을 사용하는 Gemini API, Google 지도 기반 그라운딩, Jetpack XR SDK를 결합하여 핸즈프리 몰입형 도보 투어 환경을 만들었습니다.
면책조항: 동영상 및 투어 가이드 애플리케이션은 데모 목적으로만 제공됩니다. 일부 시퀀스가 단축되었습니다. 표시된 하드웨어는 개발 중일 수 있으며 최종 제품 세부정보는 다를 수 있습니다.
구현 세부정보를 살펴보고 이러한 API를 함께 연결하여 세계 규모의 공간 환경을 빌드하는 방법을 보여드리겠습니다.
1. ARCore Geospatial API (VPS)로 사용자 위치 정확히 파악
GPS의 성능과 VPS의 정확성을 결합하여 XR에서 내비게이션 환경을 개선하세요. VPS의 정확성과 정밀한 방향을 통해 3D 경유지를 실제 세계에 맞출 수 있습니다.
이러한 이유로 Android XR의 Geospatial API를 사용하면 맞춤 환경을 빌드할 수 있습니다. VPS는 고급 컴퓨터 비전을 사용하여 GPS보다 더 정확한 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가 Google의 기준점을 충족할 때까지 모니터링합니다. 사용자가 실내에 있거나 인식되지 않는 영역에 있는 경우 '실외 공공장소로 걸어가서 주변을 둘러보세요'라는 메시지가 표시됩니다.
2. Gemini API 및 Google 지도 기반 그라운딩으로 여정 만들기
위치를 파악한 후 Firebase AI Logic을 사용하는 Gemini API를 사용하여 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 지도 기반 그라운딩을 사용하여 AI를 그라운딩했습니다.
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. Jetpack XR로 3D로 구현
퍼즐의 마지막 조각은 이 데이터를 사용자의 시야에 렌더링하는 것입니다. Jetpack XR SDK를 사용하면 2D Android UI에서 공간 컴퓨팅으로 직관적으로 전환할 수 있습니다.
XR용 Jetpack Compose를 사용하여 공간 구성요소를 빌드했습니다. 투어의 관심 지점을 나타내기 위해 공간에 떠 있고 상호작용하여 정보를 표시할 수 있는 3D 구의 GltfModel이 포함된 InfoSphere라는 Composable을 빌드했습니다.
Jetpack XR SDK를 사용하면 SpatialBox 및 SceneCoreEntity를 사용하여 Compose UI와 함께 3D 모델을 배치할 수 있습니다. 또한 InteractableComponent를 사용하여 사용자 탭에 응답했습니다.
기존 Compose UI 노출 영역의 AnimatedSpatialVisibility를 SceneCoreEntity 3D 요소와 결합하여 데이터를 실제 세계에 원활하게 통합할 수 있습니다.
@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를 미리보기로 사용할 수 있으므로 앱이 주변의 실제 세계를 원활하게 이해할 수 있습니다. _Compose for XR_의 API를 VPS의 고정밀 위치 데이터 및 Gemini의 생성 기능과 결합하여 사용자의 위치와 사용자가 보고 있는 대상을 모두 이해하는 환경을 만들 수 있습니다.
Android XR을 직접 사용해 볼 수 있도록 XREAL Project Aura가 포함된 Android XR Developer Catalyst Program의 신청을 받게 되어 기쁩니다. 오늘부터 향후 몇 개월 동안 XREAL Project Aura 개발 키트 또는 디스플레이 글라스 개발 키트에 액세스할 수 있도록 신청할 수 있습니다.
*면책조항: 일부 기기에서 사용할 수 있습니다. 인터넷에 연결되어 있어야 합니다. 호환되는 앱 및 서비스에서 작동합니다. 결과는 다를 수 있습니다.
-
어두운 방에서 좋아하는 소셜 미디어 피드를 스크롤하고 있는데 갑자기 HDR 동영상이 팝업되는 경험을 해보셨을 것입니다. 너무 밝아서 눈을 가늘게 뜨거나 캡션을 읽기 위해 화면 밝기를 낮춰야 할 수도 있습니다.
Tibian Elsheikh, Jeffrey Jose • 2분 읽기 -
오늘 Android 17을 출시하고 대부분의 지원되는 Pixel 기기에서 사용할 수 있도록 합니다. 향후 몇 개월 동안 Android 17을 실행하는 새 기기를 찾아보세요.
Matthew McCullough • 13분 읽기 -
2026년 7월 16일2026년 7월 16일
제품 소식이제 Android 스튜디오 Quail 2가 안정화되어 프로덕션에서 사용할 수 있으며, 동시 에이전트 워크플로, 기본적으로 통합된 메모리 누수 프로파일링, 상황 인식 충돌 해결을 통해 IDE가 전환됩니다.
Android 개발 관련 최신 정보를 이메일로 받아 보세요. 매주