目标是检测用户侧向移动手机的程度。想象一下,在最简单的情况下,手机是平放在桌子上,主按钮面向天花板。
如果用户沿着桌子左/右滑动手机,你怎么能检测出它被移动的数量?
以下代码似乎没有注册正确的值:
let motionManager = CMMotionManager()
override func update(_ currentTime: TimeInterval) {
processUserMotion(forUpdate: currentTime)
}
func processUserMotion(forUpdate currentTime: CFTimeInterval) {
// 2
if let data = motionManager.accelerometerData {
// 3
if fabs(data.acceleration.x) > 0.2 {
// 4 How do you move the ship?
print("X Acceleration: \(data.acceleration.x)")
}
if fabs(data.acceleration.y) > 0.2 {
// 4 How do you move the ship?
print("Y Acceleration: \(data.acceleration.y)")
}
if fabs(data.acceleration.z) > 0.2 {
// 4 How do you move the ship?
print("Z Acceleration: \(data.acceleration.y)")
}
}
}
答案 0 :(得分:2)
加速度计仅测量加速度。当手机开始向左/向右移动时,您可能会看到一些加速度,当它们停止向左/向右移动时,可能会看到减速度。
理论上,您可以将加速度集成几次以尝试计算位置(在基本物理/微积分中,您可以集成加速度以获得速度,并将速度积分以获得位置)。
实际上,加速度计数据太不准确并且噪声很大,因此在合理的精确度下工作,因为每次积分步骤都会使误差放大。
我建议你改变你的设计,这样你就不会依赖于绝对的位置。或者你可以看看ARKit使用相机和图像处理在世界空间中建立手机位置(虽然它不适用于你躺在桌子上的手机的例子,因为相机什么也看不见)。
如果你想知道,旋转更容易使用的原因是加速度计将重力测量为加速度,因此总是很容易找出哪个方向下降。然后陀螺仪(测量旋转)足够精确,可以很好地建立航向/方位角,并且可以与磁罗盘相结合来纠正累积误差带来的漂移。
使用设备转换替换设备旋转作为控制方法是听起来很简单的事情之一,但实际上非常难/不切实际。