查看: 521|回复: 3

HarmonyOS7 AR Engine暗光巡检实践:3D高斯模型与外部

[复制链接]
发表于 昨天 12:00 | 显示全部楼层 |阅读模式
在做基于真实物理空间的增强现实(AR)应用开发时,几个业务痛点经常同时出现:工业设备巡检场景中,巡检员戴着 AR 眼镜或举着平板进入厂房,暗光甚至全黑环境下视觉 SLAM 会瞬间丢失跟踪;展品展示或设备结构拆解要求极高渲染精度,传统 Mesh 贴图模型在半透明材质和复杂光影反射下表现生硬;还有一类特殊场景需要把 AR 解算能力部署到无人机或外置全景相机上,手机自带传感器数据根本用不上。

HarmonyOS 7.0 的 AR Engine 更新,针对这些深度场景给出了一套组合能力:通过底层 C API 直接干预相机闪光灯以解决暗光 SLAM 丢失,开放预览流原始图像数据的直接获取,引入 3D 高斯模型的原生加载支持,并开放外部传感器数据注入进行空间解算。本文以暗光环境下的高精度数字孪生巡检为例,把这四个新特性串联起来,梳理底层流转逻辑和工程落地的关键点。

一、几个核心 API 的能力拆解

1. C API 闪光灯控制(ARSession_OpenFlash)

早期 AR Engine 中相机被引擎独占管理,环境光变暗导致特征点提取失败时,应用层拿不到 Camera 控制权,无法主动开闪光灯,只能眼看着 Tracking 状态变为 LOST。新增的 C API HMS_AREngine_ARSession_OpenFlash 允许开发者在 C/C++ 层直接向运行中的 ARSession 下发闪光灯开关指令。函数签名如下:
  1. int32_t HMS_AREngine_ARSession_OpenFlash(const HMS_AREngine_ARSession* session, int32_t mode);
复制代码

mode 为 0 表示关闭,1 表示常亮 Torch 模式。这个设计的价值是绕过了上层 CameraKit 的权限协商,直接插入到 AR 引擎内部状态机的补光逻辑中。由于 AR SLAM 对曝光时间极其敏感,底层引擎收到 OpenFlash 指令后会自动调整曝光策略和 ISO 参数,避免突然高光导致特征点过曝而引发位姿跳变。

2. ArkTS 预览流数据抽取(arFrame.acquireCameraImage)

很多场景需要拿到 AR Engine 计算出的 6DoF 位姿,同时还要分析当前画面内容,比如跑本地 AI 缺陷检测模型。以前的做法是拉两路流,移动端功耗和带宽压力很大。新增的 arFrame.acquireCameraImage() 允许业务层直接从 AR 引擎内部渲染流水线中拷出当前物理相机图像帧,实现一虾两吃。调用方式为:
  1. let imageBuffer = arFrame.acquireCameraImage();
复制代码

返回对象包含图像宽、高、格式(通常为 YUV_420_888)以及 ArrayBuffer 数据。关键点在于返回的是原始 YUV 格式,没有经 GPU 做 RGB 色彩空间转换,因此抽取开销极小,适合直接送入 NPU 做深度学习推理,大多数 NPU 算子原生支持 YUV 处理。

3. 3D 高斯模型加载(arViewController.loadGSModel)

3D Gaussian Splatting 相比 NeRF 的优势在于保证照片级渲染质量的同时实现实时光栅化渲染。它用数百万个带颜色、不透明度、协方差矩阵的高斯椭球体来表达三维空间。新增 API 提供一键加载 .ply 格式高斯模型的能力:
  1. arViewController.loadGSModel(context, modelPath, scale);
复制代码

底层会自动将庞大的点云数据加载进显存,并启用 HarmonyOS 自研高斯光栅化管线,开发者无需手写 Compute Shader 做高斯排序和 Alpha 混合。

4. 外部传感器计算模式(ARRemoteSensorMode)

这是最具工业价值的能力。比如通过 Type-C 外接安装在安全帽上的深度相机模组,或者把手机 AR Engine 作为算力节点接收局域网内无人机传回的数据。通过配置会话的传感器模式并调用 C API HMS_AREngine_ARSession_FeedSensorData,可以向引擎注入时间戳严格对齐的外部图像和 IMU 数据。配置方式为:
  1. arConfig.sensorMode = AREngine.ARRemoteSensorMode.EXTERNAL_CAMERA_AND_IMU;
复制代码

启用该模式后,AR Engine 会挂起内部设备相机和传感器驱动轮询,开启高速数据接收缓冲区。开发者需要自己实现高精度时间戳对齐(PTP 或 NTP 同步),SLAM 对图像与 IMU 之间延时极为苛刻,通常要求同步误差小于 1 毫秒。

二、工程落地的关键实现

核心工程结构按功能模块划分:ARInspectionPage 承载 XComponent 和交互,AREngineManager 做 AR 会话与状态机全局管理,GsModelRenderer 负责高斯模型加载与渲染,ExternalSensorDriver 负责外部相机与 IMU 数据流读取和时间戳对齐。闪光灯控制和外部数据注入放在 C++ 层通过 NAPI 暴露给 ArkTS,AR 生命周期和高斯模型加载在 ArkTS 层完成。

1. C++ 层封装闪光灯控制

在 NAPI 层调用 C API 时,需要缓存全局 Session 指针。示例代码如下:
  1. #include "napi/native_api.h"
  2. #include "huawei_arengine_interface.h"
  3. #include <hilog/log.h>
  4. static HMS_AREngine_ARSession* g_arSession = nullptr;
  5. static napi_value SetFlashMode(napi_env env, napi_callback_info info) {
  6.     size_t argc = 1;
  7.     napi_value args[1] = {nullptr};
  8.     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  9.     int32_t mode = 0;
  10.     napi_get_value_int32(env, args[0], &mode);
  11.     if (g_arSession == nullptr) {
  12.         OH_LOG_ERROR(LOG_APP, "ARSession is null, cannot set flash.");
  13.         return nullptr;
  14.     }
  15.     int32_t ret = HMS_AREngine_ARSession_OpenFlash(g_arSession, mode);
  16.     if (ret != 0) {
  17.         OH_LOG_WARN(LOG_APP, "Failed to open flash, error code: %{public}d", ret);
  18.     }
  19.     napi_value result;
  20.     napi_create_int32(env, ret, &result);
  21.     return result;
  22. }
复制代码

2. ArkTS 层:预览流抽取与高斯模型加载

帧循环中需要同时处理暗光检测、闪光灯控制和预览帧抽取。参考实现如下:
  1. export class AREngineManager {
  2.     private isFlashOn: boolean = false;
  3.     public async initSession(context: Context) {
  4.         let config = new AREngine.ARConfig();
  5.         config.sensorMode = AREngine.ARRemoteSensorMode.DEFAULT;
  6.         this.arSession = new AREngine.ARSession();
  7.         await this.arSession.configure(config);
  8.         this.arSession.resume();
  9.     }
  10.     public loadInspectionModel(modelPath: string) {
  11.         if (!this.arViewController) return;
  12.         // .ply 高斯模型通常几十MB到上百MB,建议放本地存储而非 rawfile
  13.         this.arViewController.loadGSModel(modelPath, 0.5);
  14.     }
  15.     public onFrameUpdate(frame: AREngine.ARFrame) {
  16.         let lightEstimate = frame.getLightEstimate();
  17.         if (lightEstimate.getState() === AREngine.LightEstimateState.VALID) {
  18.             let pixelIntensity = lightEstimate.getPixelIntensity();
  19.             // 开启阈值 0.15,关闭阈值 0.3,防止临界点频繁闪烁
  20.             if (pixelIntensity < 0.15 && !this.isFlashOn) {
  21.                 flashControl.setFlashMode(1);
  22.                 this.isFlashOn = true;
  23.             } else if (pixelIntensity > 0.3 && this.isFlashOn) {
  24.                 flashControl.setFlashMode(0);
  25.                 this.isFlashOn = false;
  26.             }
  27.         }
  28.         // 零拷贝获取相机图像,YUV_420_888 格式
  29.         let cameraImage = frame.acquireCameraImage();
  30.         if (cameraImage) {
  31.             let rawBuffer = cameraImage.data;
  32.             // TODO: 送入 NPU 模型推理,推理后必须及时释放,避免渲染管线无 Buffer 可用
  33.         }
  34.     }
  35. }
复制代码

两个关键设计决策值得注意。一是防抖动机制:开启阈值 0.15、关闭阈值 0.3 是实际车间测试得出的经验值,环境光在临界点波动时闪光灯不会疯狂跳闪。二是零拷贝获取:acquireCameraImage() 拿到的是底层物理内存映射块,没有 CPU 深拷贝,业务层推理时要极其小心生命周期,切忌长期持有,否则底层渲染管线无 Buffer 可用会引发画面卡死。

三、避坑指南

外部传感器模式的时间戳对齐是重中之重。如果不理解 SLAM 中 IMU 预积分对时间戳的极度敏感性,盲目把网络接收到的外部视频流喂给引擎,大概率只会得到一堆报错。硬件强同步是玩转 RemoteSensor 模式的前提底线。此外,高斯模型文件体量很大,加载时要考虑内存占用和加载耗时,scale 参数需要根据实际模型空间尺度微调。

梳理下来,HarmonyOS 7.0 AR Engine 这次升级的核心逻辑是开放与下放:把原本深埋在引擎黑盒里的曝光控制、原始数据流抽取、传感器输入源选择全部交还给开发者。对 3D Gaussian Splatting 的原生支持,则在渲染维度上追平了业界最新标准。实际工程中这些能力往往组合使用:极暗环境中调用 C API 开启闪光灯,同时通过 acquireCameraImage 提取提亮后的画面送给本地缺陷检测模型,再将问题部件用高精度 3D 高斯模型叠加到真实物理空间上。正是这些底层 API 的串联,让开发者可以用 ArkTS 与 C++ 构筑具备生产力价值的企业级空间计算应用。
回复

使用道具 举报

发表于 昨天 12:05 | 显示全部楼层

Re: HarmonyOS7 AR Engine暗光巡检实践:3D高斯模型与外部

楼主分享很详细,对暗光巡检场景的痛点剖析到位。特别是C API直接控制闪光灯和外部传感器注入这两点,确实解决了实际工程中的大问题。想请教一下,外部传感器模式下时间戳对齐除了PTP/NTP,有没有更简单可靠的方案?另外,3D高斯模型加载后,在移动端的性能表现如何?期待后续实战数据。
回复 支持 反对

使用道具 举报

发表于 昨天 12:05 | 显示全部楼层

Re: HarmonyOS7 AR Engine暗光巡检实践:3D高斯模型与外部

感谢分享!这几个新特性确实把之前 AR 开发里最难受的几个点都覆盖到了,尤其是暗光下 SLAM 丢失和外部传感器注入,工业巡检场景太需要了。 想请教一下,外部传感器模式下时间戳对齐要做到 1ms 以内,实际工程中除了 PTP/NTP,有没有配合硬件同步信号(比如外接相机的 strobe 输出)来做的方案?另外 3D 高斯模型在端侧加载后,单帧渲染耗时大概在什么量级?设备发热和内存占用控制和传统 Mesh 比差距明显吗?
回复 支持 反对

使用道具 举报

发表于 昨天 12:05 | 显示全部楼层

Re: HarmonyOS7 AR Engine暗光巡检实践:3D高斯模型与外部

楼主这篇实战分享太有价值了,正好我们也在做类似的工业巡检项目,几个痛点简直一模一样。特别是暗光下SLAM丢失的问题,之前我们只能靠算法层面硬扛,看到这个直接控制闪光灯的C API,思路一下打开了。想请教一下,开启Torch模式后,对设备续航和发热影响大吗?另外外部传感器注入那个模式,时间戳同步你们是用PTP还是NTP?我们这边考虑用5G模组回传数据,延迟抖动比较担心,有没有什么工程上的建议?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-22 00:59 , Processed in 0.024414 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部