iOS CoreMotion – 计算高度差异

当使用CoreMotion中的数据移动iPhone时,是否可以计算高度差?

例如,iPhone的初始位置被保存,然后移动iPhone导致新的位置。 我有兴趣检测iPhone的高度是否从最初的位置移动。 我不需要绝对单位,只是一个相对值,表示高度已经从原来的高度改变了多less百分比。

let manager = CMMotionManager() // Save initial attitude var initialAttitude = manager.deviceMotion.attitude if manager.deviceMotionAvailable { manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { [weak self] (data: CMDeviceMotion!, error: NSError!) in // Get the difference between the initial and new attitude data.attitude.multiplyByInverseOfAttitude(initialAttitude) // Is there a way to calculate the relative change in height? } } 

不,这是不可能的。 抱歉。

有一个很好的文件解释为什么这是不可能的,但我目前无法find它。 如果我find它,我会发布一个链接。

但是,测量距离只是使用加速度计等…是不可能的,主要是由于双重整合大大增加了噪音。

编辑

另外,我觉得你很迷惑AttitudeAltitude

前者是描述使用滚动,俯仰,偏航等设备的方向的对象… CMDeviceMotionattitude属性。

后者是海拔高度,无法通过iOS获得。 iOS中唯一的altitude就是地球上特定点的高度在海平面之上。 但是你不能得到设备的高度,只是地面的高度。

无论如何,这仍然是不可能的。

编辑

这不是一个文件。 这是一个video。

https://www.youtube.com/watch?v=_q_8d0E3tDk

在较新的iPhone上,确实可以通过附带的气压计获得相对高度 (可从iphone 6获得)。 Core Motion已经扩展到适应这个。

CMAltimeter – 提供海拔变化事件的交付。

CMAltitudeData – 封装海拔变化事件(以米级分辨率)。

这种事情应该工作…

  if CMAltimeter.isRelativeAltitudeAvailable() { altimeter.startRelativeAltitudeUpdatesToQueue(altimeterQueue, withHandler: { ( data:CMAltitudeData?, error: NSError?) in if let altitudeData = data { self.timeStamp = altitudeData.timestamp self.relativeAltitude = altitudeData.relativeAltitude } } ) } 

我们没有得到绝对的高度,只是相对高度的变化。 初始高度被认为是0.所以你不能真正得到一个百分比的变化(没有任何意义),但你可以得到绝对的米级精度的变化。