iOS核心动作检测前/后倾斜

时间:2013-12-04 15:51:04

标签: ios core-motion

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

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

更多详情:

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

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

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

感谢基督徒

4 个答案:

答案 0 :(得分:4)

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

  • 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)))

答案 1 :(得分:0)

试试这个:

// 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.x y:accelerometerData.acceleration.y z:accelerometerData.acceleration.z];
    }];
}

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

答案 2 :(得分:0)

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

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

考虑到这一点看起来非常明显,你不能将手机向前或向后倾斜。

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

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

答案 3 :(得分:0)

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

使用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,大致是直线向上。

相关问题