Table of Contents

AR 数据流

本文介绍了 EasyAR Sense 中的数据流。EasyAR Sense 中使用组件化 API,组件之间通过数据流来连接。

输入输出数据

fundamentals dataflow input output

InputFrame:输入帧。包含图像、camera 参数、时间戳、相机相对于世界坐标系的变换和跟踪状态。其中,camera 参数、时间戳、相机相对于世界坐标系的变换和跟踪状态均为可选,但特定的算法组件会对输入有特定的要求。

OutputFrame:输出帧。包含输入帧和同步处理组件的输出结果。

FeedbackFrame:反馈帧。包含一个输入帧和一个历史输出帧,用于 ImageTracker 等反馈式同步处理组件。

Camera组件

CameraDevice:Windows、Mac、iOS、Android 上的默认摄像头。

ARKitCameraDevice:iOS 上的 ARKit 默认实现。

ARCoreCameraDevice:Android 上的 ARCore 默认实现。

MotionTrackerCameraDevice:实现运动跟踪,通过多传感器融合解算设备的 6DoF 坐标。(只支持 Android )

ThreeDofCameraDevice:在默认摄像头的基础上,增加了 3DoF 的方向。

InertialCameraDevice:在默认摄像头的基础上,增加了 3DoF 的方向和平面的基于惯性估计的平移。

custom camera device:自定义摄像头实现。

算法组件

反馈式同步处理组件:需要每帧跟着摄像机图像输出结果,并且需要上一帧处理结果用于避免相互干扰。

同步处理组件:需要每帧跟着摄像机图像输出结果。

  • SurfaceTracker:实现了对环境表面的跟踪。

  • SparseSpatialMap:实现了稀疏空间地图,提供了扫描物理空间同时生成点云地图并进行实时定位的能力。

  • MegaTracker:实现了 Mega 空间定位。

异步处理组件:不需要每帧跟着摄像机图像输出结果。

组件的可用性检查

所有的组件均有 isAvailable 函数,可用于判断该组件是否可用。

组件不可用的情况有

  • 当前操作系统上没有实现。

  • 组件所需要的依赖不存在,例如 ARKit、ARCore。

  • 组件在当前版本(variant)上不存在,例如一些精简版本中某些功能不存在。

  • 组件在当前 License 下不可用。

使用组件之前务必要判断组件是否可用,并进行相应的 fallback 或者提示。

数据流

组件的连接方式如下图所示。

fundamentals dataflow

有一种特殊的输入为反馈式帧的用法,如下图所示。

fundamentals dataflow feedback

数据流辅助类

数据流的发出和接收端口,各组件需要包含这些端口

数据流的分支和合并

数据流的限流和缓存

数据流的转换

InputFrame数量的限制

CameraDevice 可以设置 bufferCapacity,即发出 InputFrame 的最大数量,当前的默认值为8。

自定义摄像头可以使用 BufferPool 实现。

各组件需要的 InputFrame 数量,参考各组件的 API 文档。

如果 InputFrame 数量不足,可能造成数据流卡住,导致渲染卡住。

如果 InputFrame 数量不足,也可能出现第一次启动渲染不卡住但切换到后台或暂停/启动各组件后渲染卡住的情况,测试时需要注意覆盖。

连接和断开连接

不推荐在数据流运行过程中连接和断开连接。

如果需要在运行过程中进行连接和断开连接,需要注意只能在割边(去掉这条边后数据流会一分为二)上进行,不能在环的边(这里的环指的是将数据流看作无向图时边构成的环)上、 OutputFrameJoin 的输入或者 InputFrameThrottler 的 sideInput 上进行,否则可能会陷入数据流卡在 OutputFrameJoinInputFrameThrottler 等结点无法输出的状态。

算法组件均有 start/stop 功能,在 stop 的时候,帧将不会被处理,但仍然会从组件中输出,只是不带有结果。

典型用法

以下为单个 ImageTracker 的用法,可用于识别、跟踪不重复的平面识别图。

fundamentals dataflow single ImageTracker

以下为单个 ImageTracker 的用法,可用于识别、跟踪重复的平面识别图。

fundamentals dataflow multiple ImageTracker

以下为 SparseSpatialMap 的用法,可用于实现稀疏空间地图建图和定位、跟踪。

fundamentals dataflow SparseSpatialMap

以下为 SparseSpatialMapDenseSpatialMap 同时使用的用法,可用于实现稀疏空间地图建图、定位、跟踪和稠密空间地图生成。

fundamentals dataflow Sparse-DenseSpatialMap