iOS核心动作检测forard /向后倾斜

我正在使用iOS核心运动框架来检测设备是向前还是向后倾斜。 有关详细信息,请参见图像: http : //i.stack.imgur.com/2Ojw5.jpg

使用音高值a可以检测到这种运动但我无法区分向前和向后。

更多细节:

我尝试检测前方区域或后方区域是否有移动(向前和向后倾斜)(参见更新的草图)。

音调的问题在于,如果设备处于直立位置,它的值约为1.6。 当我向前或向后倾斜水平部分时,值会减小。 相同的行为适用于加速度计y值。

看起来我错过了整个核心动作的东西。 有任何想法吗

谢谢基督徒

使用姿态音高,前倾和后倾是难以区分的。 但是使用四元数,您可以计算音高,如果将弧度转换为度数,

  • 0表示设备背面
  • 90意味着它站起来了
  • 180意味着它的表面

相反的半球旋转为0到-180。 这是代码:

func radiansToDegrees(_ radians: Double) -> Double { return radians * (180.0 / Double.pi) } let quat = motionData.attitude.quaternion let qPitch = CGFloat(radiansToDegrees(atan2(2 * (quat.x * quat.w + quat.y * quat.z), 1 - 2 * quat.x * quat.x - 2 * quat.z * quat.z))) 

尝试这个:

 // Create a CMMotionManager CMMotionManager *mManager = [(AppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager]; // Check whether the accelerometer is available if ([mManager isAccelerometerAvailable] == YES) { [mManager setAccelerometerUpdateInterval: .02]; [mManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { [self updateGravityWithAccelerometerX:accelerometerData.acceleration.xy:accelerometerData.acceleration.yz:accelerometerData.acceleration.z]; }]; } 

这将每隔0.02秒调用updateGravityWithAccelerometerData。 您应该能够创建该方法并使用NSLog来观察值更改以解密您要查找的内容。 我相信你正在寻找acceleration.y值。

你是对的,考虑到4个典型的象限( http://en.wikipedia.org/wiki/Quadrant_(plane_geometry) )和逆时针方向,音调就是这样的:

  • 象限I ,值范围从0到PI / 2(或0到90度)。
  • 象限II ,值范围从PI / 2到0(或90到0度)。
  • 象限III ,值范围从0到-PI / 2(或0到-90度)。
  • 象限IV ,值范围从-PI / 2到0(或-90到0度)。

考虑到这一点看起来很明显,你不能区分向前或向后倾斜的手机。

我最近遇到了一个iOS应用程序的问题,它计算了手机翻转次数。 Apple拒绝了它,所以我在GitHub上发布了它,可能对你有用:

翻转你的手机!https://github.com/apascual/flip-your-phone

您不希望读取加速度计的倾斜度。 加速度计用于检测运动的差异。 您需要陀螺仪,以便确定绝对姿态(即偏航,俯仰和滚转)。 在你的情况下,听起来你只是想要滚动。

使用startDeviceMotionUpdatesToQueue然后使用attitude.roll进行正面和背面以及使用attitude.pitch进行左右对比。 这是我在Swift中所做的:

  func motion(data: CMDeviceMotion){ let pitch = data.attitude.pitch let roll = data.attitude.roll let dampener:Float = -0.25 // the ball was rolling too fast var forward_force = Float(1.6 - roll) * dampener //1.6 is vertical var side_force = Float(pitch) * dampener // 0 is untilted when rotating cw/ccw ballNode.physicsBody?.applyForce(SCNVector3Make(side_force, 0, forward_force), atPosition: SCNVector3Make(0, 0, 0), impulse: true) 

}

通过这种方式,您可以看到它是向前还是向后倾斜,具体取决于滚动是否大于或等于1.6,大致是直线向上。