با استفاده از API مکانی در ARCore برای Jetpack XR، برنامه شما میتواند از راه دور محتوا را به هر منطقهای که توسط Google Street View پوشش داده میشود، ضمیمه کند و تجربیات AR را در مقیاس جهانی ایجاد کند. API مکانی از حسگر دستگاه و دادههای GPS برای تشخیص محیط دستگاه استفاده میکند، سپس بخشهای قابل تشخیص آن محیط را با یک مدل محلیسازی ارائه شده توسط سیستم موقعیتیابی بصری (VPS) گوگل مطابقت میدهد تا مکان دقیق دستگاه کاربر را تعیین کند. این API همچنین مختصات محلی کاربر را با مختصات جغرافیایی VPS ادغام میکند تا بتوانید در یک سیستم مختصات واحد کار کنید.
فعال کردن API ARCore
قبل از استفاده از سیستم موقعیتیابی بصری (VPS) در برنامه خود، ابتدا باید API ARCore را در یک پروژه جدید یا موجود Google Cloud فعال کنید. این سرویس مسئول میزبانی، ذخیرهسازی و حل لنگرهای مکانی است.
وابستگیهای کتابخانهای بیشتری اضافه کنید
استفاده از Geospatial API به برخی وابستگیهای کتابخانهای اضافی نیاز دارد. این موارد را به فایل build.gradle.kts برنامه خود اضافه کنید:
گرووی
dependencies { // ... Other required dependencies for the Jetpack XR SDK implementation "com.google.android.gms:play-services-location:21.3.0" }
کاتلین
dependencies { // ... Other required dependencies for the Jetpack XR SDK implementation("com.google.android.gms:play-services-location:21.3.0") }
درخواست مجوزهای مورد نیاز
برای استفاده از API مکانی در ARCore با Jetpack XR، برنامه شما باید مجوزهای زمان اجرا زیر را درخواست کند:
-
ACCESS_INTERNET: برای تماس با سرویس ابری ARCore Geospatial API مورد نیاز است. -
ACCESS_COARSE_LOCATION: برای تعیین موقعیت تقریبی کاربر مورد نیاز است. -
ACCESS_FINE_LOCATION: برای تعیین موقعیت مکانی دقیق کاربر مورد نیاز است.
مجوزهای برنامه را اعلام کنید
قبل از اینکه بتوانید این مجوزها را در زمان اجرا درخواست کنید، باید آنها را در مانیفست برنامه خود اعلام کنید :
<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>
درخواست مجوز
پس از اعلام مجوزهای مورد نیاز، برنامه شما باید در زمان اجرا آنها را درخواست کند . حتماً توضیح دهید که چرا برنامه شما به این مجوزها نیاز دارد .
API مربوط به موقعیت مکانی نمیتواند کار کند مگر اینکه بتواند موقعیت مکانی دقیق کاربر را تعیین کند. به همین دلیل، برای درخواست مجوزهای موقعیت مکانی در زمان اجرا، دستورالعملهای مربوط به آن را دنبال کنید تا برنامه شما بتواند مجوزهای ACCESS_FINE_LOCATION و ACCESS_COARSE_LOCATION را دریافت کند.
دسترسی به یک جلسه
از طریق یک Session زمان اجرای Jetpack XR که برنامه شما باید ایجاد کند ، به اطلاعات مکانی دسترسی پیدا کنید.
پیکربندی جلسه
اطلاعات موقعیت دستگاه به طور پیشفرض در جلسات 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 از دادههای سیستم موقعیتیابی بصری (VPS) و سیستم موقعیتیابی جهانی (GPS) برای تعیین دقیق موقعیت مکانی دستگاه استفاده میکند.
همه دستگاههای XR از حالتهای GeospatialMode.VPS_AND_GPS و DeviceTrackingMode.LAST_KNOWN پشتیبانی نمیکنند. اگر Session.configure() با موفقیت اجرا شود، دستگاه از این حالتها پشتیبانی میکند.
از کاربر بخواهید اجازه استفاده از دادههای دستگاه را بدهد
برنامههایی که از API جغرافیایی با ARCore برای Jetpack XR استفاده میکنند، باید به کاربر پیامی برای تأیید و اجازه استفاده از دادههای دستگاهش نشان دهند. برای اطلاعات بیشتر به الزامات حریم خصوصی کاربر مراجعه کنید.
شیء جغرافیایی را بدست آورید
پس از پیکربندی جلسه، شیء Geospatial را با استفاده از Geospatial.getInstance(session) دریافت کنید:
// Get the Geospatial instance
var geospatial = Geospatial.getInstance(session)
شیء Geospatial فقط باید زمانی استفاده شود که وضعیت آن State.RUNNING باشد. میتوانید وضعیت را با استفاده از Geospatial.state StateFlow<Geospatial.State> رصد کنید.
بررسی در دسترس بودن VPS
از آنجا که API جغرافیایی از ترکیبی از VPS و GPS برای تعیین موقعیت جغرافیایی استفاده میکند، تا زمانی که دستگاه قادر به تعیین موقعیت مکانی خود باشد، میتوان از API استفاده کرد. در مناطقی با دقت پایین GPS، مانند فضاهای داخلی و محیطهای شهری متراکم، API برای تولید موقعیتهای با دقت بالا به پوشش VPS متکی است.
در شرایط معمول، میتوانید انتظار داشته باشید که VPS دقت موقعیتی تقریباً ۵ متر و دقت چرخشی ۵ درجه را ارائه دهد. میتوانید با استفاده از تابع تعلیق Geospatial.checkVpsAvailability(latitude, longitude) بررسی کنید که آیا یک مکان پوشش VPS دارد یا خیر. این فراخوانی یک عملیات ناهمزمان است و نیازی به پیکربندی جلسه با حالت GeospatialMode.VPS_AND_GPS ندارد.
کد زیر نحوه بررسی در دسترس بودن VPS را از یک طول و عرض جغرافیایی مشخص نشان میدهد:
// 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
}
برنامه شما باید به درستی تنظیم شود تا با API ARCore در Google Cloud ارتباط برقرار کند ؛ در غیر این صورت، برنامه شما نتیجه VpsAvailabilityNotAuthorized را دریافت خواهد کرد.
تبدیل حالت دستگاه به حالت مکانی
شما میتوانید حالت دستگاه را به حالت جغرافیایی تبدیل کنید تا عینکهای هوش مصنوعی بتوانند با آن تعامل داشته باشند و دادههای آگاه از مکان تولید کنند. این خط لوله، موقعیت و جهت فعلی دستگاه را در سیستم مختصات محلی آن (حالت دستگاه) به مختصات شناخته شده جهانی تبدیل میکند.
این میتواند به شما کمک کند:
- محتوای AR پایدار را ایجاد کنید، که در آن شیء مجازی قرار داده شده توسط کاربر به طور دقیق در یک مکان جهانی برای بازیابی بعدی لنگر انداخته میشود.
- با بهروزرسانی مداوم موقعیت کاربر روی نقشه، تجربیات مبتنی بر مکان را فعال کنید تا ناوبری در لحظه یا گیمپلی با محدودیت جغرافیایی امکانپذیر شود.
- زمینه دقیق دنیای واقعی کاربر را برای راهاندازی منطق برنامه مرتبط با مکان تعیین کنید.
برای تبدیل حالت دستگاه به حالت مکانی با استفاده از 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
}
}
تبدیل موقعیت مکانی به موقعیت دستگاه
شما میتوانید یک ژست مکانی را به یک ژست دستگاه تبدیل کنید تا به ارائه تجربیات مبتنی بر موقعیت مکانی و مبتنی بر موقعیت مکانی در عینکهای هوش مصنوعی کمک کنید. این تبدیل، اطلاعات تعریفشده توسط مختصات دنیای واقعی - مانند موقعیت یک نقطه عطف، یک مسیر ناوبری یا محتوای AR پایدار - را دریافت کرده و آن را به فضای بصری دقیق عینک کاربر تبدیل میکند.
برای تبدیل یک موقعیت مکانی به موقعیت دستگاه با استفاده از 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
}
}