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

Posted

技术标签:

【中文标题】ARSessionConfiguration.WorldAlignment = .gravityAndHeading 的不稳定世界原点/对齐【英文标题】:erratic world origin/alignment for ARSessionConfiguration.WorldAlignment = .gravityAndHeading 【发布时间】:2017-07-04 03:37:15 【问题描述】:

[注意:这个问题是在 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 度异相):

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

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

X 和 Z 点正南和西(90 度异相):

来自.gravityAndHeading documentation:

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

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

【问题讨论】:

这看起来像是一个写得很好的(并且以其他方式记录的)错误报告。 Have you filed one? 还有,整洁的时钟。 也坚持这一点。有谁能在这方面取得进展? 【参考方案1】:

我意识到这是一个旧线程,但是即使发布了 ARKit 2 并且我使用 ios 12、Xcode 10.1 和 iPhone 8,我仍然得到不一致的世界起源。在某些情况下,蓝线应该指向南方,它实际上指向东方或西方。

我确实通过使用位置管理器标题尝试了 Sander 的建议,但仍然不能 100% 保证我一开始就获得了正确的方向。

还有其他建议吗?

【讨论】:

我认为你最好提出一个全新的问题(也许参考这个问题)。我们早已过了 Xcode 9 测试版,您可能会遇到一个完全不同的问题。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

此应用无需额外设置。你的代码没问题。

正如您从 .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。有很多技巧。

【讨论】:

以上是关于ARSessionConfiguration.WorldAlignment = .gravityAndHeading 的不稳定世界原点/对齐的主要内容,如果未能解决你的问题,请参考以下文章