Jetpack XR용 ARCore를 사용하여 지리정보 포즈 작업

해당 XR 기기
이 안내는 이러한 유형의 XR 기기용 환경을 구축하는 데 도움이 됩니다.
AI 글래스

Jetpack XR용 ARCore의 Geospatial API를 사용하면 앱에서 Google 스트리트 뷰가 적용되는 모든 영역에 콘텐츠를 원격으로 연결하고 전 세계적으로 AR 환경을 만들 수 있습니다. Geospatial API는 기기 센서와 GPS 데이터를 사용하여 기기의 환경을 감지한 다음, 인식 가능한 환경 부분을 Google의 VPS (Visual Positioning System)에서 제공하는 현지화 모델과 일치시켜 사용자 기기의 정확한 위치를 파악합니다. 또한 API는 사용자의 로컬 좌표를 VPS의 지리적 좌표와 병합하여 단일 좌표 시스템 내에서 작업할 수 있도록 합니다.

ARCore API 사용 설정

앱에서 VPS (Visual Positioning System)를 사용하려면 먼저 신규 또는 기존 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")
}

필수 권한 요청

Jetpack XR을 사용하여 ARCore에서 Geospatial API를 사용하려면 앱에서 다음 런타임 권한을 요청해야 합니다.

앱 권한 선언

런타임에 이러한 권한을 요청하려면 앱의 매니페스트에서 선언해야 합니다.

<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_LOCATIONACCESS_COARSE_LOCATION 권한이 모두 부여될 수 있도록 런타임에 위치 정보 액세스 권한을 요청하는 안내를 따르세요.

세션 액세스

앱에서 생성해야 하는 Jetpack XR 런타임 Session을 통해 지리 공간 정보에 액세스합니다.

세션 구성

기기 포즈 정보는 XR 세션에서 기본적으로 사용 설정되지 않습니다. 앱이 기기 포즈 정보를 가져올 수 있도록 세션을 구성하고 GeospatialMode.VPS_AND_GPSDeviceTrackingMode.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_GPSDeviceTrackingMode.LAST_KNOWN 모드를 지원하지 않습니다. Session.configure()이 성공하면 기기는 이러한 모드를 지원합니다.

사용자에게 기기 데이터 사용을 허용하라는 메시지 표시

Jetpack XR용 ARCore와 함께 Geospatial API를 사용하는 앱은 사용자에게 기기의 데이터 사용을 승인하고 허용하라는 메시지를 표시해야 합니다. 자세한 내용은 사용자 개인 정보 보호 요구사항을 참고하세요.

지리 공간 객체 가져오기

세션이 구성되면 Geospatial.getInstance(session)를 사용하여 Geospatial 객체를 가져옵니다.

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

Geospatial 객체는 상태가 State.RUNNING인 경우에만 사용해야 합니다. Geospatial.state StateFlow<Geospatial.State>를 사용하여 상태를 모니터링할 수 있습니다.

VPS 사용 가능 여부 확인

Geospatial API는 VPS와 GPS를 조합하여 공간 자세를 결정하므로 기기에서 위치를 결정할 수 있는 한 API를 사용할 수 있습니다. 실내 공간, 밀집된 도시 환경 등 GPS 정확도가 낮은 지역에서 API는 VPS 범위를 활용하여 정확도가 높은 포즈를 생성합니다.

일반적인 조건에서 VPS는 약 5미터의 위치 정확도와 5도의 회전 정확도를 제공합니다. 정지 함수 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
}

앱이 Google Cloud의 ARCore API와 통신하도록 올바르게 설정되어야 합니다. 그렇지 않으면 앱이 VpsAvailabilityNotAuthorized 결과를 수신합니다.

기기 포즈를 지리 공간적 포즈로 변환

기기 포즈를 지리 공간 포즈로 변환하여 AI 글래스가 위치 인식 데이터를 생성하고 상호작용할 수 있습니다. 이 파이프라인은 기기의 현재 위치와 방향을 로컬 좌표 시스템 (기기 포즈)에서 전 세계적으로 인식되는 좌표로 변환합니다.

이렇게 하면 다음과 같은 작업에 도움이 됩니다.

  • 사용자가 배치한 가상 객체가 나중에 검색할 수 있도록 전역 위치에 정확하게 고정되는 영구 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
    }
}

지리 공간적 포즈를 기기 포즈로 변환

지리 공간 자세를 기기 자세로 변환하여 AI 안경에서 상황에 맞는 위치 인식 환경을 제공할 수 있습니다. 이 변환은 랜드마크, 탐색 경로, 지속적인 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
    }
}