ARKit - Virtual Ruler Demo 中,怎样精确测量实际距离

首先,目前ARKit的要求是iphone 6s之后的机型。A9芯片集成了M9运动协处理器,具有良好运动监测的特性。
ARKit requires an iOS device with an A9 or later processor. 【ARKit - Virtual Ruler Demo 中,怎样精确测量实际距离】 这个Demo实际运行在复杂的立体环境中,效果确实与作者描述的误差相近。(误差 2cm)
ARKit - Virtual Ruler Demo 中,怎样精确测量实际距离


答问题描述中的几个问题:
Accelormeter 加速度传感器 精度 足够高吗? Accelormeter会得出移动的大体方向,具体数值不够的部分会用物理世界特征做计算。real time 做到误差 2cm , 是否需要使用 Bundle Adjustment 呢?在2D的特征重投影回三维域的一些实现,在接下来的会说一下。是否需要物理世界 pattern 做 calibration 呢?自动 calib 可以满足 2cm 精度需求么?这个主要依赖于苹果ARKit内部的一些实现。在实际使用中有时候是会出现超过2cm的偏差发生(也可是能是我的桌子太乱了=_=||),期待有更详尽的测试出现。

关于作者在代码中具体的实现过程,简单分析如下。
比较核心的部分关于“在2D的特征重投影回三维域”的一些实现:
func worldPositionFromScreenPosition(_ position: CGPoint, objectPos: SCNVector3?, infinitePlane: Bool = false) -\u0026gt; (position: SCNVector3?, planeAnchor: ARPlaneAnchor?, hitAPlane: Bool) 1. Always do a hit test against exisiting plane anchors first. (If any such anchors exist \u0026amp; only within their extents.)首先在SceneKit的模拟世界中 做一个 触摸点击的测试。用来判断 是否已经存在计算好的平面。有的话直接返回坐标的值,这是最好的结果。let planeHitTestResults = sceneView.hitTest(position, types: .existingPlaneUsingExtent) if let result = planeHitTestResults.first { let planeHitTestPosition = SCNVector3.positionFromTransform(result.worldTransform) let planeAnchor = result.anchor // Return immediately - this is the best possible outcome. return (planeHitTestPosition, planeAnchor as? ARPlaneAnchor, true) } 2. Collect more information about the environment by hit testing against the feature point cloud, but do not return the result yet.如果上一个判断条件没有得出最优解,则在场景中收集更多信息。继续运用触摸点击的测试。收集信息到一个Array里面,收集之后先不要结果结果。var featureHitTestPosition: SCNVector3? var highQualityFeatureHitTestResult = false let highQualityfeatureHitTestResults = sceneView.hitTestWithFeatures(position, coneOpeningAngleInDegrees: 18, minDistance: 0.0, maxDistance: 0.05) if !highQualityfeatureHitTestResults.isEmpty { let result = highQualityfeatureHitTestResults featureHitTestPosition = result.position highQualityFeatureHitTestResult = true } 3. If desired or necessary (no good feature hit test result): Hit test against an infinite, horizontal plane (ignoring the real world).如果需要的话,则统一使用一个无限大的水平平面 进行触摸点击的测试。保证按照特定的参考物一定会返回值。


推荐阅读