ARSessionConfiguration.WorldAlignment = .gravityAndHeading的不稳定世界原点/对齐方式

时间:2017-07-04 03:37:16

标签: ios swift arkit

[注意:这个问题是在iOS11 / High Sierra预发行期间针对ARKit测试版编写的。仅保留历史利益]

当我将ARWorldTrackingSessionConfiguration.worldAlignment设置为.gravityAndHeading时,我发现世界原点的位置和方向不稳定。

场景打开后原点的位置稳定。但是轴通常围绕Y轴旋转180度或90度。

我还缺少一个额外的设置吗?我正在运行2017 iPad(香草,而不是Pro)和Xcode 9 beta 2.我已经在这台iPad上测试了几个指南针应用程序并且它们给了我正确的结果,所以我相信硬件运行正常。

override func viewDidLoad() {
    super.viewDidLoad()

    // Set the view's delegate
    sceneView.delegate = self

    // Show statistics such as fps and timing information
    sceneView.showsStatistics = true

    // Create a new scene
    let scene = SCNScene()

    // debug options
    let debugOptions: SCNDebugOptions = [ARSCNDebugOptions.showFeaturePoints,ARSCNDebugOptions.showWorldOrigin]
    sceneView.debugOptions = debugOptions

    // Set the scene to the view
    sceneView.scene = scene
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Create a session configuration
    let configuration = ARWorldTrackingSessionConfiguration()
    configuration.worldAlignment = .gravityAndHeading
    configuration.planeDetection = .horizontal

    // Run the view's session
    sceneView.session.run(configuration)
}

以下是一些样本(在所有样本中我都面向南方)。

正X和Z点向西和北(不正确,180度异相):

enter image description here

正X和Z指向东南和西南(接近正确):

enter image description here

正X和Z指向东和南(正确),但原点移位了几米:

enter image description here

正X和Z指向南和西(相位相差90度):

enter image description here

来自.gravityAndHeading documentation:

  

y轴与设备的运动传感硬件检测到的重力方向相匹配;也就是说,向量(0,-1,0)指向下方。

     

x轴和z轴与位置服务测量的经度和纬度方向匹配。向量(0,0,-1)指向真北,向量(-1,0,0)指向西。 (也就是说,正x轴,y轴和z轴分别指向东,向上和南方。)

4 个答案:

答案 0 :(得分:1)

我意识到这是一个旧线程,但是即使使用ARKit 2版本,并且我正在将iOS 12,Xcode 10.1与iPhone 8配合使用,但世界来源仍然不一致。在某些情况下,蓝线应指向南方,实际上是指向东方或西方。

我确实使用位置管理器标题尝试过桑德的建议,但仍不能100%保证我从正确的方向入手。

还有其他建议吗?

答案 1 :(得分:0)

偶尔会出现随机世界原点,其中Y轴不与重力对齐,但可能倾斜45度。这是在Xcode 9.1(测试版)和iOS 11.0.3上。如果我重置会话,它会正确地重新检测Y轴。 (我正在使用gravityAndHeading)。

至于标题,我在一个新的市中心多层金属/砖/灰泥建筑。室内磁北检测几乎是不可能的。我已经使用许多不同的设备进行了广泛的测试。 (我在做无人机导航)。由于极低的磁场,症状是漂浮的北方。所以有时它会起作用,但在几秒钟内甚至可以改变+ -90度。

看起来你正在室内进行测试,有一些砖墙......

答案 2 :(得分:0)

我遇到了同样的问题。 我的建议是使用CLLocationManager的委托方法来获得真北的解决方法

func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading)

在我的实验中显示出更稳定和正确的结果,尽管有时它们与.gravityAndHeading的北方一样错误。

答案 3 :(得分:0)

  

此应用不需要其他设置。您的代码确定。

如您从.gravityAndHeading文档中引用的那样-由Location Services测量的经度和纬度方向。在Xcode 9 Beta中肯定有一个 bug 碰到Location Services。一年前,我偶然发现了同一个问题。

但是现在,当我使用Xcode 10的正式版本时,一切正常。我在不同的地方(室内和室外)对其进行了一百多次测试。与真实罗盘值的偏差为+2 / -2度。

在iOS 12(16A366)的iPhone X(MQA82LL)上进行了测试。

macOS Mojave 10.14(18A391),Xcode 10.0(10A255)。

此外,请阅读这篇有用且内容丰富的文章:Requesting Always Authorization。有很多技巧。

enter image description here