使用陀螺仪检测 iOS 设备 360° 旋转

thi*_*zy4 5 cocoa-touch objective-c ios gyroscope

我希望我的应用程序能够在设备水平放置时检测设备旋转。我可以使用指南针的读数,但我相信陀螺仪的偏航值会更准确。给定偏航读数,确定 360\xc2\xb0 旋转(顺时针或逆时针)的最佳算法是什么。而且它必须是完整的 360\xc2\xb0,而不只是将手机向一个方向转动 180\xc2\xb0,然后向相反方向转动 180\xc2\xb0。

\n

s.b*_*ara 2

这里的想法是假设您可以在短时间内获得读数,并且可以在特定的起始点将偏航归零。这与其他答案不同,后者从不断调整的起点检测整圆。

在这种方法中,我们不断将当前偏航与之前的偏航进行比较,询问是否已通过 180 度的检查点PI。最初,检查点标志cp_piNO,向任一方向传递它都会切换其状态。请注意,偏航在两个地方改变其符号,即在零点处和在PI-PI

tick假设您的对象具有两个在检测器的 sBOOL cp_pi;和之间持续存在的属性float prev_yaw;,我们认为d_yaw小于PI穿过 0 的情况,大于PI穿过圆另一端的情况。当穿过另一端时,我们切换cp_pi。当cp_piYES跨越 0 时,我们保证已经通过了一个完整的圆 - 因为否则,cp_pi将被切换回NO

-(void)tick
{
    float yaw = [self zeroedYaw];
    if ((fabs(yaw) == PI) || (yaw == 0.0f)) return;

    if (yaw * prev_yaw < 0)
    {
        float d_yaw = fabs(yaw - prev_yaw);
        if (d_yaw > PI)
        {
            cp_pi = ! cp_pi;
        }
        else if (cp_pi)
        {
            // fire detection event
        }
    }
    prev_yaw = yaw;
}
Run Code Online (Sandbox Code Playgroud)

请注意,为了让我们的生活更轻松,如果探测器正好yaw位于其中一个检查点,我们将完全跳过探测器功能。