鸿蒙开发-空间建模和AR怎么配合?ARSession联动详解
摘要: 本文探讨了华为AR Engine的ARSession与空间建模系统的协同工作方式。ARSession作为AR Engine的核心组件,负责实时追踪相机姿态和环境信息,而空间建模系统则利用PushARFrame接口接收这些数据完成3D重建。文章对比了手动PushFrame与PushARFrame的优劣,强调后者在实时扫描场景中的优势,并详细说明了两个系统的生命周期管理顺序(ARSession
用 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 与空间建模的配合流程:
一个典型的使用流程是这样的:
- 创建 AR Engine 的 ARSession,配置追踪模式
- 创建空间建模的 Session
- 在每一帧的更新循环中:
a. 从 ARSession 获取当前帧的 ARFrame
b. 把 ARFrame 通过 PushARFrame 推入空间建模 Session - 用户扫描完成后,启动空间建模
- 等待建模完成,保存结果
这里面的关键是第 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,再创建空间建模 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 算法和相机标定,只需要把两个系统对接好就行。
更多推荐



所有评论(0)