Android XR, Geospatial API, Gemini로 혼합 현실 투어 가이드 빌드

전문 길이: 7분

올해 Google I/O에서는 공간 환경 업데이트를 발표했습니다. 이제 Geospatial API를 Jetpack XR용 ARCore에서 프리뷰로 사용할 수 있습니다. Android XR은 Google의 VPS (Visual Positioning System)를 Android XR에 도입하여 지원되는 영역에서 디지털 콘텐츠를 실제 세계에 1미터 미만의 정확도와 정밀한 방향으로 고정할 수 있도록 지원합니다.* Geospatial API로 무엇을 할 수 있는지 알아보기 위해 Google팀은 XR Geospatial Tour라는 데모를 빌드했습니다.

새로운 도시로 걸어 들어가 곧 출시될 XREAL Project Aura와 같은 유선 XR 글라스를 착용하면 현지 가이드가 바로 나타나 주변을 안내해 준다고 상상해 보세요. 2D 지도를 내려다볼 필요가 없습니다. 대신 3D 모델이 경로를 부드럽게 안내하고 지능형 음성이 바로 앞에 있는 역사적 랜드마크에 관해 알려줍니다. Google은 Geospatial APIFirebase AI Logic을 사용하는 Gemini APIGoogle 지도 기반 그라운딩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}")
}

전체 환경이 이 정확성에 의존하므로 Google은 horizontalAccuracyorientationYawAccuracy가 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에서 공간 컴퓨팅으로 직관적으로 전환할 수 있습니다.

Jetpack Compose for XR을 사용하여 공간 구성요소를 빌드했습니다. 투어의 관심 지점을 나타내기 위해 공간에 떠 있고 상호작용하여 정보를 표시할 수 있는 3D 오브의 GltfModel이 포함된 InfoSphere라는 컴포저블을 빌드했습니다.

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 개발자 촉진 프로그램의 신청을 받게 되어 기쁩니다. 오늘부터 향후 몇 개월 동안 XREAL Project Aura 개발 키트 또는 디스플레이 글라스 개발 키트에 액세스할 수 있도록 신청할 수 있습니다.

*면책조항: 일부 기기에서 사용할 수 있습니다. 인터넷에 연결되어 있어야 합니다. 호환되는 앱 및 서비스에서 작동합니다. 결과는 다를 수 있습니다.

계속 읽기