用 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 来操作它。typedefstructAREngine_ARSessionAREngine_ARSession;你可以把它理解为 AR Engine 的控制中心。通过它你可以配置 AR 追踪的类型SLAM、人脸、人体等、获取每一帧的 AR 数据、管理 AR 锚点等等。为什么用 AR Engine 而不是自己搞空间建模需要两个关键信息相机图像和相机姿态。相机图像好说直接从摄像头获取就行。但相机姿态相机在 3D 空间中的位置和朝向就麻烦了——你需要实现 SLAM 算法来做实时追踪。AR Engine 已经把这些都做好了。它会实时追踪相机在空间中的位置和旋转检测平面、特征点等环境信息处理光照估计、遮挡等高级功能你不需要自己实现这些直接用 AR Engine 的输出就行。这就是为什么空间建模的 C API 里专门提供了 PushARFrame 这个函数——它是为 AR Engine 的数据量身定做的。PushARFrame把 AR 帧推进空间建模HMS_SpatialReconStatusHMS_SpatialRecon_PushARFrame(HMS_SpatialRecon_Session*spatialReconSession,AREngine_ARSession*arSession,AREngine_ARFrame*arFrame);这个函数接收三个参数spatialReconSession空间建模的会话句柄通过HMS_SpatialRecon_CreateSession创建arSessionAR Engine 的会话句柄告诉空间建模系统这个 AR 帧是从哪个 AR 会话来的arFrame一帧 AR 数据包含相机图像、追踪状态、锚点等信息和 PushFrame 一样PushARFrame 也必须在 StartSession 之前调用。一旦启动了重建就不能再推帧了。ARSession 和空间建模的配合流程下面是 ARSession 与空间建模的配合流程正常丢失否是创建 ARSession 配置追踪模式创建空间建模 Session进入帧更新循环从 ARSession 获取当前帧 ARFrame检查追踪状态是否正常调用 PushARFrame 推入空间建模跳过本帧等待恢复继续下一帧用户扫描完成?启动空间建模 StartSession等待建模完成保存建模结果一个典型的使用流程是这样的创建 AR Engine 的 ARSession配置追踪模式创建空间建模的 Session在每一帧的更新循环中a. 从 ARSession 获取当前帧的 ARFrameb. 把 ARFrame 通过 PushARFrame 推入空间建模 Session用户扫描完成后启动空间建模等待建模完成保存结果这里面的关键是第 3 步——你需要在 AR Engine 的帧循环中同步推帧。AR Engine 每一帧都会更新追踪状态和相机姿态你需要把这些实时数据喂给空间建模系统。ARSession 在空间建模中的角色你可能会问PushARFrame 为什么要同时传 arSession 和 arFrame只传 arFrame 不够吗这是因为空间建模系统需要知道这个 AR 帧来自哪个 AR 会话。不同的 AR 会话可能有不同的配置比如追踪模式、更新频率等空间建模系统需要根据这些信息来正确处理帧数据。打个比方arSession 就像一个翻译官——空间建模系统通过它来理解 AR 帧数据的含义。没有这个翻译官空间建模系统虽然能拿到数据但不知道这些数据是在什么条件下采集的。和 PushFrame 对比两种推帧方式各有优劣PushFrame手动构造 DataFrame灵活你可以完全控制每一帧的数据适合非 AR 场景比如从视频文件或者离线数据中重建需要自己处理相机标定和姿态估计PushARFrameAR Engine 帧方便AR Engine 已经帮你处理好了所有数据适合实时扫描场景用户拿着手机边走边扫数据质量有保障AR Engine 的追踪精度比较高大多数情况下如果你做的是一个实时空间扫描 APP用 PushARFrame 就对了。只有在特殊场景比如从已有的视频文件重建 3D 模型才需要手动构造 DataFrame。ARSession 的生命周期管理两个会话的生命周期管理顺序很重要创建阶段先创建 ARSession再创建空间建模 Session运行阶段两个会话同时运行ARSession 每帧采集数据PushARFrame 同步推帧到空间建模销毁阶段先销毁空间建模 Session再销毁 ARSessionARSession 和空间建模 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 算法和相机标定只需要把两个系统对接好就行。