iOS核心运动检测向前/向后倾斜

问题描述 投票:0回答:5

我正在使用iOS核心运动框架来检测设备是否向前或向后倾斜。详情请看图:https://i.stack.imgur.com/2Ojw5.jpg

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

更多详情:

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

音高的问题是,如果设备处于直立位置,音高的起始值约为 1.6。当我向前或向后将其向水平部分倾斜时,该值会减少相同的值。同样的行为也适用于加速度计 y 值。

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

谢谢基督徒

ios core-motion
5个回答
8
投票

使用姿态俯仰,前倾和后倾是无法区分的。然而,使用四元数你可以计算音高,如果你将弧度转换为度数,

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

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 值。


0
投票

你是对的,考虑到 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


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(近似垂直向上)来查看它是向前还是向后倾斜。


0
投票

同时使用俯仰和横滚。如果滚动(从 -180 度到 180 度变化)小于 -90 度或大于 90 度,则面朝下。当设备的俯仰超过顶部(达到 90 度,然后继续减小)时,滚动切换表示相当于 180 度翻转。在两者之间,即使方向锁已启用,您也可以确定设备面向的方向。

© www.soinside.com 2019 - 2024. All rights reserved.