版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。

  第4代iPad Pro和iPhone12高端机型中新增了LiDAR(Light Detection And Ranging,激光探测与测距)传感器,该传感器的加入让移动设备获得了对物理环境的实时重建能力,因此可以实现诸如环境遮挡、虚实物理交互等利用单目或者双目计算机视觉扫描很难实现的效果,还可以有效弥补计算机视觉对弱纹理表面识别能力差的缺点,轻松实现对白墙、反光等物理表面的深度信息采集。

  LiDAR工作原理与RADAR(Radio Detection And Ranging,雷达)相似,在工作时,LiDAR向空中发射激光脉冲,这些脉冲一部分会在接触物体后被物体吸收,而另一部分则会被反射,反射的激光被接收器捕获,利用发送与接收信号的时间差即可计算出距离。

  通过使用LiDAR,ARKit可以快速获取到用户面前物理世界的深度(距离)信息,也即ARKit不需要移动就可以快速获取到物理世界物体表面的形状信息。利用LiDAR获取到的深度信息(一个一个离散的深度点),ARKit就可以将这一系列的表面点转换成几何网格。为更好的区分物体属性,ARKit并不会将所有表面点转换成一个几何网格,而是按照ARKit所理解的物体属性(门、窗、地板、天花板等)划分到不同的几何网格中,每一个几何网格使用一个ARMeshAnchor进行锚定。因此,ARKit重建的三维环境包含很多ARMeshAnchor,这些ARMeshAnchor也描述了用户所在物理环境的性质。

  LiDAR精度很高,因此,ARKit对物理环境的重建精度也很高,包括物体中间的空洞、锐利的尖角等都可以被检测到。LiDAR速度很快,因此,ARKit对物理环境的重建速度也可以达到毫秒级水平,对物体表面、平面的检测也非常快,而且不再要求用户移动设备进行环境感知。

  对开发者而言,更重要的是我们并不需要关心LiDAR的具体细节,ARKit进行了良好的处理,就像不需要了解运动传感器的具体细节一样,在开发应用时对底层硬件是无感知的,所有的API均未发生变化。

(一)、场景几何

  在ARKit中,通过将LiDAR采集到的物理环境深度信息转化为几何网格,就可以对物理环境进行三维重建,生成的环境网格数据,这被称为场景几何数据(Scene Geometry),如下图所示。

  在上图中,左图为物理世界中的物体,中图为通过LiDAR建的物体表面几何网格,右图为实物与数字几何网格叠加示意图。通过上图我们可以看到,ARKit使用术语“场景几何”相比“场景模型”描述更精确,在AR中,用户探索物理环境时获取到的只是物体可见面表面几何信息,物体背面几何信息无法获取到,因此,并没有建立场景的完整三维模型。

  利用场景几何数据,ARKit还通过深度学习对现实世界中的物体进行分类,目前共支持8种对象分类,由ARMeshClassification枚举描述,如下表所示。

枚举项 描述
none ARKit未能识别的分类
wall 现实世界中的墙或类似的垂直平面
floor 现实世界中的地面或类似的水平平面
ceiling 现实世界中的屋顶水平面或者类似的比用户设备高的水平平面
table 现实世界中的桌面或者类似的水平平面
seat 现实世界中的椅面或者类似水平页面
door 现实世界中的各类门或者类似垂直平面
window 现实世界中的各类窗或者类似垂直平面

  在ARKit中,每一个对象分类都使用一个ARMeshAnchor进行锚定,可以通过ARMeshAnchor的geometry属性获取到其关联的表面几何网格信息。ARMeshAnchor会随着ARKit对环境的理解加深不断的更新其关联的数据,包括表面几何网格信息,因此,当物理环境发生变化时(如一张椅子被移走),ARMeshAnchor会捕捉到相关信息并更新表面几何网格信息来反映该变化,但需要注意的是,ARMeshAnchor会自主决定在适当的时机进行更新,所以这个更新并不是实时的。

  Geometry属性为ARMeshGeometry类型,几何网格数据被存储在该类的数组中。从LiDAR采集的深度信息为离散点,ARKit以这些离散点作为几何网格的顶点,每3个顶点构建成一个面(face),每一个面都包括一个外向的法向和一个其所属的分类信息(Classification信息,如果ARKit未能成功分类,那么该值为0,表示ARMeshClassification.none)。因此,通过geometry可以获取到ARMeshAnchor所关联的所有几何网格顶点、法向、分类等信息。

  利用场景几何数据就可以轻松的实现诸如虚实遮挡、虚实物理交互功能,甚至可以利用虚拟光源着色物理环境表面。

  获取场景几何数据需要在ARWorldTrackingConfiguration中设置重建类型,典型的代码如下代码所示。

arView.automaticallyConfigureSession = false
let config = ARWorldTrackingConfiguration()
if(ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification))config.sceneReconstruction = .meshWithClassification
config.planeDetection = .horizontal
//arView.debugOptions.insert(.showSceneUnderstanding)
arView.session.run(config, options: [])
//arView.session.run(config, options: [.resetSceneReconstruction])

  上述代码首先判断设备是否支持场景重建,只有配备了LiDAR的设备才支持场景重建功能,supportsSceneReconstruction()方法接受一个ARConfiguration.SceneReconstruction结构类型参数,用于描述重建类型,ARConfiguration.SceneReconstruction结构包含两个属性,如下表所示。

选项 描述
mesh 重建物理环境表面几何网格
meshWithClassification 重建物理环境表面几何网格,并根据物体的网格属性进行分类

  当设备支持指定类型的场景重建后,设置ARWorldTrackingConfiguration中sceneReconstruction属性为指定类型参数后即可开启场景重建功能。这里需要注意的是,如果ARView.automaticallyConfigureSession=true时,ARKit默认会禁止网格物体分类,使用网格分类时需要设置该值为false,并手动设置场景重建类型为meshWithClassification。

  开启场景重建功能后,用户并不能看到重建后的网格信息(在实际AR应用中,用户也不必要看见重建后的几何网格),在调试时,可以通过arView.debugOptions.insert(.showSceneUnderstanding)语句渲染重建后的网格。

  在开启场景重建功能后,ARKit会根据检测到的物理环境表面深度信息及分类信息生成ARMeshAnchors,与所有其他类型ARAnchor一样,我们可以通过ARSessionDelegate协议中的session(:didAdd:)、session(:didUpdate:)、session(:didRemove:)方法对ARMeshAnchors变化情况进行相应处理。

  如果需要重置场景重建功能,需要在重置ARSession运行时传入.resetSceneReconstruction选项,执行语句类似如arView.session.run(config, options: [.resetSceneReconstruction])。

  在开启场景重建时,ARKit可以采集到物理环境中物体表面精确的几何网格信息,这些网格信息可以高精度的反映物体表面的形状,包括凸包、凹洞、裂缝等信息,因此这些表面网格可能并不平整。当同时开启平面检测时,如上述代码所示,ARKit在重建场景时会考虑到平面检测需要,一些物体表面网格会被展平以方便放置虚拟物体。这样处理的原因是,如果物体表面凸凹不平,放置虚拟物体后,当移动虚拟物体时,虚拟物体会出现上下颠簸的现象,这在很多情况下并不符合现实规律。

ARKit之路-LiDAR传感器(一)相关推荐

  1. ARKit之路-Depth API

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载.   在配备LiDAR传感器的设备上,ARKit不仅可以进行场景几何重建,还向开发者开放了场景深度信息,利用这些深度信息,可 ...

  2. ARKit之路-ARKit概述之二

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载.   ARKit需要运行在iOS11以上的iPhone与iPad上.AR应用属于计算密集型应用,对计算硬件要求较高,就算在应 ...

  3. ARKit之路-ARKit原理

    版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载.   ARKit提供如此出众AR体验的背后是苹果公司强大的软硬件整合能力和做到极致的用户体验,苹果公司的生态拥有其他企业无法 ...

  4. 四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

    目录 前言: 小车效果展示: 5路数字灰度传感器: 巡线思路: 加入PID调节的代码: 前言: 之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当 ...

  5. STM32控制3路超声波传感器

    使用STM32定时器输入捕获模块控制3路超声波传感器 本次使用的超声波传感器是常见HC-SR04,该传感器常常使用在小型机器人和智能小车的避障系统中. 在上图中,5v和GND为模块提供电能,Trig用 ...

  6. 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用

       我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...

  7. 计算机键盘电容传感器,12路电容式触摸传感器键盘 IIC接口单键触摸键盘传感器模块...

    产品介绍: 奥松机器人推出一款IIC触摸传感器也称12路电容式触摸传感器,I2C触摸传感器是基于接近电容式触摸传感器控制器的飞思卡尔- mpr121.这款传感器可以与Arduino简单连接,能检测到人 ...

  8. 五路循迹传感器的优点_5路红外线传感器控制智能小车循迹,27秒走完所有站点...

    5路红外线循迹智能小车27秒走完比赛地图 为了指导学生参加2017年广东省机器人挑战赛自选项目"高铁时代"的比赛,我改进了某厂家的arduino智能小车,把红外线循迹传感器从2路增 ...

  9. ARKit之路-ARKit概述之一

      2017年,在WWDC(World Wide Developers Conference,苹果全球开发者大会)上,苹果公司正式推出了增强现实开发套件ARKit.ARKit一推出即在科技圈引发极大关 ...

最新文章

  1. [置顶] Codeforces Round #190 (Div. 2)(完全)
  2. JS 新浪下拉菜单+jQuery
  3. c语言中循环结构的作用,C语言循环结构知识点
  4. linux 删除o开头的文件,linux实现除了某个文件或某个文件夹以外的全部删除
  5. springboot controller调用service_绝了!Dataway让SpringBoot不在需要Controller、Service、DAO......
  6. 《系统集成项目管理工程师》必背100个知识点-75配置标识的基本内容
  7. p标签里面不能嵌套div
  8. Angular 内容投影 content projection 关于选择器问题的单步调试
  9. ffmpeg转码_音视频处理神器FFmpeg
  10. 1094:零起点学算法01——第一个程序Hello World!
  11. 2018今日头条春招面试题
  12. 类和对象编程(六):内联函数
  13. 开发一个最简单的Cardboard虚拟现实应用(四)做一个Cardboard第一人称控制器
  14. 【Flex Viewer】源码介绍(2)Flex Viewer源码包结构
  15. CSS中单位rem的使用说明
  16. 时间选择器(timepicker)用法
  17. 长得好看,但没有男朋友是怎样的体验?
  18. 类和对象8:数值方法
  19. Download.Accelerator.Plus.v10.0.4.3_Patch-REPT
  20. Xrm.Utility.openEntityForm 时404.15 maxQueryString 错误 和 长度超过maxQueryStringLength值 错误

热门文章

  1. 计算机课程可信计算,可信计算-表7.计算机学院(系、所)研究生课程简介.doc...
  2. 【openstack-rally】使用rally执行tempest api测试并导出测试报告
  3. 【渝粤题库】陕西师范大学202015 法律职业伦理 作业
  4. 专业mac绘图软件:FireAlpaca for Mac
  5. IC卡读卡器调用php,IC卡读卡器如何进行IC卡的读卡?
  6. 【Day1】一小时入门 python 基础,从安装到入门
  7. SAP FICO - 简介(重要概念)
  8. 《iOS APP 性能检测》
  9. sparse_categorical_crossentropy的使用
  10. scribed 安装