用 AR Engine 的数据做空间建模?AREngine_ARSession 是关键

前面几篇文章讲的空间建模,都是用 PushFrame 手动构造 DataFrame 来喂数据。但在实际开发中,你大概率不会这么做——因为 AR Engine 已经帮你把相机追踪、姿态估计这些脏活累活干完了。你只需要把 AR Engine 的数据"喂"给空间建模系统就行。

这篇文章就来聊聊 AR Engine 的 ARSession 和空间建模是怎么配合的。

AREngine_ARSession 是什么

AREngine_ARSession 是华为 AR Engine 中 AR 会话的结构体。不过它是一个不透明句柄(opaque handle),也就是说你不能直接访问它的内部字段,只能通过 AR Engine 提供的 API 来操作它。

typedef struct AREngine_ARSession AREngine_ARSession;

你可以把它理解为 AR Engine 的"控制中心"。通过它,你可以配置 AR 追踪的类型(SLAM、人脸、人体等)、获取每一帧的 AR 数据、管理 AR 锚点等等。

为什么用 AR Engine 而不是自己搞

空间建模需要两个关键信息:相机图像和相机姿态。相机图像好说,直接从摄像头获取就行。但相机姿态(相机在 3D 空间中的位置和朝向)就麻烦了——你需要实现 SLAM 算法来做实时追踪。

AR Engine 已经把这些都做好了。它会:

  • 实时追踪相机在空间中的位置和旋转
  • 检测平面、特征点等环境信息
  • 处理光照估计、遮挡等高级功能

你不需要自己实现这些,直接用 AR Engine 的输出就行。这就是为什么空间建模的 C API 里专门提供了 PushARFrame 这个函数——它是为 AR Engine 的数据量身定做的。

PushARFrame:把 AR 帧推进空间建模

HMS_SpatialReconStatus HMS_SpatialRecon_PushARFrame(
    HMS_SpatialRecon_Session *spatialReconSession,
    AREngine_ARSession* arSession,
    AREngine_ARFrame *arFrame
);

这个函数接收三个参数:

  • spatialReconSession:空间建模的会话句柄,通过 HMS_SpatialRecon_CreateSession 创建
  • arSession:AR Engine 的会话句柄,告诉空间建模系统这个 AR 帧是从哪个 AR 会话来的
  • arFrame:一帧 AR 数据,包含相机图像、追踪状态、锚点等信息

和 PushFrame 一样,PushARFrame 也必须在 StartSession 之前调用。一旦启动了重建,就不能再推帧了。

ARSession 和空间建模的配合流程

下面是 ARSession 与空间建模的配合流程:

正常

丢失

创建 ARSession 配置追踪模式

创建空间建模 Session

进入帧更新循环

从 ARSession 获取当前帧 ARFrame

检查追踪状态是否正常

调用 PushARFrame 推入空间建模

跳过本帧等待恢复

继续下一帧

用户扫描完成?

启动空间建模 StartSession

等待建模完成

保存建模结果

一个典型的使用流程是这样的:

  1. 创建 AR Engine 的 ARSession,配置追踪模式
  2. 创建空间建模的 Session
  3. 在每一帧的更新循环中:
    a. 从 ARSession 获取当前帧的 ARFrame
    b. 把 ARFrame 通过 PushARFrame 推入空间建模 Session
  4. 用户扫描完成后,启动空间建模
  5. 等待建模完成,保存结果

这里面的关键是第 3 步——你需要在 AR Engine 的帧循环中同步推帧。AR Engine 每一帧都会更新追踪状态和相机姿态,你需要把这些实时数据喂给空间建模系统。

ARSession 在空间建模中的角色

你可能会问:PushARFrame 为什么要同时传 arSession 和 arFrame?只传 arFrame 不够吗?

这是因为空间建模系统需要知道这个 AR 帧来自哪个 AR 会话。不同的 AR 会话可能有不同的配置(比如追踪模式、更新频率等),空间建模系统需要根据这些信息来正确处理帧数据。

打个比方,arSession 就像一个"翻译官"——空间建模系统通过它来理解 AR 帧数据的含义。没有这个翻译官,空间建模系统虽然能拿到数据,但不知道这些数据是在什么条件下采集的。

和 PushFrame 对比

两种推帧方式各有优劣:

PushFrame(手动构造 DataFrame)

  • 灵活,你可以完全控制每一帧的数据
  • 适合非 AR 场景,比如从视频文件或者离线数据中重建
  • 需要自己处理相机标定和姿态估计

PushARFrame(AR Engine 帧)

  • 方便,AR Engine 已经帮你处理好了所有数据
  • 适合实时扫描场景,用户拿着手机边走边扫
  • 数据质量有保障,AR Engine 的追踪精度比较高

大多数情况下,如果你做的是一个实时空间扫描 APP,用 PushARFrame 就对了。只有在特殊场景(比如从已有的视频文件重建 3D 模型)才需要手动构造 DataFrame。

ARSession 的生命周期管理

两个会话的生命周期管理顺序很重要:

创建阶段

先创建 ARSession

再创建空间建模 Session

运行阶段:两个会话同时运行

ARSession 每帧采集数据

PushARFrame 同步推帧到空间建模

销毁阶段

先销毁空间建模 Session

再销毁 ARSession

ARSession 和空间建模 Session 是两个独立的会话,它们有各自的生命周期,但需要配合使用。

创建时机:先创建 ARSession,再创建空间建模 Session。因为空间建模 Session 创建时可能需要检查设备能力,而 ARSession 的初始化过程中会用到一些系统资源(比如摄像头),这些资源的初始化状态可能影响检查结果。

运行期间:两个会话同时运行。ARSession 负责每一帧的追踪和数据采集,空间建模 Session 负责接收和处理这些数据。你需要在 ARSession 的帧更新回调中调用 PushARFrame,把数据同步推给空间建模。

销毁时机:先销毁空间建模 Session,再销毁 ARSession。因为空间建模 Session 可能还需要最后一帧数据来完成处理,如果 ARSession 先被销毁了,最后一帧就丢了。

这个顺序很重要——创建时 ARSession 先,销毁时 ARSession 后。你可以把 ARSession 想象成"供应商",空间建模 Session 想象成"加工厂"。供应商要先准备好,工厂才能开工;工厂要先收完货,供应商才能关门。

ARSession 配置对建模的影响

虽然 ARSession 的配置是通过 AR Engine 自己的 API 完成的,但这些配置会直接影响空间建模的效果。

追踪模式:AR Engine 支持多种追踪模式,对于空间建模来说,你需要用 SLAM(即时定位与地图构建)模式。SLAM 模式会同时追踪相机位置和构建环境地图,这正是空间建模需要的。

相机分辨率:分辨率越高,图像细节越丰富,建模效果越好,但处理速度会变慢。你需要在质量和性能之间找一个平衡点。一般来说,1080p 的分辨率就够用了。

更新频率:AR Engine 的帧率决定了你每秒能推多少帧数据。帧率太低会导致帧间重叠不够,建模出现空洞;帧率太高会推入太多相似的帧,浪费计算资源。30fps 是一个比较合理的值。

这些配置不需要你专门为空间建模去做——如果你的 APP 同时还有 AR 功能(比如在扫描结果上叠加虚拟物体),这些配置本来就要设好。空间建模只是"顺便"用了一下 AR Engine 的数据。

一个需要注意的地方

使用 PushARFrame 的时候,确保 ARSession 的追踪状态是正常的。如果 AR Engine 的追踪丢失了(比如相机被完全遮挡、光线太暗等),推入的帧数据可能不准确,会影响建模质量。

你可以在推帧之前检查 ARFrame 的追踪状态,如果状态不好就跳过这一帧,等追踪恢复了再继续推。这样可以提高建模的质量和稳定性。

另外,还有一种情况需要注意:如果用户在扫描过程中手机发热严重,系统可能会降低 ARSession 的帧率来降温。这时候你需要在 UI 上给用户一些提示,比如"设备温度较高,扫描速度可能变慢"。虽然这不是空间建模 API 的问题,但会影响用户体验。

总结

AREngine_ARSession 在空间建模中扮演的是"数据源"的角色。它不是空间建模的一部分,而是 AR Engine 的一部分。空间建模系统通过 PushARFrame 函数来接收 AR Engine 产生的数据。

如果你要做一个实时空间扫描 APP,最省事的方式就是:AR Engine 负责追踪和采集,空间建模负责 3D 重建,两者通过 PushARFrame 这个桥梁连接起来。你不需要关心底层的 SLAM 算法和相机标定,只需要把两个系统对接好就行。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐