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)를 사용하기 전에 먼저 ARCore API를 신규 또는 기존 Google Cloud 프로젝트에서 사용 설정해야 합니다. 이 서비스는 Geospatial 앵커를 호스팅, 저장, 확인하는 역할을 합니다.

추가 라이브러리 종속 항목 추가

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 = Config(
    // Set the GeospatialMode to VPS_AND_GPS.
    geospatial = GeospatialMode.VPS_AND_GPS,
    // Set the DeviceTrackingMode to LAST_KNOWN.
    deviceTracking = DeviceTrackingMode.LAST_KNOWN
)
// Apply the configuration to the session.
try {
    when (val configResult = session.configure(newConfig)) {
        is SessionConfigureSuccess -> {
            // The session is now configured to use the Geospatial API.
        }
        else -> {
            // Handle other configuration errors (e.g., missing library dependencies).
        }
    }
} catch (e: UnsupportedOperationException) {
    // Handle configuration failure if the mode is not supported.
}

GeospatialMode.VPS_AND_GPS 모드는 VPS(Visual Positioning System)GPS (Global Positioning System) 데이터를 모두 활용하여 기기의 지리 공간적 위치를 정확하게 파악합니다.

모든 XR 기기가 GeospatialMode.VPS_AND_GPSDeviceTrackingMode.LAST_KNOWN 모드를 지원하는 것은 아닙니다. Session.configure()가 성공하면 기기에서 이러한 모드를 지원합니다.

사용자에게 기기 데이터 사용 허용 메시지 표시

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

Geospatial 객체 가져오기

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

// Get the Geospatial instance for the current session.
val 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.
val latitude = 37.422
val longitude = -122.084

// Use the geospatial instance to check VPS availability for a specific location.
val result = geospatial.checkVpsAvailability(latitude, longitude)
when (result) {
    is VpsAvailabilityAvailable -> {
        // VPS is available at this location.
    }
    is VpsAvailabilityErrorInternal -> {
        // VPS availability check failed with an internal error.
    }
    is VpsAvailabilityNetworkError -> {
        // VPS availability check failed due to a network error.
    }
    is VpsAvailabilityNotAuthorized -> {
        // VPS availability check failed due to an authorization error.
    }
    is VpsAvailabilityResourceExhausted -> {
        // VPS availability check failed due to resource exhaustion.
    }
    is VpsAvailabilityUnavailable -> {
        // VPS is not available at this location.
    }
}

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

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

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

이렇게 하면 다음을 수행할 수 있습니다.

  • 사용자가 배치한 가상 객체가 나중에 검색할 수 있도록 전역 위치에 정확하게 고정되는 영구 AR 콘텐츠를 작성합니다.
  • 지도의 사용자 위치를 지속적으로 업데이트하여 실시간 내비게이션 또는 지오펜스 게임플레이를 지원함으로써 위치 기반 환경을 트리거합니다.
  • 위치 관련 애플리케이션 로직을 트리거하기 위해 사용자의 정확한 실제 컨텍스트를 파악합니다.

기기 포즈를 지리 공간적 포즈로 변환하려면 Geospatial.createGeospatialPoseFromPose()를 사용하세요.

// Get the current device Pose from the AR Session's state.
val devicePose = ArDevice.getInstance(session).state.value.devicePose

// Convert the device Pose into a GeospatialPose.
when (val result = geospatial.createGeospatialPoseFromPose(devicePose)) {
    is CreateGeospatialPoseFromPoseSuccess -> {
        val geoPose = result.pose
        val lat = geoPose.latitude
        val lon = geoPose.longitude
        val alt = geoPose.altitude
        // Orientation is in the EUS (East-Up-South) coordinate system.
        val orientation = geoPose.eastUpSouthQuaternion
    }
    is CreateGeospatialPoseFromPoseNotTracking -> {
        // Geospatial is not currently tracking.
    }
}

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

지리 공간적 포즈를 기기 포즈로 변환하여 AI 안경에서 컨텍스트 기반의 위치 인식 환경을 제공할 수 있습니다. 이 변환은 랜드마크의 위치, 내비게이션 경로 또는 영구 AR 콘텐츠와 같은 실제 좌표로 정의된 정보를 가져와서 사용자 안경의 정확한 시각적 공간으로 변환합니다.

`Geospatial.createPoseFromGeospatialPose()`를 사용하여 지리 공간적 포즈를 기기 포즈로 변환하려면 다음 단계를 따르세요.Geospatial.createPoseFromGeospatialPose()

// Convert a GeospatialPose (lat/long/alt) back to a device-space Pose.
when (val result = geospatial.createPoseFromGeospatialPose(geoPose)) {
    is CreatePoseFromGeospatialPoseSuccess -> {
        val devicePose: Pose = result.pose
        // devicePose is now ready to be used relative to the tracking origin.
    }
    is CreatePoseFromGeospatialPoseNotTracking -> {
        // Geospatial is not currently tracking.
    }
}