[ARKit] Managing Session Life Cycle and Tracking Quality

니냐뇨·2023년 3월 30일
0

ARKit 탐구

목록 보기
1/2
post-thumbnail

Overview

World-traking AR 세션은 시각-관성 오도메트리(visual-inertial odometry)라는 기술을 사용합니다.

이 과정은 모션 센서 데이터와 카메라 영상의 컴퓨터 비전 분석을 결합하여, 기기의 실제 세계 공간에서의 위치와 방향, 즉 포즈(pose)를 추적합니다.(ARCamera transform property로 표현 됨).
최상의 결과를 얻으려면, world tracking은 일관된 sensor 데이터와 시각적 복잡도 또는 인식 가능한 특징이 있는 카메라 이미지가 필요합니다.

세션을 시작할 때, ARKit이 기기 pose를 정확하게 모델링하기 위해 충분한 데이터를 수집하는 데 시간이 소요됩니다. 세션 도중에는 world-tracking 품질에 영향을 미치는 조건이 변경될 수 있습니다. 이러한 변경 사항을 따르려면, ARSessionObserver 델리게이트 메서드와 ARCamera 속성을 사용하십시오.

Basic Lifecycle of an AR Session

AR session을 시작할 때, tracking state는 아래와 같이 변합니다.

새로운 세션을 시작한 직후에는, 주어진 프레임에 대한 tracking state는 ARCamera.TrackingState.notAvailable가 됩니다. 이것은 ARKit이 기기의 pose를 추정하기 위한 충분한 정보가 수집하지 못했다는 것을 나타냅니다.

몇 프레임이 지나면, tracking state는 ARCamera.TrackingState.limited(_:)로 바뀌게 됩니다. 이것은 device의 포즈는 이용가능하지만 정확도는 불확실하다는 것입니다.
Limited state는 항상 tracking quality가 감소한 이유를 포함하고, 이 경우에는 세션이 아직 ARCamera.TrackingState.Reason.initializing인 것 입니다.

시간이 조금 지나면, tracking state는 기기의 포즈가 정확하고 모든 ARKit feature들이 이용가능한 상태임을 나타내는 ARCamera.TrackingState.normal로 바뀌게 됩니다.

Provide Feedback for Tracking Quality Changes

아래의 그림은 user interaction이나 환경의 변화로 인해 발생 할 수 있는 tracking state의 변화를 나타냅니다.

tracking quality가 ARCamera.TrackingState.limited(_:)일 때,
ARKit을 통해 사용자의 로컬 환경을 매핑하는 기능을 사용할 수 없습니다:

  • 평면 인식의 경우, plane anchor들이 추가되거나 업데이트 되지 않습니다.
  • Hit-testing 메소드의 결과값이 제공되지 않습니다.

세션은 언제든 ARCamera.TrackingState.limited(_:) 상태가 될 수 있습니다.
예를 들어, 유저가 기기를 빈 벽에 대고 가리키거나, 방 안의 불이 꺼지면 ARCamera.TrackingState.Reason.insufficientFeatures로 인해 tracking 품질이 감소할 수 있습니다.

연관된 ARCamera.TrackingState.Reason 값을 이용하여 유저가 상황을 해결하여 tracking state가 ARCamera.TrackingState.normal로 돌아갈 수 있도록 합니다.

Recover from Session Interruptions

ARKit은 ARSession을 실행하지 않고서는 device pose를 찾을 수 없습니다.
기본적으로, 세션이 중단되면(예: 다른 앱으로 전환), 해당 세션에 있는 가상 콘텐츠는 real-world와 비교하여 대개 잘못된 위치로 배치됩니다.

relocalization을 통해 중단 상태에서 발생한 문제들을 복구 할 수도 있습니다. sessionShouldAttemptRelocalization(_:) 메소드에서 true 값을 반환한다면, ARKit은 중단 이전의 사용자 환경에 대한 정보와 현재 카메라 및 센서 데이터를 조화시키려고 시도합니다.
이 과정 동안, tracking state는 ARCamera.TrackingState.limited(_:)가 됩니다(그 이유는 ARCamera.TrackingState.Reason.relocalizing).
만약 성공한다면, 잠시 후에 추적 상태는 ARCamera.TrackingState.normal로 돌아갑니다.

relocalization이 성공하기 위해서는, 기기를 세션이 중단되었을 때와 유사한 위치나 방향으로 돌려놔야 합니다. 이 조건이 영원히 발생하지 않는다면(예: 기기가 완전히 다른 환경으로 옮겨졌을 경우), 세션은 ARCamera.TrackingState.Reason.relocalizing state에 무한히 남아있게 됩니다.

중요
앱이 ARCamera.TrackingState.Reason.relocalizing state에 있을 때, relocalization이 성공하지 않는 경우를 대비하여 유저에게 세션을 초기화(run(_:options:)resetTracking를 이용)하는 방법을 제공해주세요.

Create a Persistent AR Experience

iOS 12.0 이상에서 ARWorldMap 클래스는 ARKit이 세션을 재개하는 데 사용하는 정보를 저장합니다. world map을 파일로 저장함으로써, 앱이 다시 시작되더라도 이전 세션에서 재개하거나 잠시 동안의 중단 상태에서 복구하기 위한 것과 동일한 relocalization 프로세스를 사용할 수 있습니다. World map에는 앵커(anchor)도 포함되므로, 가상 콘텐츠를 해당 앵커에 배치하여 이전 세션과 일치시킬 수도 있습니다.

중요
세션을 재개하는 데 필요한 ARWorldMap의 정확도는 real-world 환경과 크게 연관이 있습니다.

예)
쉬운 경우: 비슷한 인공 조명 아래에서 기록된 실내 map이나 바로 전에 캡처된 map에 대한 relocalize.
어려운 경우: 조명 조건이나 지역 환경의 특징이 시간이 지남에 따라 변경 됨.

User가 앱을 나갔다 돌아왔을 때도 동일한 AR 세션을 경험할 수 있도록 하려면, world map을 user 행동으로 명시적으로 저장하거나, applicationDidEnterBackground(_:)에 자동으로 저장할 수 있습니다.
world map은 AR 세션이 저장할 가치 있는 상태에 있을 때만 저장하세요.
예)
사용자가 가상 객체를 배치하고 그 위치를 기억하고자 하는 경우
session이 ARFrame.WorldMappingStatus.mapped 상태에 있는 경우
세션 도중에 적어도 한 번이라도 ARFrame.WorldMappingStatus.mapped상태였던 경우

저장된 world map으로 relocalize하려면, 세션을 실행할 때 initialWorldMap 속성을 사용하면 됩니다.
중단된 상태에서 재개하는 경우와 마찬가지로, 세션의 tracking state는 ARCamera.TrackingState.limited(_:)(ARCamera.TrackingState.Reason.relocalizing)로 시작됩니다.
ARKit이 world map을 현재 환경에 맞출 수 있다면, tracking state는 잠시 후 ARCamera.TrackingState.normal이 되어 세션이 저장된 world map와 일치함을 나타냅니다.

Tip
Relocalization이 성공하려면 기기가 map을 생성하기 전에 지나쳤던 로컬 환경의 area를 방문해야 합니다.
User가 이 작업을 수행하는 것을 돕기 위해, relocalize를 시도할 때 world map과 함께 스크린샷을 저장하고 이 스크린샷을 placement 가이드로 표시할 수 있습니다.

세션은 world map에서 저장된 모든 앵커를 포함하는 world map으로부터 재개 됩니다. 앵커에 배치해뒀던 가상 객체의 식별을 위해 이름을 붙인 뒤, name 속성을 이용하여 앵커를 참조하면, 해당 가상 콘텐츠를 다시 만들 수 있습니다.
이러한 콘텐츠가 올바르게 배치되도록 하려면, 세션의 tracking state가 ARCamera.TrackingState.normal로 변경된 후에만 가상 객체를 표시하십시오.

ARKit가 기록된 world map과 현재 환경을 조화시키지 못할 경우(예: 기기가 world map을 기록한 장소와 전혀 다른 장소에 있는 경우), 세션은 ARCamera.TrackingState.Reason.relocalizing상태에 영구적으로 유지됩니다.
사용자가 세션을 재개할 수 없는 경우, 세션을 다시 시작할 수 있는 방법을 제공해야합니다. World map relocalization을 포기하려면, resetTracking 옵션과 initialWorldMap이 nil인 configuration을 사용하여 세션의 run(_:options:)을 다시 호출하십시오.


출처: 애플 공식 문서 - Managing Session Life Cycle and Tracking Quality

profile
열심히 살자.

0개의 댓글