ARCore for Jetpack XR का इस्तेमाल करके, जियोस्पेशल पोज़ के साथ काम करना

एक्सआर की सुविधा वाले डिवाइस
इस गाइड की मदद से, इन तरह के एक्सआर डिवाइसों के लिए अनुभव बनाए जा सकते हैं.
एआई चश्मा

ARCore for Jetpack XR में Geospatial API की मदद से, आपका ऐप्लिकेशन Google Street View की कवरेज में आने वाले किसी भी इलाके में कॉन्टेंट को रिमोटली अटैच कर सकता है. साथ ही, दुनिया भर में एआर अनुभव क्रिएट कर सकता है. जियोस्पेशल एपीआई, डिवाइस के सेंसर और जीपीएस डेटा का इस्तेमाल करके, डिवाइस के आस-पास के माहौल का पता लगाता है. इसके बाद, उस माहौल के पहचाने जा सकने वाले हिस्सों को Google के विज़ुअल पोज़िशनिंग सिस्टम (वीपीएस) के ज़रिए उपलब्ध कराए गए लोकलाइज़ेशन मॉडल से मैच करता है. इससे, उपयोगकर्ता के डिवाइस की सटीक जगह की जानकारी का पता चलता है. एपीआई, उपयोगकर्ता के स्थानीय निर्देशांकों को वीपीएस से मिले भौगोलिक निर्देशांकों के साथ मर्ज करने का काम भी करता है, ताकि एक ही निर्देशांक सिस्टम में काम किया जा सके.

ARCore API चालू करना

अपने ऐप्लिकेशन में विज़ुअल पोज़िशनिंग सिस्टम (वीपीए) का इस्तेमाल करने से पहले, आपको नए या मौजूदा Google Cloud प्रोजेक्ट में ARCore API चालू करना होगा. यह सेवा, जियोस्पेशल ऐंकर को होस्ट करने, सेव करने, और ठीक करने के लिए ज़िम्मेदार होती है.

लाइब्रेरी की अन्य डिपेंडेंसी जोड़ना

Geospatial API का इस्तेमाल करने के लिए, कुछ और लाइब्रेरी डिपेंडेंसी की ज़रूरत होती है. अपने ऐप्लिकेशन की build.gradle.kts फ़ाइल में, इन्हें जोड़ें:

Groovy

dependencies {
  // ... Other required dependencies for the Jetpack XR SDK
  implementation "com.google.android.gms:play-services-location:21.3.0"
}

Kotlin

dependencies {
  // ... Other required dependencies for the Jetpack XR SDK
  implementation("com.google.android.gms:play-services-location:21.3.0")
}

ज़रूरी अनुमतियों का अनुरोध करना

ARCore में Geospatial API का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन को Jetpack XR के साथ इन रनटाइम अनुमतियों का अनुरोध करना होगा:

ऐप्लिकेशन की अनुमतियों की जानकारी देना

रनटाइम के दौरान इन अनुमतियों का अनुरोध करने से पहले, आपको अपने ऐप्लिकेशन के मेनिफ़ेस्ट में इनका एलान करना होगा:

<manifest ... >
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>

अनुमतियों का अनुरोध करना

ज़रूरी अनुमतियों के बारे में बताने के बाद, आपके ऐप्लिकेशन को उन्हें रनटाइम में ऐक्सेस करने का अनुरोध करना होगा. पक्का करें कि आपने यह बताया हो कि आपके ऐप्लिकेशन को अनुमतियों की ज़रूरत क्यों है.

Geospatial API तब तक काम नहीं कर सकता, जब तक वह उपयोगकर्ता की सटीक जगह की जानकारी का पता न लगा ले. इसलिए, रनटाइम के दौरान जगह की जानकारी की अनुमतियों का अनुरोध करने से जुड़े दिशा-निर्देशों का पालन करें, ताकि आपके ऐप्लिकेशन को ACCESS_FINE_LOCATION और ACCESS_COARSE_LOCATION, दोनों अनुमतियां मिल सकें.

किसी सेशन को ऐक्सेस करना

Jetpack XR Runtime Session के ज़रिए जियोस्पेशल जानकारी ऐक्सेस करें. आपके ऐप्लिकेशन को इसे बनाना होगा.

सेशन कॉन्फ़िगर करना

XR सेशन में, डिवाइस के पोज़ की जानकारी डिफ़ॉल्ट रूप से चालू नहीं होती है. अपने ऐप्लिकेशन को डिवाइस की पोज़िशन की जानकारी पाने की अनुमति देने के लिए, सेशन को कॉन्फ़िगर करें. साथ ही, GeospatialMode.VPS_AND_GPS और DeviceTrackingMode.LAST_KNOWN, दोनों मोड सेट करें:

// Define the configuration object to enable Geospatial features.
val newConfig = session.config.copy(
  // Set the GeospatialMode to VPS_AND_GPS.
  geospatial = Config.GeospatialMode.VPS_AND_GPS
  // Set the DeviceTrackingMode to LAST_KNOWN.
  deviceTracking = Config.DeviceTrackingMode.LAST_KNOWN
)

// Apply the configuration to the session.
try {
    when (val configResult = session.configure(newConfig)) {
        is SessionConfigureGooglePlayServicesLocationLibraryNotLinked -> {
            // This case generally indicates a missing library dependency.
        }
        is SessionConfigureSuccess -> {
            // The session is now configured to use the Geospatial API.
        }
        else -> {
            // Catch-all for other configuration errors returned using the result class.
        }
    }
} catch (e: UnsupportedOperationException) {
    // Handle configuration failure. For example, if the specific mode is not supported on the current device or API version.
}

GeospatialMode.VPS_AND_GPS मोड, डिवाइस की भू-स्थानिक पोज़िशन का सटीक पता लगाने के लिए, विज़ुअल पोज़िशनिंग सिस्टम (वीपीएस) और ग्लोबल पोज़िशनिंग सिस्टम (जीपीएस), दोनों के डेटा का इस्तेमाल करता है.

सभी XR डिवाइसों पर GeospatialMode.VPS_AND_GPS और DeviceTrackingMode.LAST_KNOWN मोड काम नहीं करते. अगर Session.configure() कमांड काम करती है, तो इसका मतलब है कि डिवाइस पर ये मोड काम करते हैं.

उपयोगकर्ता को डिवाइस के डेटा के इस्तेमाल की अनुमति देने के लिए प्रॉम्प्ट करना

Jetpack XR के लिए ARCore के साथ Geospatial API का इस्तेमाल करने वाले ऐप्लिकेशन को, उपयोगकर्ता को एक प्रॉम्प्ट दिखाना होगा. इसमें उपयोगकर्ता को अपने डिवाइस से मिले डेटा के इस्तेमाल की पुष्टि करनी होगी और इसकी अनुमति देनी होगी. ज़्यादा जानकारी के लिए, उपयोगकर्ता की निजता से जुड़ी ज़रूरी शर्तें देखें.

Geospatial ऑब्जेक्ट पाना

सेशन कॉन्फ़िगर करने के बाद, Geospatial ऑब्जेक्ट पाने के लिए, Geospatial.getInstance(session) का इस्तेमाल करें:

// Get the Geospatial instance
var geospatial = Geospatial.getInstance(session)

Geospatial ऑब्जेक्ट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब उसकी स्थिति State.RUNNING हो. Geospatial.state StateFlow<Geospatial.State> का इस्तेमाल करके, स्थिति पर नज़र रखी जा सकती है.

देखें कि वीपीएस उपलब्ध है या नहीं

जियोस्पेशल पोज़ का पता लगाने के लिए, Geospatial API, VPS और जीपीएस का इस्तेमाल करता है. इसलिए, इस एपीआई का इस्तेमाल तब तक किया जा सकता है, जब तक डिवाइस अपनी जगह की जानकारी का पता लगा सकता है. जिन जगहों पर जीपीएस सटीक तरीके से काम नहीं करता है वहां एपीआई, वीपीएस कवरेज पर निर्भर करता है. जैसे, घर के अंदर और घनी आबादी वाले शहरी इलाके. इससे, सटीक पोज़ जनरेट किए जा सकते हैं.

सामान्य स्थितियों में, वीपीएस से आपको पोज़िशन की सटीक जानकारी मिल सकती है. यह जानकारी करीब पांच मीटर के दायरे में होती है. साथ ही, रोटेशन की सटीक जानकारी पांच डिग्री के दायरे में होती है. निलंबित करने के फ़ंक्शन Geospatial.checkVpsAvailability(latitude, longitude) का इस्तेमाल करके, यह देखा जा सकता है कि किसी जगह पर वीपीएस कवरेज है या नहीं. यह कॉल एक एसिंक्रोनस ऑपरेशन है. इसके लिए, सेशन को GeospatialMode.VPS_AND_GPS मोड में कॉन्फ़िगर करने की ज़रूरत नहीं होती.

यहां दिए गए कोड में, किसी अक्षांश और देशांतर के लिए वीपीएस की उपलब्धता की जांच करने का तरीका बताया गया है:

// You can query the GPS to get the current device's location and check if it has VPS
val latitude = getLatitudeFromGPS()
val longitude = getLongitudeFromGPS()

// Must be called from a coroutine.
val result = geospatial.checkVpsAvailability(latitude, longitude)
if (result is VpsAvailabilityAvailable) {
  // VPS is available
} else if (result is VpsAvailabilityUnavailable) {
  // VPS is not available
}

आपका ऐप्लिकेशन, Google Cloud पर ARCore API के साथ कम्यूनिकेट करने के लिए सही तरीके से सेट अप किया गया हो. ऐसा न होने पर, आपके ऐप्लिकेशन को VpsAvailabilityNotAuthorized नतीजा मिलेगा.

डिवाइस की पोज़िशन को जियोस्पेशल पोज़िशन में बदलना

डिवाइस के पोज़ को जियोस्पेशल पोज़ में बदला जा सकता है, ताकि एआई चश्मे, जगह की जानकारी के हिसाब से डेटा जनरेट कर सकें और उससे इंटरैक्ट कर सकें. यह पाइपलाइन, डिवाइस की मौजूदा पोज़िशन और ओरिएंटेशन को उसके लोकल कोऑर्डिनेट सिस्टम (डिवाइस पोज़) से बदलकर, दुनिया भर में इस्तेमाल किए जाने वाले कोऑर्डिनेट में बदलती है.

इससे आपको ये काम करने में मदद मिल सकती है:

  • एआर (ऑगमेंटेड रिएलिटी) का ऐसा कॉन्टेंट बनाया जा सकता है जिसे लंबे समय तक इस्तेमाल किया जा सके. इसमें उपयोगकर्ता की ओर से रखे गए वर्चुअल ऑब्जेक्ट को किसी जगह पर सटीक तरीके से एंकर किया जाता है, ताकि उसे बाद में वापस लाया जा सके.
  • किसी जगह के हिसाब से अनुभव ट्रिगर करें. इसके लिए, मैप पर उपयोगकर्ता की जगह की जानकारी को लगातार अपडेट करें, ताकि रीयल-टाइम नेविगेशन या जियो-फ़ेंस किए गए गेमप्ले को चालू किया जा सके.
  • उपयोगकर्ता की जगह की सटीक जानकारी का पता लगाकर, जगह के हिसाब से ऐप्लिकेशन लॉजिक को ट्रिगर करना.

Geospatial.createGeospatialPoseFromPose() का इस्तेमाल करके, डिवाइस पोज़ को जियोस्पेशियल पोज़ में बदलने के लिए:

// Get the current device Pose from the AR Session's state
// This is the device's position and orientation relative to the AR tracking origin.
val devicePose = ArDevice.getInstance(session).state.value.devicePose

// Convert the device Pose into a GeospatialPose
when (val geospatialPoseResult = geospatial.createGeospatialPoseFromPose(devicePose)) {
    is CreateGeospatialPoseFromPoseSuccess -> {
        val currentGeospatialPose = geospatialPoseResult.pose
        val horizontalAccuracy = geospatialPoseResult.horizontalAccuracy
        // ... use pose and accuracy
     val latitude = currentGeospatialPose.latitude
     val longitude = currentGeospatialPose.longitude
    // The orientation is stored as a Quaternion in the EUS (East-Up-South) system. The EUS coordinate system has X+ pointing east, Y+ pointing up, and Z+ pointing south. True North is aligned with the -Z axis.
     val eusQuaternion = currentGeospatialPose.eastUpSouthQuaternion

    }
    is CreateGeospatialPoseFromPoseNotTracking -> {
        // Geospatial is not currently tracking
    }
}

जियोस्पेशल पोज़ को डिवाइस पोज़ में बदलना

जियोस्पेशल पोज़ को डिवाइस पोज़ में बदला जा सकता है. इससे एआई चश्मे पर, कॉन्टेक्स्ट के हिसाब से और जगह की जानकारी के आधार पर अनुभव देने में मदद मिलती है. इस ट्रांसफ़ॉर्मेशन में, असल दुनिया के कोऑर्डिनेट से तय की गई जानकारी का इस्तेमाल किया जाता है. जैसे, किसी लैंडमार्क की जगह, नेविगेशन का रास्ता या एआर कॉन्टेंट. इसके बाद, इसे उपयोगकर्ता के चश्मे के विज़ुअल स्पेस में बदल दिया जाता है.

Geospatial.createPoseFromGeospatialPose() का इस्तेमाल करके, जियोस्पेशियल पोज़ को डिवाइस पोज़ में बदलने के लिए:

when (val poseResult = geospatial.createPoseFromGeospatialPose(geospatialPose)) {
    is CreatePoseFromGeospatialPoseSuccess -> {
        val devicePose = poseResult.pose
    // devicePose is now ready to be used
    }
    is CreatePoseFromGeospatialPoseNotTracking -> {
        // Geospatial is not currently tracking
    }
}