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 내부에서 실행됩니다. 세션은 Unity에서 AR 기능의 주요 진입점입니다. 이는 물리적 카메라 및 센서에서 데이터 읽기, 실세계 분석, 가상 카메라 및 기타 오브젝트의 이동과 렌더링 구동 등을 포함하여 AR 시스템의 실행 프로세스와 상태를 관리합니다.

flowchart LR
  A((이미지<br>및 기타 데이터))
  B[Session]
  C([Camera])
  O([Origin])
  T([Target])
  A --> B
  B -. transform .-> C
  B -. transform .-> O
  B -. transform .-> T

[선택] Easyar 세션과 AR Foundation 세션

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

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

  B1[AR Foundation<br>AR Session]
  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와 동일한 효과를 달성하기 어렵습니다.

세션의 구성

일반적인 세션은 주로 다음 구성 요소로 이루어집니다:

  • 프레임 소스(frame source): 물리적 카메라 이미지와 센서 데이터를 제공하는 구성 요소로, 때때로 모션 트래킹 데이터도 함께 제공합니다. 예: CameraDeviceFrameSource, MotionTrackerFrameSource
  • 프레임 필터(frame filter(s)): 특정 AR 기능을 제공하는 구성 요소, 예: ImageTrackerFrameFilter
  • 카메라(camera): 장면 내의 가상 카메라 객체
  • 원점(origin): 모션 트래킹의 기준점 객체
참고

AR Foundation 개념에서는 모션 트래킹이 필수 기능으로 간주되며, 따라서 항상 원점(origin)을 제공합니다. EasyAR 시스템에서는 모션 트래킹이 선택적 기능이므로 원점(origin) 역시 선택사항입니다.

[선택] 세션의 데이터 플로우

데이터 플로우는 EasyAR Sense의 핵심 개념 중 하나입니다. Unity에서 AR 애플리케이션 개발에는 영향을 미치지 않습니다. 세션 작동 원리를 더 깊이 이해하고 싶다면 이 섹션을 읽어보시기 바랍니다.

Unity에서, 하나의 세션은 일반적으로 하나의 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

이 데이터 플로우는 세션 시작 과정에서 생성됩니다. 굵게 표시된 데이터 경로를 제외한 나머지 부분의 연결 여부는 시작 과정에서 활성화된 AR 컴포넌트에 따라 결정됩니다.

따라서, 세션에서 활성화된 컴포넌트를 수정함으로써 데이터 플로우의 구조와 기능을 유연하게 변경할 수 있으며, 여러 AR 기능을 동시에 활성화하는 것도 매우 간편합니다. 이 방법은 다음 단락에서 자세히 설명할 예정입니다.

Session의 플로우

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)
    어셈블 과정은 어셈블 옵션 설정에 따라 장면에서 적합한 컴포넌트를 선택하고 전체 작업 유닛으로 연결합니다. 이 과정은 일반적으로 시작 시 자동으로 완료되지만, 시작 전에 수동으로 어셈블 인터페이스를 호출하여 완료할 수도 있습니다. 어셈블 완료 후, 어셈블된 세션을 시작하여 어셈블 과정을 건너뛰어 시작 속도를 높일 수 있습니다.
    어셈블 과정은 AR 컴포넌트 및 입력 소스의 가용성을 판단하고, 후보 입력 중 가장 적합한 입력 소스를 선택하는 중요한 용도도 있습니다. 이 단계는 또한 현재 세션이 현재 장치에서 실행 가능한지 판단하는 데 사용될 수 있습니다.

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

    1. 첫 단계는 장치 지원 목록 업데이트를 시작하고 설정에 따라 고정 시간 대기 후 어셈블을 시작합니다. 첫 단계 대기 후 장치 지원 목록 업데이트가 완료되면 어셈블 과정은 종료됩니다.
    2. 그렇지 않으면 어셈블 과정은 두 번째 단계로 진행되며, 이 단계는 장치 지원 목록 업데이트 완료 후 실행됩니다. 이 단계에서 가용 frame source가 첫 단계의 없음에서 있음으로 변경되고, 세션이 첫 단계 이후 시작에 실패한 경우 세션 재시작을 시도합니다.

    첫 단계에서 장치 목록 업데이트 완료 여부와 관계없이, 세션은 첫 단계 완료 후 후속 단계를 계속 실행합니다.

  • 시작
    시작은 AR 기능 실행을 개시하는 과정입니다. 시작 전에는 AR 기능 컴포넌트가 어떤 데이터도 처리하지 않습니다. 정상적으로 시작된 후 세션은 장면의 일부 객체 이동을 제어하고, 일부 입력 소스 사용 시 물리적 카메라 이미지 렌더링을 제어합니다.

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

  • 중지
    중지는 AR 기능 실행을 종료합니다. 장면의 객체는 더 이상 세션에 의해 제어되지 않으며, 입력 소스 데이터도 처리되지 않습니다.

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

참고

모든 AR 기능은 ARSession.StartSession 이후에만 사용 가능합니다.

Session의 기본 생명주기

flowchart LR
  uload("BeforeSceneLoad")
  ustart("MonoBehaviour.Start")
  udestroy("MonoBehaviour.OnDestroy")
  oi{초기화<br>InitializeOnStartup}
  ostart{자동 시작<br>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은 다음 시점에 자동으로 실행됩니다:

Session 상태

ARSession.State는 세션의 상태를 설명합니다. 세션은 다음과 같은 상태를 가집니다:

상태 설명
None 초기 상태, 세션이 시작되거나 조립되지 않음
Broken 조립 실패 등의 이유로 세션이 파괴됨
Assembling 조립 중, 조립 과정은 일반적으로 몇 프레임 지속될 수 있음
Assembled 조립 성공적으로 완료되었으나 아직 시작되지 않음
Ready 세션 성공적으로 시작됨, 이 상태는 한 프레임 동안만 지속됨
Running 세션 실행 중
Paused 세션 실행 일시 정지됨

일반적으로 세션 상태는 시작 및 중지와 같은 인터페이스를 호출할 때 변경됩니다. 실행 중 심각한 오류가 발생하면 세션이 Broken 상태로 들어갈 수도 있습니다. Broken 상태에 진입한 세션은 실행을 재개할 수 없으며, 중지를 호출한 후 다시 시작해야 합니다.

세션의 상태를 통해 현재 세션이 사용 가능한 상태인지 파악할 수 있습니다. 대부분의 기능은 Ready 또는 Running 상태에서만 사용할 수 있습니다.

운동 추적 상태

ARSession.TrackingStatus는 세션의 모션 추적 상태를 설명합니다. 이는 장치 모션 추적의 품질을 나타내며, 다음과 같은 상태가 있습니다:

상태 설명
Optional<MotionTrackingStatus>.Empty 모션 추적 기능이 활성화되지 않았거나 세션이 실행 중이 아닙니다
NotTracking 모션 추적 결과를 사용할 수 없습니다. 초기화 중이거나, 추적이 손실되었거나, 재위치 지정 중인 경우일 수 있습니다
Limited 모션 추적은 유효하지만 결과가 좋지 않습니다. 현재 영역의 텍스처가 너무 약하거나 움직임이 너무 빠른 경우일 수 있습니다
Tracking 모션 추적 품질이 양호합니다
참고

AR Foundation의 개념에서는 모션 추적이 필수 기능으로 간주되므로, 그 추적 상태는 세션 상태와 통합되었습니다.
반면 EasyAR 시스템에서는 모션 추적이 선택적 기능이므로, 추적 상태는 독립적으로 존재하며 비어 있을 수 있습니다.

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

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

TargetController.IsTracked를 이용해 추적 대상이 추적 상태인지 확인하거나, TargetController.TargetFound 및 TargetController.TargetLost 이벤트를 활용해 추적 상태가 변경될 때 애플리케이션 콘텐츠 로직을 조정할 수 있습니다.

다음 단계

만들기

실행 제어

컴포넌트 및 결과 접근

컴포넌트 참조