إنشاء دليل سياحي للواقع المختلط باستخدام Android XR وGeospatial API وGemini

قراءة لمدة 7 دقائق
3 مؤلفين
Coco Fatus, Alon Hetzroni, Azin Mehrnoosh

_خلال فعالية Google I/O لهذا العام_ ، أعلنّا عن تحديث للتجارب المكانية: أصبحت _Geospatial API_ متاحة الآن كمعاينة في _ARCore for Jetpack XR_. من خلال توفير نظام تحديد المواقع المرئية (VPS) من Google على Android XR، يتيح Android XR تثبيت المحتوى الرقمي في العالم المادي بدقة تقل عن المتر وتوجيه دقيق في المناطق المتوافقة.* لاستكشاف إمكانات Geospatial API، أنشأ فريقنا عرضًا توضيحيًا: جولة XR الجغرافية المكانية.

تخيَّل أنّك تدخل مدينة جديدة وتضع نظارات بنظام الواقع الممتد سلكية (مثل نظارات XREAL Project Aura القادمة)، ويظهر لك على الفور دليل سياحي محلي خبير يريك المدينة. لا تحتاج إلى التحديق في خريطة ثنائية الأبعاد، بل ترشدك نماذج ثلاثية الأبعاد بلطف، ويخبرك صوت ذكي عن المعالم التاريخية أمامك مباشرةً. لقد جمعنا بين واجهات برمجة التطبيقات الجغرافية المكانية و Gemini API باستخدام Firebase AI Logic و Google Maps Grounding و Jetpack XR SDK لإنشاء تجربة جولة سير غامرة بدون استخدام اليدين.

 

 

إخلاء مسؤولية: الفيديو وتطبيق "الدليل السياحي" لأغراض العرض التوضيحي فقط. تم تقصير بعض المشاهد. قد يكون أي جهاز معروض قيد التطوير، وقد تختلف تفاصيل المنتج النهائي.

لنلقِ نظرة على تفاصيل التنفيذ ونوضّح كيف ربطنا واجهات برمجة التطبيقات هذه معًا لإنشاء تجربة مكانية على نطاق عالمي.

‫1. تحديد موقع المستخدِم بدقة باستخدام ARCore Geospatial API (VPS)

يمكنك تحسين تجربة التنقّل في الواقع الممتد من خلال الجمع بين قوة نظام تحديد المواقع العالمي (GPS) ودقة نظام تحديد المواقع المرئية (VPS). تتيح الدقة والتوجيه الدقيق اللذان يوفّرهما نظام تحديد المواقع المرئية (VPS) محاذاة نقاط المرور الثلاثية الأبعاد مع العالم المادي.

لهذا السبب، يمكن أن تساعدك Geospatial API على Android XR في إنشاء تجارب مخصّصة. باستخدام الرؤية الحاسوبية المتقدّمة، يحاول نظام تحديد المواقع المرئية (VPS) توفير GeospatialPose (بما في ذلك خط العرض وخط الطول والاتجاه) أكثر دقة من نظام تحديد المواقع العالمي (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 إلى أن يستوفيا الحدود التي نحدّدها. إذا كان المستخدِم في مكان داخلي أو في منطقة غير معروفة، نطلب منه "المشي إلى مساحة عامة خارجية والنظر حوله".

‫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 Maps Grounding لربط الذكاء الاصطناعي بالواقع.

‫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

العنصر الأخير هو عرض هذه البيانات في مجال رؤية المستخدِم. تسهّل حزمة Jetpack XR SDK الانتقال من واجهة مستخدم Android ثنائية الأبعاد إلى الحوسبة المكانية.

استخدمنا Jetpack Compose for XR لإنشاء مكوّنات مكانية. لتمثيل نقاط الاهتمام على طول الجولة، أنشأنا دالة مركّبة تُسمى InfoSphere، وتحتوي على GltfModel لنموذج ثلاثي الأبعاد يطفو في الفضاء ويمكن التفاعل معه لعرض المعلومات.

باستخدام Jetpack XR SDK، يمكننا وضع نماذج ثلاثية الأبعاد بجانب واجهة مستخدم Compose باستخدام 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 الجغرافية المكانية" أنّ حاجز الدخول إلى التجارب المكانية على نطاق عالمي أقل من أي وقت مضى لمطوّري Android. مع توفّر Geospatial API الآن في المعاينة على Android XR، يمكن لتطبيقاتك فهم العالم المادي من حولها بسلاسة. من خلال الجمع بين واجهات برمجة التطبيقات الخاصة بـ Compose for XR وبيانات الموقع الجغرافي العالية الدقة لنظام تحديد المواقع المرئية (VPS) والإمكانات التوليدية لنموذج Gemini، يمكننا إنشاء تجارب تفهم مكان المستخدِم وما ينظر إليه.

لمساعدتك في استخدام Android XR، يسرّنا فتح باب التقديم إلى برنامج Android XR Developer Catalyst Program، الذي يتضمّن نظارات XREAL Project Aura. اعتبارًا من اليوم، يمكنك تقديم طلب للحصول على مجموعة أدوات تطوير XREAL Project Aura أو مجموعة أدوات تطوير نظارات بشاشة عرض خلال الأشهر المقبلة.

*إخلاء مسؤولية: هذه الميزة متوفّرة على أجهزة محدّدة. يجب توفُّر اتصال بالإنترنت. ويمكن استخدامها على التطبيقات ومساحات العرض المتوافقة. قد تختلف النتائج.

متابعة القراءة