Ar 데이터 플로우
이 문서는 EasyAR Sense의 데이터 플로우를 소개합니다. EasyAR Sense는 컴포넌트화된 API를 사용하며, 컴포넌트 간에는 데이터 플로우를 통해 연결됩니다.
입력 및 출력 데이터

InputFrame: 입력 프레임. 이미지, 카메라 파라미터, 타임스탬프, 세계 좌표계에 대한 카메라의 변환 및 추적 상태를 포함합니다. 카메라 파라미터, 타임스탬프, 변환 및 추적 상태는 선택적이지만, 특정 알고리즘 컴포넌트는 입력에 특정 요구사항을 가질 수 있습니다.
OutputFrame: 출력 프레임. 입력 프레임과 동기 처리 컴포넌트의 출력 결과를 포함합니다.
FeedbackFrame: 피드백 프레임. 입력 프레임과 이력 출력 프레임을 포함하며, ImageTracker와 같은 피드백식 동기 처리 컴포넌트에 사용됩니다.
카메라 컴포넌트
CameraDevice: Windows, Mac, iOS, Android의 기본 카메라.
ARKitCameraDevice: iOS의 ARKit 기본 구현체.
ARCoreCameraDevice: Android의 ARCore 기본 구현체.
MotionTrackerCameraDevice: 모션 추적을 구현하며, 다중 센서 퓨전을 통해 장치의 6DoF 좌표를 계산합니다. (Android만 지원)
ThreeDofCameraDevice: 기본 카메라에 3DoF 방향을 추가합니다.
InertialCameraDevice: 기본 카메라에 3DoF 방향 및 관성 추정 기반 평면 이동을 추가합니다.
custom camera device: 사용자 정의 카메라 구현체.
알고리즘 컴포넌트
피드백식 동기 처리 컴포넌트: 매 프레임 카메라 이미지와 함께 결과를 출력해야 하며, 상호 간섭을 피하기 위해 이전 프레임 처리 결과가 필요합니다.
- ImageTracker: 평면 이미지의 감지 및 추적을 구현합니다.
- ObjectTracker: 3D 물체의 감지 및 추적을 구현합니다.
동기 처리 컴포넌트: 매 프레임 카메라 이미지와 함께 결과를 출력해야 합니다.
- SurfaceTracker: 환경 표면의 추적을 구현합니다.
- SparseSpatialMap: 희소 공간 맵을 구현하며, 물리적 공간을 스캔하면서 포인트 클라우드 맵을 생성하고 실시간 위치 추정 기능을 제공합니다.
- MegaTracker: Mega 공간 위치 추적을 구현합니다.
비동기 처리 컴포넌트: 매 프레임 카메라 이미지와 함께 결과를 출력할 필요가 없습니다.
- CloudRecognizer: 클라우드 인식을 구현합니다.
- DenseSpatialMap: 밀집 공간 맵을 구현하며, 충돌, 오클루전 등의 효과를 구현하는 데 사용할 수 있습니다.
컴포넌트 가용성 확인
모든 컴포넌트에는 isAvailable 함수가 있으며, 해당 컴포넌트의 사용 가능 여부를 판단하는 데 사용할 수 있습니다.
컴포넌트를 사용할 수 없는 경우:
현재 운영 체제에서 구현되지 않음.
컴포넌트에 필요한 종속성(예: ARKit, ARCore)이 존재하지 않음.
현재 버전(variant)에 컴포넌트가 존재하지 않음(예: 일부 경량 버전에서는 특정 기능 누락).
현재 라이선스에서 컴포넌트 사용 불가.
컴포넌트 사용 전 반드시 가용성을 확인하고, 적절한 대체(fallback) 또는 안내를 제공해야 합니다.
데이터 플로우
컴포넌트의 연결 방식은 아래 그림과 같습니다.

피드백 프레임을 입력으로 사용하는 특별한 방식은 아래 그림과 같습니다.

데이터 플로우 헬퍼 클래스
데이터 플로우의 송신 및 수신 포트. 각 컴포넌트는 이러한 포트를 포함해야 합니다.
SignalSink / SignalSource:신호(데이터 없음)를 수신/발생합니다.
InputFrameSink / InputFrameSource:InputFrame을 수신/발생합니다.
OutputFrameSink / OutputFrameSource:OutputFrame을 수신/발생합니다.
FeedbackFrameSink / FeedbackFrameSource:FeedbackFrame을 수신/발생합니다.
데이터 흐름의 분기와 병합
InputFrameFork:하나의 InputFrame을 여러 개로 나누어 병렬로 발생시킵니다.
OutputFrameFork:하나의 OutputFrame을 여러 개로 나누어 병렬로 발생시킵니다.
OutputFrameJoin:여러 개의 OutputFrame을 하나로 병합하고, 모든 결과를 Results에 합칩니다. 다중 입력 연결은 데이터가 유입되는 동시에 수행되어서는 안 되며, 그렇지 않으면 출력 불가 상태에 빠질 수 있습니다. (카메라 시작 전에 데이터 흐름 연결을 완료하는 것을 권장합니다.)
FeedbackFrameFork:하나의 FeedbackFrame을 여러 개로 나누어 병렬로 발생시킵니다.
데이터 흐름의 제한(throttling)과 버퍼링
InputFrameThrottler:InputFrame을 수신하고 발생시키지만, 한 번에 하나만 발생시킵니다. 트리거 신호를 수신한 후에야 다음 InputFrame을 발생시킵니다. 여러 InputFrame이 수신되면 후속 InputFrame이 선행 InputFrame을 덮어쓸 수 있습니다.
OutputFrameBuffer:OutputFrame을 수신하여 버퍼링하고, 사용자 폴링을 기다립니다. OutputFrame을 수신할 때 신호를 발생시킬 수 있습니다.
OutputFrameBuffer에서 발생한 신호를 InputFrameThrottler에 연결하면 전체 제한(throttling) 과정이 완료됩니다.
데이터 흐름의 변환
InputFrameToOutputFrameAdapter:InputFrame을 직접 OutputFrame으로 래핑하여 렌더링 및 표시에 사용할 수 있습니다.
InputFrameToFeedbackFrameAdapter:하나의 InputFrame과 하나의 FeedbackFrame을 FeedbackFrame으로 래핑하여 피드백 방식의 동기화 처리 컴포넌트에 사용할 수 있습니다.
InputFrame 수 제한
CameraDevice는 bufferCapacity를 설정할 수 있으며, 이는 발행 가능한 InputFrame의 최대 수입니다. 현재 기본값은 8입니다.
사용자 정의 카메라는 BufferPool을 사용하여 구현할 수 있습니다.
각 컴포넌트가 필요한 InputFrame 수는 해당 컴포넌트의 API 문서를 참조하십시오.
InputFrame 수가 부족하면 데이터 플로우가 정체되어 렌더링이 멈출 수 있습니다.
InputFrame 수가 부족하면 초기 렌더링은 정상이지만 백그라운드 전환 또는 컴포넌트 일시 중지/재개 후 렌더링이 멈추는 경우가 있을 수 있으므로, 테스트 시 이를 고려해야 합니다.
연결 및 연결 해제
데이터 플로우 실행 중 연결 및 해제는 권장되지 않습니다.
실행 중 연결/해제가 필요한 경우, 절단선(해당 연결을 제거하면 데이터 플로우가 분리됨)에서만 수행해야 합니다. 루프(데이터 플로우를 무방향 그래프로 볼 때 형성되는 순환)의 연결선, OutputFrameJoin의 입력 또는 InputFrameThrottler의 sideInput에서는 수행할 수 없습니다. 그렇지 않으면 OutputFrameJoin 및 InputFrameThrottler 등에서 데이터 플로우가 정체되어 출력되지 않을 수 있습니다.
알고리즘 컴포넌트에는 start/stop 기능이 있습니다. stop 시 프레임은 처리되지 않지만 결과 없이 컴포넌트를 통해 계속 출력됩니다.
일반적인 사용법
다음은 단일 ImageTracker 사용법으로, 비반복 평면 인식 이미지의 식별 및 추적에 사용할 수 있습니다.
![]()
다음은 단일 ImageTracker 사용법으로, 반복 가능한 평면 인식 이미지의 식별 및 추적에 사용할 수 있습니다.
![]()
다음은 SparseSpatialMap 사용법으로, 희소 공간 맵 구축, 위치 인식 및 추적을 구현하는 데 사용할 수 있습니다.

다음은 SparseSpatialMap과 DenseSpatialMap을 동시에 사용하는 방법으로, 희소 공간 맵 구축/위치 인식/추적 및 조밀 공간 맵 생성을 구현하는 데 사용할 수 있습니다.
