ARKit之路-LiDAR传感器(一)

版权声明: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枚举描述,如下表所示。

枚举项描述
noneARKit未能识别的分类
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在重建场景时会考虑到平面检测需要,一些物体表面网格会被展平以方便放置虚拟物体。这样处理的原因是,如果物体表面凸凹不平,放置虚拟物体后,当移动虚拟物体时,虚拟物体会出现上下颠簸的现象,这在很多情况下并不符合现实规律。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_DavidWang_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值