חדשות על המוצר

איך יוצרים מדריך סיורים במציאות משולבת באמצעות Android XR, ‏Geospatial API ו-Gemini

משך הקריאה: 6 דקות
3 מחברים
Coco Fatus, Alon Hetzroni, Azin Mehrnoosh

בכנס Google I/O השנה, הכרזנו על עדכון לחוויות מרחביות: Geospatial API זמין עכשיו בגרסת טרום-השקה (Preview) ב-ARCore ל-Jetpack XR. מערכת המיקום החזותי (VPS) של Google ב-Android XR מאפשרת לעגן תוכן דיגיטלי בעולם הפיזי בדיוק של פחות ממטר ובכיוון מדויק באזורים נתמכים.* כדי לבדוק מה אפשר לעשות עם Geospatial API, הצוות שלנו בנה הדגמה: XR Geospatial Tour.

דמיינו שאתם מגיעים לעיר חדשה, מרכיבים משקפי XR עם חיבור חוטי (כמו XREAL Project Aura שיושקו בקרוב), ומיד מקבלים מדריך מקומי שמכיר את האזור ויכול להראות לכם את המקום. לא צריך לבהות במפה דו-ממדית – במקום זאת, מודלים תלת-ממדיים מנחים אתכם בעדינות לאורך המסלול, וקול חכם מספר לכם על ציוני הדרך ההיסטוריים שנמצאים ממש מולכם. שילבנו את ממשקי ה-API הגיאו-מרחביים, Gemini API באמצעות Firebase AI Logic, עיגון במפות Google ו-Jetpack XR SDK כדי ליצור חוויית סיור רגלי סוחפת ללא שימוש בידיים.

כתב ויתור: הסרטון והאפליקציה Tour Guide הם למטרות הדגמה בלבד. חלק מהקטעים קוצרו. יכול להיות שחלק מהחומרה שמוצגת נמצאת בפיתוח, ופרטי המוצר הסופי עשויים להיות שונים.

בואו נסקור את פרטי ההטמעה ונראה איך קישרנו את ממשקי ה-API האלה כדי ליצור חוויה מרחבית בקנה מידה עולמי.

1. איתור המיקום המדויק של המשתמש באמצעות ARCore Geospatial API‏ (VPS)

כדי לשפר את חוויית הניווט ב-XR, אתם יכולים לשלב את היכולות של GPS עם הדיוק של VPS. הדיוק והכיוון המדויק של VPS מאפשרים לנקודות הדרך בתלת-ממד להתאים לעולם הפיזי.

לכן, 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.")

מודלים גדולים של שפה (LLM) מעולים ביצירת תיאורים עשירים, אבל לפעמים הם יכולים להזות קואורדינטות מדויקות של קו רוחב/אורך. כדי לפתור את הבעיה, השתמשנו בעיגון במפות 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

החלק האחרון בפאזל הוא רינדור הנתונים האלה בשדה הראייה של המשתמש. ערכת ה-SDK של Jetpack XR מאפשרת לעבור בקלות מממשק משתמש דו-ממדי ב-Android למחשוב מרחבי.

השתמשנו ב-Jetpack Compose ל-XR כדי ליצור רכיבים מרחביים. כדי לייצג נקודות עניין לאורך הסיור, בנינו Composable שנקרא InfoSphere, שמכיל GltfModel של כדור תלת-ממדי שמרחף בחלל ואפשר לקיים איתו אינטראקציה כדי לחשוף מידע.

באמצעות Jetpack XR SDK, אנחנו יכולים להציב מודלים תלת-ממדיים לצד ממשק המשתמש של פיתוח נייטיב באמצעות SpatialBox ו-SceneCoreEntity. השתמשנו גם ב-InteractableComponent כדי להגיב ללחיצות של משתמשים.

כשמשלבים את AnimatedSpatialVisibility לממשקי משתמש רגילים ב-Compose עם רכיבי תלת-ממד של 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 יכולים ליצור חוויות מרחביות בקנה מידה עולמי בקלות רבה יותר מאי פעם. גרסת טרום-השקה (Preview) של Geospatial API זמינה עכשיו ב-Android XR, והאפליקציות שלכם יכולות להבין בצורה חלקה את העולם הפיזי שסביבן. כשמשלבים את ממשקי ה-API של Compose for XR עם נתוני המיקום המדויקים של VPS והיכולות הגנרטיביות של Gemini, אפשר ליצור חוויות שמאפשרות להבין גם איפה המשתמש נמצא וגם במה הוא מסתכל.

כדי לעזור לכם להתנסות ב-Android XR, אנחנו שמחים לפתוח את ההרשמה לתוכנית Android XR Developer Catalyst Program, שכוללת את XREAL Project Aura. החל מהיום, אתם יכולים להגיש בקשה לקבלת גישה לערכת פיתוח של XREAL Project Aura או לערכת פיתוח של משקפיים עם תצוגה פנימית בחודשים הקרובים. 

*כתב ויתור: זמין במכשירים נבחרים. נדרש חיבור לאינטרנט. התכונה פועלת באפליקציות ובפלטפורמות תואמות. התוצאות עשויות להיות שונות. 

להמשך קריאה