Table of Contents

Unity AR의 진입점 - AR Session

AR 세션(session)은 모든 AR 기능의 진입점이며, 아래 내용을 통해 AR Session의 기본 개념, 구성, 실행 흐름, 그리고 Unity AR Foundation의 AR Session과의 관계를 살펴볼 수 있습니다. 또한 Unity에서 EasyAR Sense의 데이터 흐름이 어떻게 동작하는지도 알 수 있습니다.

AR Session이란

물체 추적 같은 모든 AR 흐름은 네이티브 라이브러리, 즉 EasyAR Sense 내부에서 실행됩니다. session은 Unity에서 AR 기능으로 들어가는 주요 진입점입니다. 이 컴포넌트는 물리 카메라와 센서에서 데이터를 읽고, 실제 세계를 분석하며, 씬 안의 가상 카메라와 다른 물체들의 이동과 렌더링을 제어하는 등 AR 시스템의 실행 과정과 상태를 관리합니다.

flowchart LR
  A((이미지<br>및 기타 데이터))
  B[세션]
  C([카메라])
  O([원점])
  T([타깃])
  A --> B
  B -. transform .-> C
  B -. transform .-> O
  B -. transform .-> T

[선택 사항] EasyAR의 session과 AR Foundation의 session

EasyAR의 session은 Unity에서 EasyAR를 사용할 때의 핵심 컴포넌트로, 어떤 서드파티나 시스템 AR 기능과도 독립적으로 동작할 수 있습니다. 반면 AR Foundation의 session은 Unity XR 프레임워크의 일부로, ARKit이나 ARCore 같은 Unity XR 플러그인이 제공하는 기능만 사용할 수 있습니다.

flowchart TD
  A1[EasyAR<br>AR 세션]
  A2[EasyAR Sense]
  A1 --> A2

  B1[AR Foundation<br>AR 세션]
  B2[ARKit Plugin]
  B3[ARCore Plugin]
  B1 --> B2
  B1 --> B3

EasyAR를 사용할 때는 보통 AR Foundation을 함께 설치하거나 사용할 필요가 없습니다. 예를 들어 이미지 추적 기능, 모션 추적 기능 등은 EasyAR Sense가 독립적으로 제공합니다.

일부 경우에는 AR Foundation이 제공하는 추가 기능(예: 일부 장치의 평면 검출)과 인터페이스를 활용하기 위해 EasyAR Sense와 AR Foundation을 함께 사용할 수 있습니다. 이 경우 EasyAR Sense는 AR Foundation이 제공하는 인터페이스를 통해 Unity 엔진과 상호작용합니다.

하지만 EasyAR는 시스템 AR보다 더 많은 기능과 더 폭넓은 장치 지원을 제공하므로, AR Foundation만 단독으로 사용할 경우 보통 EasyAR와 같은 결과를 얻기는 어렵습니다.

세션의 구성

일반적인 session은 다음 부분으로 구성됩니다.

  • frame source: 물리 카메라 이미지와 센서 데이터를 제공하는 컴포넌트입니다. 때로는 이 컴포넌트가 모션 추적 데이터도 제공합니다. 예: CameraDeviceFrameSource, MotionTrackerFrameSource
  • frame filter(s): ImageTrackerFrameFilter 같은 특정 AR 기능을 제공하는 컴포넌트입니다.
  • camera: 씬의 가상 카메라 오브젝트입니다.
  • origin: 모션 추적의 원점 오브젝트입니다.
참고

AR Foundation의 개념에서는 모션 추적이 필수 기능으로 간주되므로 항상 origin을 제공합니다.
반면 EasyAR 시스템에서는 모션 추적이 선택 기능이므로 origin도 선택 사항입니다.

[선택 사항] session의 데이터 흐름

데이터 흐름은 EasyAR Sense의 핵심 개념 중 하나입니다. Unity에서 AR 애플리케이션을 개발하는 데에는 직접적인 영향을 주지 않습니다. 이 절은 session의 동작 방식을 더 깊이 이해하고 싶은 분들을 위한 내용입니다.

Unity에서 하나의 session은 보통 하나의 EasyAR Sense 데이터 흐름을 의미합니다.

flowchart LR
  S[Frame Source]
  R[Input Frame Recorder<br>Video Input Frame Recorder]
  ift[iFrameThrottler]
  iff[iFrameFork]
  i2f[i2FAdapter]
  fb[fbFrameFork]  
  i2o[i2OAdapter]

  FOT[Object Tracker]
  FIT[Image Tracker]
  FMT[Mega Tracker]
  FSSM[Sparse Spatial Map]
  FST[Surface Tracker]
  FDS[Dense Spatial Map]
  FCR[Cloud Recognizer]
  
  ofj[oFrameJoin]
  off[oFrameFork]
  ofb[oFrameBuffer]

  O(( ))
  ODS(( ))
  OCR(( ))

  S ==> R ==> ift ==> iff
  iff --> i2f
  i2f --> fb
  fb -.-> FOT -.-> ofj
  fb -.-> FIT -.-> ofj
  iff ==> i2o ==> ofj ==> off ==> ofb ==> O
  iff -.-> FMT -.-> ofj
  iff -.-> FSSM -.-> ofj
  iff -.-> FST -.-> ofj
  iff -.-> FDS -.-> ODS
  iff -.-> FCR -.-> OCR
  off --> i2f
  ofb --> ift

이 데이터 흐름은 session 시작 과정에서 만들어집니다. 굵게 표시된 데이터 경로를 제외한 나머지 연결은 시작 과정에서 활성화한 AR 컴포넌트에 따라 달라집니다.

따라서 session에서 활성화한 컴포넌트를 바꾸면 데이터 흐름의 구조와 기능을 유연하게 바꿀 수 있고, 여러 AR 기능을 동시에 쉽게 활성화할 수도 있습니다. 이 방법은 다음 절에서 자세히 설명합니다.

세션의 흐름

flowchart LR
  i[초기화<br>Initialize]
  a[어셈블<br>Assemble]
  starta["시작(어셈블 완료)<br>StartSession(Assembled)"]
  start[시작<br>StartSession]
  update((업데이트<br>update))
  stop[중지<br>StopSession]
  di[역초기화<br>Deinitialize]

  i --> a --> starta --> update --> stop --> di
  i --> start --> update

  • 초기화
    초기화는 라이선스 키를 사용해 EasyAR Sense를 시작하는 과정입니다. 초기화 전에는 EasyAR Sense 인터페이스의 아주 일부만 사용할 수 있습니다. 초기화가 끝나야 AR 기능이 활성화됩니다.

  • 어셈블(Assembling)
    어셈블 과정은 어셈블 옵션 설정에 따라 씬에서 적절한 컴포넌트를 선택하고, 그것들을 하나의 통합된 작업 단위로 연결합니다. 이 과정은 보통 시작 시 자동으로 완료되지만, 시작 전에 수동으로 어셈블 인터페이스를 호출해 수행할 수도 있습니다. 어셈블이 끝나면 이미 어셈블된 session을 시작해 어셈블 단계를 건너뛸 수 있어 시작 속도를 높일 수 있습니다.
    어셈블 과정의 또 다른 중요한 용도는 AR 컴포넌트와 입력 소스의 사용 가능 여부를 판단하고, 후보 입력 중 가장 적합한 입력 소스를 선택하는 것입니다. 이 단계는 현재 session이 현재 장치에서 실행될 수 있는지 판단하는 데도 사용할 수 있습니다.

    어셈블 과정은 두 단계로 나뉩니다.

    1. 첫 번째 단계에서는 장치 지원 목록 갱신을 시작하고, 설정에 따라 일정 시간 기다린 뒤 어셈블을 시작합니다. 첫 번째 단계의 대기 중에 장치 지원 목록 갱신이 이미 끝났다면 어셈블 과정은 종료됩니다.
    2. 그렇지 않으면 어셈블 과정은 두 번째 단계로 들어가며, 이 단계는 장치 지원 목록 갱신이 끝난 뒤 실행됩니다. 이 단계에서는 첫 번째 단계에서 사용할 수 있는 frame source가 없던 상태에서 사용할 수 있는 frame source가 생겼고, 첫 번째 단계 이후 session 시작이 실패했다면 session 재시작을 시도합니다.

    첫 번째 단계에서 장치 목록 갱신이 끝났는지 여부와 관계없이, session은 첫 번째 단계가 끝난 뒤 후속 단계를 계속 실행합니다.

  • 시작
    시작은 AR 기능 실행을 시작하는 과정입니다. 시작 전에는 AR 기능 컴포넌트가 어떤 데이터도 처리하지 않습니다. 정상적으로 시작된 뒤에는 session이 씬 안의 일부 오브젝트 이동을 제어하고, 일부 입력 소스를 사용할 때는 물리 카메라 이미지 렌더링도 제어합니다.

  • 업데이트
    업데이트 과정은 Unity 렌더링 루프의 매 프레임마다 실행됩니다. 이 과정은 현재 사용 중인 AR 기능의 실행 결과에 따라 프레임마다 가상 카메라(일부 입력 소스), 원점, 그리고 추적 타깃의 transform을 수정합니다. 장치마다 업데이트가 실행되는 시점은 다르지만, 렌더링 전에 반드시 실행됩니다.

  • 중지
    중지는 AR 기능 실행을 종료하며, 씬의 오브젝트는 더 이상 session의 제어를 받지 않고 입력 소스 데이터도 더 이상 처리되지 않습니다.

  • 역초기화
    역초기화는 일부 전역 리소스를 해제합니다(동적 라이브러리는 언로드하지 않습니다). 역초기화 후에는 AR 기능 컴포넌트를 사용할 수 없습니다.

참고

모든 AR 기능은 ARSession.StartSession 이후에만 사용할 수 있습니다.

세션의 기본 수명주기

flowchart LR
  uload("BeforeSceneLoad")
  ustart("MonoBehaviour.Start")
  udestroy("MonoBehaviour.OnDestroy")
  oi{Initialize<br>OnStartup}
  ostart{AutoStart}
  i[초기화<br>Initialize]
  start[시작<br>StartSession]
  update((업데이트<br>update))
  stop[중지<br>StopSession]
  
  uload -.-> ustart -.-> udestroy
  uload --> oi -. true .-> i
  ustart --> ostart -. true .-> start
  udestroy --> stop
  i --> start --> update --> stop

session의 수명주기는 보통 인터페이스 호출 시점에 의해 결정됩니다. 기본 설정을 사용하면 session은 다음 시점에 자동으로 실행됩니다.

세션 상태

ARSession.State는 session의 상태를 설명합니다. session에는 다음 상태가 있습니다.

상태 설명
None 초기 상태, session이 시작되거나 어셈블되지 않음
Broken 어셈블 실패 같은 이유로 session이 손상됨
Assembling 어셈블 과정 중이며, 보통 몇 프레임 동안 지속될 수 있음
Assembled 어셈블에 성공했지만 아직 시작되지 않음
Ready session이 성공적으로 시작되었으며, 이 상태는 한 프레임만 지속됨
Running session이 실행 중임
Paused session이 일시 정지됨

보통 session 상태는 시작과 중지 같은 인터페이스를 호출할 때 바뀝니다. 실행 중 심각한 오류가 발생하면 session이 Broken 상태로 들어갈 수도 있습니다. Broken 상태가 된 session은 복구할 수 없으며, 반드시 중지한 뒤 다시 시작해야 합니다.

현재 session이 사용 가능한 상태인지 여부는 session 상태로 확인할 수 있습니다. 대부분의 기능은 Ready 또는 Running 상태에서만 사용할 수 있습니다.

모션 추적 상태

ARSession.TrackingStatus는 session의 모션 추적 상태를 설명하며, 디바이스 모션 추적의 품질을 나타냅니다. 상태는 다음과 같습니다.

상태 설명
Optional<MotionTrackingStatus>.Empty 모션 추적 기능이 활성화되지 않았거나 session이 실행 중이 아님
NotTracking 초기화 중, 추적 손실, 또는 재현지화 중일 수 있어 모션 추적 결과를 사용할 수 없음
Limited 모션 추적은 유효하지만 결과가 좋지 않음. 현재 영역의 텍스처가 약하거나 움직임이 너무 빠른 경우일 수 있음
Tracking 모션 추적 품질이 좋음
참고

AR Foundation의 개념에서는 모션 추적이 필수 기능이므로, 추적 상태가 session 상태와 합쳐져 있습니다.
반면 EasyAR 시스템에서는 모션 추적이 선택 기능이므로, 추적 상태는 독립적으로 존재하며 비어 있을 수도 있습니다.

다른 AR 기능의 추적 상태는 어디에 있나요

AR 기능은 여러 대상을 동시에 추적할 수 있으므로, 이미지 추적 상태와 다른 AR 기능의 추적 상태는 session 안에 있지 않고 추적 대상 컴포넌트 안에 있습니다.

TargetController.IsTracked를 사용해 추적 대상이 추적 상태인지 확인할 수 있고, TargetController.TargetFoundTargetController.TargetLost 이벤트를 사용해 추적 상태가 바뀔 때 애플리케이션 콘텐츠 로직을 조정할 수 있습니다.

후속 단계

생성

실행 제어

컴포넌트와 결과 접근

컴포넌트 참고