iOS CoreMotion - 计算高度差



是否可以使用来自CoreMotion的数据计算iPhone移动时的高度差异?

例如,保存iPhone的初始位置,然后移动iPhone,从而产生新位置。我有兴趣检测iPhone的高度是否从其初始位置移动。我不需要绝对单位,只需要一个相对值,指示高度与其原始高度相比变化的百分比。

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?
    }
}

在较新的iPhone上,确实可以从随附的气压计(可从iPhone 6获得)中获得相对高度。核心运动已扩展以适应这一点。

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。所以你不可能真正得到百分比变化(没有任何意义),但你可以得到米尺度精度的绝对变化。

不,这是不可能的。不好意思。

有一篇很好的论文解释了为什么这是不可能的,但我目前找不到它。如果我找到它,我会发布一个链接。

但是,是的,仅使用加速度计等测量移动的距离是不可能的,这主要是由于双积分大大增加了噪声。

编辑

另外,我认为您混淆了AttitudeAltitude.

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

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

无论哪种方式,这仍然是不可能的。

编辑

这不是一篇论文。这是一个视频。

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

最新更新