编者按:本文来自微信公众号“青亭网”(ID:qingtinwang),作者周凡,36氪经授权发布。
昨日,谷歌突然重磅发布了属于安卓系统的AR SDK——ARCore,并号称将要安装到一亿台安卓设备上,目前三星S8和谷歌自家的手机Pixel已经都获得了支持。这一步,被普遍解读为对苹果六月份发布的ARKit的正面回应。
苹果在移动端AR上来势汹汹,ARKit一发布就刷了科技圈的屏,涌现出无数的开发者demo。相比之下,谷歌此前推出的需要TOF深度传感器使用的Tango平台,一下子似乎被拍死在了沙滩上,乏人问津。但如今,谷歌的ARCore不需要再仰仗TOF,而是和ARKit类似,直接使用手机的单目RGB摄像头,加上内部的IMU就能实现AR。这让不少人安卓开发者为之兴奋。
可以想象,两大移动互联网领域的超巨头在不远的未来,基于手机端AR必有一战。那么,ARCore底层技术的实现原理为何?是否有谷歌说得那么神?相比ARKit又有何异同和优劣势?
青亭网第一时间联系了专注于AR领域的源视感科技CEO周凡,他连夜阅读了ARCore的代码,并对谷歌放出的demo进行了逐帧分析。下面请看他带来的第一手报告:
Apple的ARKit发布之后, 市场一片欢腾。经过一段时间的低潮后,对于AR的热情再一次被点燃。就在苹果沾沾自喜(我猜的)、安卓开发者表示强烈不满时(也是我猜的),谷歌昨天发布了Tango之后的单目+IMU增强现实方案——ARCore。
目的很明确,连名字都很霸气的相似——就是要怼ARKit去的。作为AR技术的先驱, 谷歌果然出手不凡,一次性在Github上放出三个SDK,涵盖安卓原生、Unity3D和Unreal平台。虽然没有像上次的SLAM方案Cartographer那样直接开源,但是对应用开发者,无论是手机端,还是嵌入式设备都算非常的友好了,貌似要一统开发者天下。
连夜读了有限的代码,可以看出ARCore的核心功能有三个:相机姿态估计, 环境感知及光源感知(Light Estimation)。由于资料有限,只能做一个大概的估计与分析。
前两个功能,研究SFM、SLAM的同学应该不陌生了—— 前者通过单目相机读取图像,通过特征的匹配估计相机的运动轨迹。但是ARCore极有可能用的不是常见的特征匹配法。这里先卖个关子,下文再详细分析运动轨迹的估计方法。
至于环境感知功能,名字起的很高大上,但具体实现的功能其实就是检测平面。这样做的好处就是在现实环境中放置虚拟物体的时候位置相对合理,不会出现类似物体悬空,或者在斜面上仍然处于水平的姿态。
第三个光源感知功能,按照谷歌官方的说法是,ARCore能感知现实世界的光源位置,使虚拟物体能够形成相应方位的影子,从而增加虚拟物体在现实世界里的真实度。这个功能堪称惊艳!从谷歌发布的Demo视频里看, 虚拟物体的影子确实是根据光源形成了相对应方向的影子。
但是分帧仔细分析视频后, 发现该功能在强光源的状态下效果才不错,在散漫光源的情况下就一般般了。
个人估计:是因为使用的匹配算法的原因。这样,我们就要回到刚才卖关子的ARCore第一个核心功能——姿态估计上,进行具体分析:
传统的特征匹配方法只计算关键点和描述,几十万像素的图像只用了几百个特征点,屏蔽了大部分可能有用的信息,更别说对灰度的估计了。所以,ARCore很有可能是使用了直接法来做相机位姿估计(对直接法感兴趣的同学可以去看看LSD, SVO, DSO等解决方案)。
简单来说,直接法直接使用的是整张图片的像素信息,通过像素亮度来进行运动轨迹的估计。这样的好处是速度很快,直接跳过计算关键点与描述子的步骤。同时在有些缺失特征点的环境下,只要环境中有明暗变化,也能工作,如此大大的避免了跟丢的情况。
直接法的数学推导就不详述了,但是该方案是基于灰度不变的强假设。换句话说, 就是同一空间的像素灰度值,在每张图像上都是不变的。这样就对光源的强弱及位置变化要求比较高,同时相机的自动曝光功能也需要关闭,使得图像不会整体变亮或者变暗。(这一点在外媒TheVerge的上手测试中有体现)
ARCore的所谓光源感知功能估计就是基于像素灰度变化的计算。这也就是为什么不同的光源强度下,形成的影子的方向效果有好有差。谷歌果然聪明,在位姿估计的同时顺水推舟地发布一个光源感知功能,一石二鸟!形象一下子就盖过了ARKit。
由于直接法完全依靠像素梯度优化来估计相机位姿,作为Ceres(谷歌推出的SLAM闭环检测算法)的东家,这点对于谷歌来说并不是什么难处。另外一个ARCore使用直接法的例证就是点云。
ARCore的SDK里是有点云功能的——由于Unity3D的Demo存在Bug,无法看到具体形成的点云是半稠密还是稠密的。但无论是半稠密还是稠密点云的构建,这都是特征法无法实现的。个人估计是半稠密的点云。如果ARCore在没有GPU CUDA加速的情况下真构建了稠密点云,只能膜拜Google大法了。
相比之下,ARCore能够实现的光源感知和点云功能,ARkit实现不了——如果ARKit是Metaio(苹果之前收购的德国公司)做的话,采用特征法的可能性大,这样就无法实现光源感知,点云理论上是能构建,但只能是稀疏的,基本上就是一堆点,看不出什么。
至于ARCore整体的工程是SLAM还是VIO,个人的偏向还是VIO更有可能。就如ARKit一样,使用的场景更偏向于手机端,在场景不大的情况下,VIO作为定位方案已经绰绰有余,而且更加节省计算资源。
无论如何,ARCore推出,补全了安卓市场在AR上的空白。基于安卓系统的市场占有率,苹果还敢说自己是最大的AR平台吗?