本文共 4296 字,大约阅读时间需要 14 分钟。
《网易戏精》是网易人工智能事业部旗下一款AI短视频产品,用户可以随手拍出自己的特效视频,其中包含数十个有趣的奇幻道具,其中放置类的道具只需要扫一下平面,即可摆放进现实世界中进行互动,既有充满霓虹灯的旺角街头、会随音乐抖动的DJ打碟台、迪厅球,也有烟雾缭绕的迷幻场景等等。
此类放置类道具在安卓端基于Google的ARCore技术实现。本文整理归纳项目研发中ARCore的使用及研发历程,与大家一起分享在AR应用开发中遇到的问题及实践。主要分为以下几个方面,已有相关经验的ARCore开发者可以选择性跳过。
ARCore SDK主要由三大模块构成:、环境理解、光照估计。
对ARCore底层原理的了解可以帮助我们了解计算的过程以及解决一些问题。
首先,ARCore使用视觉惯性测距系统(Visual Inertial Odometry,简称 VIO)的算法来实现运动跟踪。VIO将从设备的摄像机中识别图像特征与内部运动传感器结合起来,以获得设备的6DOF(6 Degree Of Freedom,6度自由度)信息。我们常说的6DOF指的是三维的位置与三维的旋转,而3DOF常指三维的旋转(直接通过陀螺仪即可获得,比起6DOF计算较为简单)。
(上图即是6DoF的图示)惯性测量单元(Inertial measurement unit,简称 IMU)的读数大约为1000次每秒并且是基于加速度的(用户的移动)。航迹推算法(Dead Reckoning)用于测量 IMU 读数之间的设备移动,但这种方法推算是一种估算,就像如果我让你向前走一步,然后猜测走了多远一样,此时会用航迹推算法来估计距离。但惯导系统中的误差会随时间累积,所以 IMU 帧率越长,惯导系统从视觉系统中复位后的时间越长,追踪位置距离真实位置偏差就越多。
视觉/光学测量使用的是摄像机来采集视觉信息,设备帧率通常为 30fps 并且依赖距离(不同的场景帧率也有所不同)。光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响),所以用户运动得越远,误差就越大。
惯性导航系统与视觉测量系统各有各的优势和不足。并且视觉和惯性跟踪系统是基于完全不同的测量系统,他们之间并没有相互依赖,所以他们整合在一起可以互相弥补缺陷。这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙),而惯性系统照样可以正常工作,或者设备在完全静止的条件下,视觉系统可以呈现出一个比惯性系统更加稳定的姿态。在此之上这个算法使用卡尔曼滤波器不断地选择最佳姿态,从而实现稳定跟踪。
与ARKit的功能上的对比
为了尽可能保证Android用户和iOS用户的功能一致性,我们整理了ARKit和ARCore在各个版本上的功能。版本上需要注意的是,ARKit的版本取决与手机的操作系统级别,ARCore的运行版本取决于手机上安装的ARCore Runtime Apk,Runtime对SDK采取向下兼容机制,并且用户如首次安装ARCore Runtime Apk后,之后作为内核服务自动更新。
ARKit | ARCore | |
---|---|---|
6DOF追踪 | 支持(1.0)(iOS11) | 支持(1.0) |
相机分辨率、自动对焦 | 支持(1.5)(iOS11.3) | 支持(1.4) |
图片扫描 | 支持(1.5)(iOS11.3) | 支持(1.2) |
云锚点 | 支持(2.0)(iOS12) | 支持(1.2) |
ARCore SDK模块设计易于理解,开发者可以很简单地找到相应的API,简单列了一张重要/常用API的对应概念:
Session: 负责整个AR算法的生命周期和算法配置文件选项,主要有Start\\Pause\\Resume\\Stop,配置文件可配置是否开启位置追踪、2D图片识别、环境光检测等功能,多余的配置涉及到可观的性能开销,并且在切换配置的过程中会涉及到相机画面的重启,建议产品根据各自情况进行选择。
运动追踪相关
Frame.CameraImage.Texture Frame.CameraImage.DisplayUvCoords | 相机纹理ID,对应于OpenGL中一张Texture中的Gluint,注意此Texture为一张旋转的External OES Texture,必须搭配DisplayUvCoords信息才能正确渲染(OES Texture与普通纹理有所区别,下文会举例一个实战issue) |
---|---|
Frame.CameraBuffer.AcquireCameraImageBytes | 可获得Camera的原始相机数据,格式为YUV420_888,此格式为Android Camera2的默认格式(注意此格式将YUV分离为3个Stride,与Camera1的NV21有所不同)。获得原始数据一般用于进一步的图像处理或CV算法 |
Frame.Pose.position Frame.Pose.rotation | 包含了运动追踪的结构体,包括相机当前位置、旋转等 |
环境理解相关
Session.GetTrackable | 可以获得已经被AR算法重建的平面 |
---|---|
Frame.Raycast | 从三维世界一个点沿一个方向发射出一条无限长的射线,在射线的方向上,一旦与现实世界的特征点、平面产生碰撞,则返回碰撞对象包含的位置、方向及其他相关属性 |
光估计相关
目前ARCore支持的机型主要为17年、18年发布的旗舰机,下图列了支持的国内主流设备列表,观察到表中支持的设备主要为高通芯片和ARM芯片,据官方所述后续还会支持联发科芯片的机型。
OEM | Model |
---|---|
小米 | Mi Mix 2S, Mi Mix 3 Mi 8, Mi 8 SE |
华为 | Honor 10, Honor Magic 2, Maimang 7 Mate 20, Mate 20 Pro, Mate 20 X nova 3, nava 3i P20, P20 Pro Porsche Design Mate RS Porsche Design Mate 20 RS |
三星 | Galaxy Note9 Galaxy S9, Galaxy S9+ |
值得一提的是Google官方考虑到国内用户无法在Google Play安装/更新ARCore Runtime,提供了小米、华为和三星应用商店作为国内安装跳转链接。
用于保证机型覆盖率,我们选用了网易的InsightSDK 作为ARCore的fallback的方案,开发的时候可以通过官网的ARCore设备白名单或者Session.CheckApkAvailability的方式进行自动选择SDK。
1. 运动中做运动跟踪
例如,如果用户是在火车上使用ARCore,这时IMU(Inertial Measurement Unit)获取的数据不仅包括用户的移动(实际是加速度),也包括火车的移动数据(实际是加速度),这样将导致跟踪失败。
2. 跟踪动态的环境
例如,如果用户对着一面大白墙、波光粼粼的湖面,这时从摄像机获取到的图像信息是不稳定的,这将导致特征点提取出错进而导致跟踪失败。
3. 热飘移
相机与 IMU 都是对温度敏感的元器件,之前我们说过相机和IMU的OEM校准,但这个校准通常都会在某一个或者几个特定温度下进行,但在用户设备使用过程中,随着时长的延长会导致设备发热,发热就会影响到相机获取的图像的颜色信息和IMU测量的加速度信息准确性,表现出来就是跟踪的物体会飘移。
4. CPU抢占
从上面的ARCore算法中发现AR算法对CPU要求较高。如果你的App占用了过多的CPU,依然会导致ARCore的效果不稳。可以使用类似SnapDragon Profiler的工具进行一个性能排查。
5. 使用Linear渲染模式
为了追求正确的光照计算,我们使用了Linear渲染模式,但是ARCore并没有提供Linear模式下相关的shader。可以使用以下函数对颜色空间进行转换:
pow(gl_FragColor.rgb,vec3(2.2));
6. External OES Texture的特殊性
将Camera Texture渲染到屏幕的shader使用的是External OES Texture,在实际的使用过程中发现单独使用External OES Texture没有问题,但是结合一张正常Texture会渲染成黑色,经过排查问题发现External OES Texture的底层实现是多个单通道Texture的打包,所以在External OES Texture之后Bind的正常GLuint可能会错误的绑定,这个时候可以将External OES Texture放在最后即可解决。
7. 结合计算机视觉
因为需要将Camera的相机数据做进一步数字图像处理或者CV检测,除了直接获得TextureID,还需要获得相机Buffer,但是小米手机调用Frame.acquireCameraImage() API会抛出NotYetAvailableException,官方文档有在小米的手机上说明这个问题,所以使用这个API还不能做到完全统一兼容。
总的来说,尽管ARCore推出的时间较ARKit迟,但功能上基本与ARKit持平。并且回顾ARCore近一年的发展上看,ARCore也在率先提出一些行业标准,像Cloud Anchor这样的新feature就是由ARCore率先提出,由此可见Google对ARCore的投入和在AR领域决心。同样,社交化的应用方式也是AR技术落地的重要场景。预计未来几年AR的开发生态会逐步完善并标准化,对开发者来说是十分值得期待的。
本文作者:邓志鹏,网易人工智能事业部资深技术美术专家,《Unity5.x从入门到精通》作者之一,主要关注于将AI、AR等前沿技术用于图形、交互领域。
转载地址:http://veynx.baihongyu.com/