2017-10-04 57 views
0

目标是检测用户移动手机的方向。想象一下,在最简单的情况下,手机平放在桌子上,首页按钮面向天花板。iOS:检测用户移动手机左/右(不旋转,但移动)

如果用户沿着桌面向左/右滑动手机,您如何检测移动的数量?

下面的代码似乎没有登记正确的价值观:

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)") 
     } 
    } 
} 

回答

2

加速度计只能测量加速度。充电时,手机开始向左/右移动时可能会看到一些加速,而在他们停止向左/向右移动时,可能会看到一些加速。从理论上讲,你可以将加速度整合几次来试图计算一个位置(在基本物理/微积分中,你可以将加速度综合成速度,然后把速度积分到位置)。

实际上,加速度计数据太不准确且噪音太大,因此需要合理的精度来工作,因为每个积分步骤都会使误差变大。

我建议你改变你的设计,让你不依赖于绝对位置。或者,您可以查看ARKit,它使用摄像头和图像处理来确定手机在世界空间中的位置(尽管它不适用于躺在桌子上的手机示例,因为相机看不到任何东西)。

如果您想知道,旋转更简单的原因是加速度计会将重力作为加速度来测量,所以确定哪种方式是关闭的总是很简单。然后,测量旋转的陀螺仪足够精确,可以很好地建立航向/方位角,并且可以与磁罗盘结合来纠正由累积误差引起的漂移。

使用设备转换替代设备旋转作为控制方法是听起来很简单但实际上很难/不切实际的事情之一。

+0

谢谢!实际上,这个表格的例子很有意思,简化了这个问题。一个真实的使用案例是用拇指在屏幕上一手握住手机,有点像用一只手玩游戏的标准位置。你是否从这个位置上说,ARKit现在可以让你轻松地测量用户向左/向右移动设备的次数,而在ARKit之前它并不真正实用? – Crashalot

+0

是的,我很确定ARKit可以做到这一点,并且之前没有任何可用的东西。我没有自己使用ARKit,所以我不能说代码融入代码是多么容易,或者它有多准确,或者是否存在其他复杂性(例如,它可能很滞后,或者只能在良好的亮度级别下工作,或者如果你在繁忙的街景上使用它会感到困惑,等等,我只是不知道) – Columbo

+0

够公平的,希望你对ARKit能够做到这一点是正确的! – Crashalot