是否可以使用来自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。所以你不可能真正得到百分比变化(没有任何意义),但你可以得到米尺度精度的绝对变化。
不,这是不可能的。不好意思。
有一篇很好的论文解释了为什么这是不可能的,但我目前找不到它。如果我找到它,我会发布一个链接。
但是,是的,仅使用加速度计等测量移动的距离是不可能的,这主要是由于双积分大大增加了噪声。
编辑
另外,我认为您混淆了Attitude
和Altitude
.
前者是使用横滚、俯仰、偏航等描述设备方向的对象......CMDeviceMotion
的attitude
属性。
后者是海拔高度,无法通过iOS获得。您可以在iOS中获得的唯一altitude
是地球上特定点高于海平面的高度。但是你不能得到设备的高度,只能得到地面的高度。
无论哪种方式,这仍然是不可能的。
编辑
这不是一篇论文。这是一个视频。
https://www.youtube.com/watch?v=_q_8d0E3tDk