网易戏精ARCore短视频新玩法实践

《网易戏精》是网易人工智能事业部旗下一款AI短视频产品,用户可以随手拍出自己的特效视频,其中包含数十个有趣的奇幻道具,其中放置类的道具只需要扫一下平面,即可摆放进现实世界中进行互动,既有充满霓虹灯的旺角街头、会随音乐抖动的DJ打碟台、迪厅球,也有烟雾缭绕的迷幻场景等等。

\n

\"\"

\n
(会随音乐抖动的DJ打碟台)
\n

此类放置类道具在安卓端基于Google的ARCore技术实现。本文整理归纳项目研发中ARCore的使用及研发历程,与大家一起分享在AR应用开发中遇到的问题及实践。主要分为以下几个方面,已有相关经验的ARCore开发者可以选择性跳过。

\n
  1. \n
  2. ARCore简述\n
  3. ARCore原理的进一步理解\n
  4. ARCore和ARKit的功能性对比\n
  5. ARCore API架构梳理\n
  6. ARCore的兼容性及解决方案\n
  7. 开发者可能会遇到的Troubleshoot\n
\n

ARCore简述

\n

ARCore SDK主要由三大模块构成:运动跟踪、环境理解、光照估计。

\n
  1. \n
  2. 运动跟踪可以让手机理解和跟踪它相对于现实世界的位置。\n
  3. 环境理解让手机可以检测各类表面(例如地面、咖啡桌或墙壁等水平、垂直表面)的大小和位置。\n
  4. 光估计让手机可以估测环境当前的光照条件。\n
\n

\"\"

\n

ARCore原理的进一步理解

\n

对ARCore底层原理的了解可以帮助我们了解计算的过程以及解决一些问题。

\n

首先,ARCore使用视觉惯性测距系统(Visual Inertial Odometry,简称 VIO)的算法来实现运动跟踪。VIO将从设备的摄像机中识别图像特征与内部运动传感器结合起来,以获得设备的6DOF(6 Degree Of Freedom,6度自由度)信息。我们常说的6DOF指的是三维的位置与三维的旋转,而3DOF常指三维的旋转(直接通过陀螺仪即可获得,比起6DOF计算较为简单)。

\n

\"\"
\n  (上图即是6DoF的图示)

\n

惯性测量单元(Inertial measurement unit,简称 IMU)的读数大约为1000次每秒并且是基于加速度的(用户的移动)。航迹推算法(Dead Reckoning)用于测量 IMU 读数之间的设备移动,但这种方法推算是一种估算,就像如果我让你向前走一步,然后猜测走了多远一样,此时会用航迹推算法来估计距离。但惯导系统中的误差会随时间累积,所以 IMU 帧率越长,惯导系统从视觉系统中复位后的时间越长,追踪位置距离真实位置偏差就越多。

\n

视觉/光学测量使用的是摄像机来采集视觉信息,设备帧率通常为 30fps 并且依赖距离(不同的场景帧率也有所不同)。光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响),所以用户运动得越远,误差就越大。

\n

惯性导航系统与视觉测量系统各有各的优势和不足。并且视觉和惯性跟踪系统是基于完全不同的测量系统,他们之间并没有相互依赖,所以他们整合在一起可以互相弥补缺陷。这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙),而惯性系统照样可以正常工作,或者设备在完全静止的条件下,视觉系统可以呈现出一个比惯性系统更加稳定的姿态。在此之上这个算法使用卡尔曼滤波器不断地选择最佳姿态,从而实现稳定跟踪。

\n

与ARKit的功能上的对比

\n

为了尽可能保证Android用户和iOS用户的功能一致性,我们整理了ARKit和ARCore在各个版本上的功能。版本上需要注意的是,ARKit的版本取决与手机的操作系统级别,ARCore的运行版本取决于手机上安装的ARCore Runtime Apk,Runtime对SDK采取向下兼容机制,并且用户如首次安装ARCore Runtime Apk后,之后作为内核服务自动更新。

\n
ARKitARCore
6DOF追踪支持(1.0)(iOS11)支持(1.0)
相机分辨率、自动对焦支持(1.5)(iOS11.3)支持(1.4)
图片扫描支持(1.5)(iOS11.3)支持(1.2)
云锚点支持(2.0)(iOS12)支持(1.2)
\n

ARCore API架构梳理

\n

ARCore SDK模块设计易于理解,开发者可以很简单地找到相应的API,简单列了一张重要/常用API的对应概念:

\n

Session: 负责整个AR算法的生命周期和算法配置文件选项,主要有Start\\Pause\\Resume\\Stop,配置文件可配置是否开启位置追踪、2D图片识别、环境光检测等功能,多余的配置涉及到可观的性能开销,并且在切换配置的过程中会涉及到相机画面的重启,建议产品根据各自情况进行选择。

\n

运动追踪相关

\n
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包含了运动追踪的结构体,包括相机当前位置、旋转等
\n

环境理解相关

\n
Session.GetTrackable可以获得已经被AR算法重建的平面
Frame.Raycast从三维世界一个点沿一个方向发射出一条无限长的射线,在射线的方向上,一旦与现实世界的特征点、平面产生碰撞,则返回碰撞对象包含的位置、方向及其他相关属性
\n

光估计相关

\n\n

ARCore兼容性及解决方案

\n

目前ARCore支持的机型主要为17年、18年发布的旗舰机,下图列了支持的国内主流设备列表,观察到表中支持的设备主要为高通芯片和ARM芯片,据官方所述后续还会支持联发科芯片的机型。

\n
OEMModel
小米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+
\n

值得一提的是Google官方考虑到国内用户无法在Google Play安装/更新ARCore Runtime,提供了小米、华为和三星应用商店作为国内安装跳转链接。

\n

用于保证机型覆盖率,我们选用了网易的InsightSDK 作为ARCore的fallback的方案,开发的时候可以通过官网的ARCore设备白名单或者Session.CheckApkAvailability的方式进行自动选择SDK。

\n

开发者可能会遇到的问题

\n

1. 运动中做运动跟踪

\n

例如,如果用户是在火车上使用ARCore,这时IMU(Inertial Measurement Unit)获取的数据不仅包括用户的移动(实际是加速度),也包括火车的移动数据(实际是加速度),这样将导致跟踪失败。

\n

2. 跟踪动态的环境

\n

例如,如果用户对着一面大白墙、波光粼粼的湖面,这时从摄像机获取到的图像信息是不稳定的,这将导致特征点提取出错进而导致跟踪失败。

\n

3. 热飘移

\n

相机与 IMU 都是对温度敏感的元器件,之前我们说过相机和IMU的OEM校准,但这个校准通常都会在某一个或者几个特定温度下进行,但在用户设备使用过程中,随着时长的延长会导致设备发热,发热就会影响到相机获取的图像的颜色信息和IMU测量的加速度信息准确性,表现出来就是跟踪的物体会飘移。

\n

4. CPU抢占

\n

从上面的ARCore算法中发现AR算法对CPU要求较高。如果你的App占用了过多的CPU,依然会导致ARCore的效果不稳。可以使用类似SnapDragon Profiler的工具进行一个性能排查。

\n

5. 使用Linear渲染模式

\n

为了追求正确的光照计算,我们使用了Linear渲染模式,但是ARCore并没有提供Linear模式下相关的shader。可以使用以下函数对颜色空间进行转换:

\n

pow(gl_FragColor.rgb,vec3(2.2));

\n

6. External OES Texture的特殊性

\n

将Camera Texture渲染到屏幕的shader使用的是External OES Texture,在实际的使用过程中发现单独使用External OES Texture没有问题,但是结合一张正常Texture会渲染成黑色,经过排查问题发现External OES Texture的底层实现是多个单通道Texture的打包,所以在External OES Texture之后Bind的正常GLuint可能会错误的绑定,这个时候可以将External OES Texture放在最后即可解决。

\n

7. 结合计算机视觉

\n

因为需要将Camera的相机数据做进一步数字图像处理或者CV检测,除了直接获得TextureID,还需要获得相机Buffer,但是小米手机调用Frame.acquireCameraImage() API会抛出NotYetAvailableException,官方文档有在小米的手机上说明这个问题,所以使用这个API还不能做到完全统一兼容。

\n

总的来说,尽管ARCore推出的时间较ARKit迟,但功能上基本与ARKit持平。并且回顾ARCore近一年的发展上看,ARCore也在率先提出一些行业标准,像Cloud Anchor这样的新feature就是由ARCore率先提出,由此可见Google对ARCore的投入和在AR领域决心。同样,社交化的应用方式也是AR技术落地的重要场景。预计未来几年AR的开发生态会逐步完善并标准化,对开发者来说是十分值得期待的。

\n

本文作者:邓志鹏,网易人工智能事业部资深技术美术专家,《Unity5.x从入门到精通》作者之一,主要关注于将AI、AR等前沿技术用于图形、交互领域。

\n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flybirding10011

谢谢支持啊999

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值