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

检测360°;使用陀螺仪的iOS设备旋转,ios,objective-c,cocoa-touch,gyroscope,Ios,Objective C,Cocoa Touch,Gyroscope,我希望我的应用程序能够在设备水平放置时检测到设备旋转。我可以使用指南针的读数,但我相信陀螺仪的偏航值会更准确。给定偏航读数,确定360°旋转(顺时针或逆时针)的最佳算法是什么。它必须是一个完整的360°,而不仅仅是在一个方向将手机旋转180°,在另一个方向将手机向后旋转180°。您可以使用CoreMotion来获得绕垂直轴的旋转。您需要添加旋转事件的增量。每次超过一个最小值的方向与上一次不同时,都会重置起点。然后,当你从这个起点到达正负360度时,你就有了旋转。这里有一个想法,假设你可以在短时间

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

您可以使用CoreMotion来获得绕垂直轴的旋转。您需要添加旋转事件的增量。每次超过一个最小值的方向与上一次不同时,都会重置起点。然后,当你从这个起点到达正负360度时,你就有了旋转。

这里有一个想法,假设你可以在短时间内获得读数,并且偏航可以在一个特定的起点归零。这与另一个答案不同,后者从不断调整的起点检测整圈

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

假设您的对象有两个属性,它们在检测器的
tick
s之间保持不变,
boolcp\u pi和<代码>浮动前偏航,我们认为 Dyayou小于0,大于<>代码> PI/<代码>。穿过另一端时,我们切换
cp\u pi
。当跨越0时,
cp\u pi
YES
时,我们保证已经通过了一整圈-否则,
cp\u 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;
}
-(无效)勾选
{
浮动偏航=[自调零偏航];
如果((fabs(偏航)=PI)| |(偏航==0.0f))返回;
如果(偏航*前偏航<0)
{
浮动d_偏航=fabs(偏航-前偏航);
如果(d_偏航>PI)
{
cp_-pi=!cp_-pi;
}
否则如果(cp_pi)
{
//火灾探测事件
}
}
前偏航=偏航;
}

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

是的,CoreMotion使用陀螺仪和指南针的组合来提供更精确和准确的设备方向读数。如果我在一个方向上穿过180°,会怎么样,然后以相反的方向向0?方向返回180°?它仍然会算作一个旋转吗?这很好,因为
cp\u pi=!cp_pi
将在第二个十字路口翻转回
,因此它不会被检测为旋转。如果您随后在另一时间掉头完成整圈,
cp_pi
将在+/-
pi
处再次翻转到
,事件最终将在0处触发。所以只有完整的圆圈才算数。嘿,这是一个非常好的解决方案。。plz你能告诉zeroedYaw做什么吗?@AbmedZ.,
zeroedYaw
必须返回介于
-PI
PI
之间的偏航角,该偏航角围绕初始偏航归零。