美文网首页iOS点点滴滴程序员iOS点点滴滴
详解iOS之ARkit为何碾压对手(二)

详解iOS之ARkit为何碾压对手(二)

作者: 梦想编程家小枫 | 来源:发表于2017-10-25 22:11 被阅读198次

    在这篇文章中,我们能了解到

    1,ARKit、Tango、Hololens技术对比

    2,开发人员如何使用ARKit

    明天小编会更新第三篇

    1,AR以及其他技术的未来,

    2,追踪技术的未来

    ,这是小编的一个iOS交流群 659170228,欢迎大家的入驻,一起交流学习!

    Tango 、 HoloLens、 Vuforia 等 SDK 怎么样?

    Tango 只是一个品牌名,而不是真正的产品。Tango 包括硬件参考设计(RGB,鱼眼镜头,深度相机和CPU / GPU规格),还参与 VIO(运动跟踪),稀疏映射(区域学习)和密集 3D 重建(深度感知)等软件。

    HoloLens 具有完全相同的软件栈,另外包括一些 ASIC(微软称之为全息处理单元)优化 CPU / GPU 卸载处理并减小电耗。

    Vuforia 与 ARKit 几乎是一样的,只是 Vuforia 的硬件是独立的。

    上述 SDK 均使用相同的 VIO 系统,而且,Tango 和 ARKit 使用的均为 FlyBy 最初发布的代码库!HoloLens 和 Tango 都不使用深度相机进行追踪,那么到底是什么技术设备让 ARKit 大放异彩呢?

    答案是 ARKit 并不比 HoloLens 好,我甚至认为 HoloLens 的跟踪系统是市场上最好的,但 HoLolens 的硬件普及并不广。微软可能会在 Windows 系统的智能手机中安装 HoloLens 跟踪系统,但我相信出于商业原因,微软不会这样做:

    因为这样可能会增加生产和时间成本,为一款销量或许很少的手机校准传感器。而且,微软版本的 ARKit 也可能无法说服开发者放弃使用 iOS 或 Android 系统。12 个月前,Google 本就可以轻松交付能够在 Android 系统上运行的 Tango 手机,但 Google 没有这样做。如果 Google 早早将 Tango 发货 ,那么 ARKit 的问世也只是紧跟趋势,而非重大突破。

    我认为,Google 公司不想为每家 OEM 都进行特定的传感器校准过程,而且每家 OEM 厂商生产的 Tango 版本都不一样,Google 也不想在一些较大的 OEM 厂商(三星、华为等)中选择。所以,Google 为 OEM 厂商提供了硬件的参考设计,OEM 厂商可以自行选择“使用,或者不使用”。(当然,事情并非这么简单,这是 OEM 厂商反馈给我的关键点。)

    随着 Android 智能手机硬件商品化,相机和传感器堆栈是 Android 手机最后实现差异化的地方,所以 OEM 厂商无法满足 Google 的要求。Google 认为,深度相机是手机的一部分,但是深度相机增加了手机成本,这也是 OEM 厂商拒绝 Google 的另一个原因!

    自从 ARKit 发布以来,市场已经发生了变化。OEM 厂商要么寻找 Tango 的替代系统,要么接受 Google 的硬件参考设计,然后实现平台控制。这也是有意思的变化。

    总的来说,ARKit 更好的原因在于:

    苹果公司可以负担得起将 VIO 算法紧密耦合到传感器上,并花费很多时间来校准 VIO 系统,以减少计算空间位置时产生的误差。值得注意的是,大型 OEM 厂商有一些替代方案。可以选择其他的追踪方案,像 ORB Slam、OpenCV 等,但几乎都是光学追踪器,都配有单个 RGB、立体声、深度相机,有些使用稀疏点云,有些使用密集点云。有许多创业公司正在研发追踪系统,研究增强像素也是一个很好的方向,但任何 VIO 系统最终的竞争都会集中到硬件模型和校准上。

    接下来我们来谈谈,ARkit中的几个重要技术以及几个注意事项

    这其中的学习难度较大,比从网络到移动或从移动到 VR 更有难度。你需要彻底重新思考应用程序的如何运行以及用户体验(UX)的意义是什么。我现在看到很多 ARKit 的 demo,四年前看到它们是基于 Vuforia 创建,再往前四年就是 Layar (2010 年荷兰公司 SPRXmobile 推出的全球第一款 AR 手机浏览器)。这几年来,我 看过了几乎所有类型的 AR APPs 的例子,我很乐意为大家提供支持和反馈。

    我常常鼓励开发人员勇于构建新奇的 APP。一些蠢蠢的 APP 一上线便大获成功,但通过 AR 硬件开发让用户是满意的案例也十分具有挑战。

    当然,受限于iOS设备的硬件,当前的ARkit还不能做到完美。不管怎么样,当前的iOS设备还只能实现单母SLM。因此在实际的开发和使用中要注意一下事项:

    1,在设计AR产品体验时,一定要保证现场的光照条件

    ARkit的Worldtracking涉及到图像分析,其前提是摄像头可以捕捉到清晰的图像。因此,如果现场的光照条件不好而导致摄像头无法捕捉到图像的细节,那么最终的用户体验肯定是糟糕的。

    2,使用跟踪质量信息向用户提供反馈

    ARkit世界跟踪功能的另一大前提是实时监测设备的运动信息。过量或过于剧烈的运动将导致图像模糊,从而无法追踪不同视频帧的特征点,导致跟踪质量下降。ARCamera可以提供跟踪状态信息,因此建议开发者设计相应的UI,向用户反馈此类信息,避免过量或过于剧烈的运动。

    3,允许ARkit获得足够的时间来检测平面,而在检测完成后最好禁用平面检测功能

    在实际体检的时候,平面检测可能会耗费比较长的时间。而且当某个平面首次被检测时,其位置和范围信息往往是不准确的。随着平面在场景中出现的时间足够长,ARkit将会优化相关的位置和范围信息。但是一旦我们获取到了令人满意的信息,就应该关闭平面检测功能,否则ARkit将持续变更平面描点的位置,范围和坐标信息。

    世界追踪系统是如何工作的?

    苹果文档中对世界追踪过程是这么解释的:ARKit 使用视觉惯性测距技术,对摄像头采集到的图像序列进行计算机视觉分析,并且与设备的运动传感器信息相结合。ARKit 会识别出每一帧图像中的特征点,并且根据特征点在连续的图像帧之间的位置变化,然后与运动传感器提供的信息进行比较,最终得到高精度的设备位置和偏转信息。

    我们通过一个 gif 图来理解上面这段话:

    追踪质量:

    世界追踪需要一定的条件才能达到较好的效果,如果达不到所需的条件要求,那么世界追踪的质量会降低,甚至会无法追踪。较好的世界追踪质量主要有以下三个依赖条件:

    运动传感器不能停止工作。如果运动传感器停止了工作,那么就无法拿到设备的运动信息。根据我们之前提到的世界追踪的工作原理,毫无疑问,追踪质量会下降甚至无法工作。

    真实世界的场景需要有一定特征点可追踪。世界追踪需要不断分析和追踪捕捉到的图像序列中特征点,如果图像是一面白墙,那么特征点非常少,那么追踪质量就会下降。

    设备移动速度不能过快。如果设备移动太快,那么 ARKit 无法分析出不同图像帧之中的特征点的对应关系,也会导致追踪质量下降。

    追踪状态

    世界追踪有三种状态,我们可以通过 camera.trackingState 获取当前的追踪状态。

    Not Available:世界追踪正在初始化,还未开始工作。

    Normal: 正常工作状态。

    Limited:限制状态,当追踪质量受到影响时,追踪状态可能会变为 Limited 状态。

    与 TrackingState 关联的一个信息是 ARCamera.TrackingState.Reason,这是一个枚举类型:

    case excessiveMotion:设备移动过快,无法正常追踪。

    case initializing:正在初始化。

    case insufficientFeatures:特征过少,无法正常追踪。

    case none:正常工作。

    我们可以通过 ARSessionObserver 协议去获取追踪状态的变化,比较简单,可以直接查看接口文档,这里不做深入介绍。到这里,ARKit 中有关于世界追踪的知识基本介绍完了,世界追踪算是 ARKit 中核心功能了

    归根到底是统计学问题

    AR 系统没有“可行”或者“不可行”一说。 大部分情况下,AR 系统可以很好的完成工作。AR 系统力求变得“更好”,也是推动统计学发展的事情。

    故而,不要完全相信 AR APP 的演示,特别是发布于 YouTube 上,显示出惊人的效果的 AR APP。在精心安排的环境中所表现的效果与现实生活中普通用户所能获得的效果之间,往往存在很大差距。但是智能手机或 VR 应用的演示通常并不存在这种问题。所以,观众常常被愚弄。

    在上面的图像中,有一个网格,表示相机中的数字图像传感器。每个格子都是一个像素点。为了稳定追踪,在假设设备完全静止的情况下,每个像素应该在现实世界中的有一个相匹配的对应点。然而,右侧图像显示光子不是那么的听话,各种光子会随意落到任何地方,每个像素点是光子的总数。场景中的光线变化(太阳光穿透云层,荧光灯闪烁等)也会改变传感器中的光子组成,现在传感器要对应现实世界的不同像素点。那么,这样的情况下视觉追踪系统就认为用户移动了!

    所以,各种 ARKit demo 中光点闪烁时,系统必须确定哪些点是“可靠”的。系统对这些点进行三角测量来计算用户的空间位置,求平均数后得到对实际位置的最佳估计数。因此,为确保错误的统计完全被移除,便需要研发更精确的系统。这就需要相机硬件堆栈(多个镜片和涂层、快门和图像传感器等)、IMU 硬件和软件算法之间的严密集成和校准。

    下面是两个校准方法

    光学校准

    上图中,一个虚拟物体茶杯被放在了现实世界的桌子上。

    当周围环境光线较好时,摄像机捕捉到的图像光照强度也较好,此时,我们放在桌子上的茶杯看起来就比较贴近于现实效果,如上图最左边的图。但是当周围光线较暗时,摄像机捕捉到的图像也较暗,如上图中间的图,此时茶杯的亮度就显得跟现实世界格格不入。

    针对这种情况,ARKit 提供了光学校准,开启光学校准后,我们可以拿到当前图像的光照强度,从而能够以更自然的光照强度去渲染虚拟物体,如上图最右边的图。

    光学校准基于当前捕捉到的图像的曝光等信息,给出一个估计的光照强度值(单位为 lumen,光强单位)。默认的光照强度为 1000lumen,当现实世界较亮时,我们可以拿到一个高于 1000lumen 的值,相反,当现实世界光照较暗时,我们会拿到一个低于 1000lumen 的值。

    ARKit 的光学校准默认是开启的,当然也可以通过下述方式手动配置:

    configuration.isLightEstimationEnabled = true

    获取光学校准的光照强度也很简单,只需要拿到当前的 ARFrame,通过以下代码即可获取估计的光照强度:

    let intensity = frame.lightEstimate?.ambientIntensity

    惯性校准

    对于 IMU 来说,测量加速度比测量距离或速率更加重要。IMU 的读取错误随着时间的推移不断累积,产生误差的速度非常快!校准和建模的目标是确保距离的测量在每秒钟 X 等分时间下的精度足够高。理想情况下,这个时间段要足够长,以减少当镜头被遮盖或场景中发生其他情况时,导致摄像机丢失对几帧画面的追踪。

    使用 IMU 测量距离称为航位推算。这基本算是一个猜测,对 IMU 收集的数据进行建模,确定积累错误的方式,然后编写过滤器来减小误差。想象一下,如果你被要求迈出一步,然后猜测迈出的步子有多大。只猜测迈出一步的距离会产生很高的误差。但是,如果你反复迈出千步并猜测每一步的距离,所产生的误差便会非常小。因为你对于踏出哪只脚、地板的种类、鞋子的款式、移动速度的快慢、身体状态的好坏等等熟知,那么你最终的猜测便会非常准确。基本的 IMU 校准和建模便是这一原理。

    数据有很多误差来源。机器臂通常以完全相同的方式重复地移动设备,捕获 IMU 的输出并写入滤波器,直到来自 IMU 的输出与来自机器臂的移动精确匹配。为进一步减小额外的误差,Google、微软甚至在国际空间站(ISS)及“零重力飞机”在微型重力环境下进行校准。

    实际上,达到真正的精准度,比嘴上说说难的多。OEM 厂商必须对所有设备进行校准,即使许多设备有不同的 IMU(例如,Galaxy 7 可能有来自 Invensense 和 Bosch 的 IMU,当然 Bosch 不适用于 Invensense)。当然,这是苹果相对于 Android OEM 厂商的另一个优势所在。

    相关文章

      网友评论

      • cocoDevil:可以加个demo,毕竟talk => coding

      本文标题:详解iOS之ARkit为何碾压对手(二)

      本文链接:https://www.haomeiwen.com/subject/hfwcpxtx.html