AR data flow
이 문서는 EasyAR Sense 의 data flow 를 소개합니다. EasyAR Sense 는 컴포넌트화된 API 를 사용하며, 컴포넌트 사이를 data flow 로 연결합니다.
Input 및 output data

InputFrame: input frame. image, camera parameters, timestamp, world coordinate system 에 대한 camera transform, tracking status 를 포함합니다. 이 중 camera parameters, timestamp, world coordinate system 에 대한 camera transform, tracking status 는 optional 이지만, 특정 algorithm components 는 input 에 대한 특정 요구 사항이 있습니다.
OutputFrame: output frame. input frame 과 synchronous processing components 의 output results 를 포함합니다.
FeedbackFrame: feedback frame. 하나의 input frame 과 하나의 historical output frame 을 포함하며, ImageTracker 같은 feedback-style synchronous processing components 에 사용됩니다.
Camera components
CameraDevice: Windows, Mac, iOS, Android 의 default camera.
ARKitCameraDevice: iOS 의 ARKit default implementation.
ARCoreCameraDevice: Android 의 ARCore default implementation.
MotionTrackerCameraDevice: motion tracking 을 구현하고 multi-sensor fusion 으로 디바이스의 6DoF coordinates 를 계산합니다. (Android 만 지원)
ThreeDofCameraDevice: default camera 에 3DoF orientation 을 추가합니다.
InertialCameraDevice: default camera 에 3DoF orientation 과 inertial estimation 기반 plane translation 을 추가합니다.
custom camera device: custom camera 구현.
Algorithm components
Feedback-style synchronous processing component: 각 camera image frame 마다 result 를 출력해야 하며, 상호 간섭을 피하기 위해 이전 frame 의 processing result 가 필요합니다.
ImageTracker: 평면 이미지의 감지 및 추적을 구현합니다.
ObjectTracker: 3D 객체의 감지 및 추적을 구현합니다.
동기 처리 컴포넌트: 각 프레임마다 카메라 이미지를 따라 결과를 출력해야 합니다.
SurfaceTracker: 환경 표면 추적을 구현합니다.
SparseSpatialMap: sparse spatial map을 구현하여 물리 공간을 스캔하면서 point cloud map을 생성하고 실시간 로컬라이제이션을 수행하는 기능을 제공합니다.
MegaTracker: Mega 공간 로컬라이제이션을 구현합니다.
비동기 처리 컴포넌트: 각 프레임마다 카메라 이미지를 따라 결과를 출력할 필요가 없습니다.
CloudRecognizer: cloud recognition을 구현합니다.
DenseSpatialMap: dense spatial map을 구현하며, collision 및 occlusion과 같은 효과를 구현하는 데 사용할 수 있습니다.
컴포넌트 availability 확인
모든 컴포넌트에는 isAvailable 함수가 있으며, 해당 컴포넌트를 사용할 수 있는지 판단하는 데 사용할 수 있습니다.
컴포넌트를 사용할 수 없는 경우는 다음과 같습니다.
현재 operating system 에 구현되어 있지 않습니다.
컴포넌트에 필요한 dependencies 가 없습니다. 예: ARKit, ARCore.
현재 version(variant)에 컴포넌트가 없습니다. 예를 들어 일부 경량 버전에는 특정 기능이 없습니다.
현재 License 에서 컴포넌트를 사용할 수 없습니다.
컴포넌트를 사용하기 전에 반드시 사용 가능 여부를 판단하고, 해당 fallback 또는 prompt 를 수행하십시오.
Data flow
컴포넌트 연결 방식은 아래 그림과 같습니다.

input 이 feedback frame 인 특수한 사용 방식이 있으며, 아래 그림과 같습니다.

Data flow helper classes
data flow 의 송신 및 수신 port 입니다. 각 컴포넌트는 이 port 들을 포함해야 합니다.
SignalSink / SignalSource: 데이터가 없는 신호를 수신/송신합니다.
InputFrameSink / InputFrameSource: InputFrame을 수신/송신합니다.
OutputFrameSink / OutputFrameSource: OutputFrame을 수신/송신합니다.
FeedbackFrameSink / FeedbackFrameSource: FeedbackFrame을 수신/송신합니다.
data flow의 분기와 병합
InputFrameFork: 하나의 InputFrame을 여러 병렬 출력으로 나눕니다.
OutputFrameFork: 하나의 OutputFrame을 여러 병렬 출력으로 나눕니다.
OutputFrameJoin: 여러 OutputFrame을 하나로 병합하고 모든 결과를 Results에 병합합니다. 여러 입력 연결은 데이터가 유입되는 동안 연결해서는 안 됩니다. 그렇지 않으면 출력을 생성할 수 없는 상태에 빠질 수 있습니다. Camera 시작 전에 data flow 연결을 완료하는 것이 좋습니다.
FeedbackFrameFork: 하나의 FeedbackFrame을 여러 병렬 출력으로 나눕니다.
data flow의 throttling 및 캐싱
InputFrameThrottler: InputFrame을 수신하고 송신하지만 한 번에 하나만 송신합니다. 트리거 신호를 받은 후에만 다음 InputFrame을 송신합니다. 여러 InputFrame을 수신하면 이후 InputFrame이 이전 InputFrame을 덮어쓸 수 있습니다.
OutputFrameBuffer: OutputFrame을 수신하여 캐싱하고 사용자 polling을 기다리며, OutputFrame을 수신할 때 신호를 보낼 수 있습니다.
OutputFrameBuffer가 보낸 신호를 InputFrameThrottler에 연결하면 전체 throttling 과정이 완료됩니다.
data flow의 변환
InputFrameToOutputFrameAdapter: InputFrame을 직접 OutputFrame으로 래핑하여 렌더링 표시에 사용할 수 있습니다.
InputFrameToFeedbackFrameAdapter: InputFrame과 FeedbackFrame을 FeedbackFrame으로 래핑하여 feedback 방식 동기 처리 컴포넌트에 사용할 수 있습니다.
InputFrame 수 제한
CameraDevice 는 bufferCapacity 를 설정할 수 있으며, 이는 출력하는 InputFrame 의 최대 수입니다. 현재 default 값은 8 입니다.
custom camera 는 BufferPool 을 사용하여 구현할 수 있습니다.
각 컴포넌트가 필요로 하는 InputFrame 수는 각 컴포넌트의 API documentation 을 참고하십시오.
InputFrame 수가 부족하면 data flow 가 막혀 rendering 이 멈출 수 있습니다.
InputFrame 수가 부족하면 첫 startup 에서는 rendering 이 멈추지 않지만 background 로 전환하거나 각 컴포넌트를 pause/start 한 뒤 rendering 이 멈추는 상황도 발생할 수 있습니다. 테스트 시 이 상황을 반드시 포함하십시오.
연결 및 연결 해제
data flow 실행 중에는 connect 및 disconnect 를 권장하지 않습니다.
runtime 중 connect 또는 disconnect 가 필요한 경우, cut edge(이 edge 를 제거하면 data flow 가 두 부분으로 나뉘는 edge)에서만 수행할 수 있다는 점에 유의하십시오. cycle 의 edge(여기서 cycle 은 data flow 를 undirected graph 로 볼 때 edge 로 구성되는 cycle), OutputFrameJoin 의 input 또는 InputFrameThrottler 의 sideInput 에서는 수행할 수 없습니다. 그렇지 않으면 data flow 가 OutputFrameJoin 및 InputFrameThrottler 같은 nodes 에서 막혀 output 할 수 없는 상태가 될 수 있습니다.
모든 algorithm components 에는 start/stop 기능이 있습니다. stop 상태에서는 frames 가 처리되지 않지만, 결과가 없는 상태로 컴포넌트에서 계속 출력됩니다.
일반적인 사용법
다음은 단일 ImageTracker 의 사용법으로, 반복되지 않는 planar image targets 를 인식하고 tracking 하는 데 사용할 수 있습니다.
![]()
다음은 단일 ImageTracker 의 사용법으로, 반복되는 planar image targets 를 인식하고 tracking 하는 데 사용할 수 있습니다.
![]()
다음은 SparseSpatialMap 의 사용법으로, sparse spatial map building, localization, tracking 구현에 사용할 수 있습니다.

다음은 SparseSpatialMap 과 DenseSpatialMap 을 동시에 사용하는 방법으로, sparse spatial map building, localization, tracking 및 dense spatial map generation 구현에 사용할 수 있습니다.
