iOS CoreMotion - 计算高度差
iOS CoreMotion - Calculating Height Difference
是否可以使用 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?
}
}
不,这不可能。对不起。
有一篇很好的论文解释了为什么这是不可能的,但我现在找不到它。如果我找到它,我会 post 一个 link。
但是,是的,仅使用加速度计等测量移动的距离是不可能的,主要是因为二重积分大大增加了噪声。
编辑
此外,我认为您混淆了 Attitude
和 Altitude
。
前者是一个对象,使用roll,pitch,yaw等来描述设备的方向...attitude
属性的CMDeviceMotion
.
后者是海拔高度,无法通过 iOS 获得。您在 iOS 中唯一可以得到的 altitude
是地球上特定点高于海平面的高度。但是无法获取设备高度,只能获取地面高度。
不管怎样,还是不行
编辑
那不是论文。这是一个视频。
在较新的 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。所以你不能真正获得百分比变化(没有任何意义),但你可以获得米级精度的绝对变化。
是否可以使用 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?
}
}
不,这不可能。对不起。
有一篇很好的论文解释了为什么这是不可能的,但我现在找不到它。如果我找到它,我会 post 一个 link。
但是,是的,仅使用加速度计等测量移动的距离是不可能的,主要是因为二重积分大大增加了噪声。
编辑
此外,我认为您混淆了 Attitude
和 Altitude
。
前者是一个对象,使用roll,pitch,yaw等来描述设备的方向...attitude
属性的CMDeviceMotion
.
后者是海拔高度,无法通过 iOS 获得。您在 iOS 中唯一可以得到的 altitude
是地球上特定点高于海平面的高度。但是无法获取设备高度,只能获取地面高度。
不管怎样,还是不行
编辑
那不是论文。这是一个视频。
在较新的 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。所以你不能真正获得百分比变化(没有任何意义),但你可以获得米级精度的绝对变化。