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它,我会发布一个链接。
但是,测量距离只是使用加速度计等…是不可能的,主要是由于双重整合大大增加了噪音。
编辑
另外,我觉得你很迷惑Attitude
和Altitude
。
前者是描述使用滚动,俯仰,偏航等设备的方向的对象… CMDeviceMotion
的attitude
属性。
后者是海拔高度,无法通过iOS获得。 iOS中唯一的altitude
就是地球上特定点的高度在海平面之上。 但是你不能得到设备的高度,只是地面的高度。
无论如何,这仍然是不可能的。
编辑
这不是一个文件。 这是一个video。
在较新的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.所以你不能真正得到一个百分比的变化(没有任何意义),但你可以得到绝对的米级精度的变化。
- 为什么CMDeviceMotionHandler从来没有被CoreMotion调用?
- iOS – 如何判断设备是否被触发(CoreMotion)
- 相对于世界的DeviceMotion – multiplyByInverseOfAttitude
- 加速度计低通滤波器平滑
- 如何用CMMotionManagerreplaceUIAccelerometer?
- Motion Manager不在Swift中工作
- CoreMotionActivityManager返回Automotive或Automotive + Stationary true
- iPhone上的CoreMotion Bump vs. Shake
- 寻找iOS设备的正常vector