[英]Detect 360° iOS device rotation using gyroscope
我希望我的应用能够在设备水平握持时检测设备旋转。 我可以使用罗盘的读数,但我相信陀螺仪的偏航值会更准确。 给定偏航读数,确定360°旋转(顺时针或逆时针)的最佳算法是什么。 它必须是一个完整的360°,不仅仅是将手机在一个方向上旋转180°,而在相反方向上旋转180°。
您可以使用CoreMotion来获得围绕垂直轴的旋转。 您需要添加旋转事件的增量。 每次超过最小值的方向与前一个方向不同时,您将重置起点。 然后当你从这个起点到达正负360度时,你就有了旋转。
假设您可以在短时间间隔内获得读数,并且偏航可以在特定起点处归零,这是一个想法。 这与另一个答案不同,后者从连续适应的起点检测整圆。
在这种方法中,我们将当前偏航与之前的偏航进行比较,询问是否已经通过180度的检查点或PI
。 最初,检查点标志cp_pi
为NO
,并且以任一方向传递它以切换其状态。 请注意,偏航在两个位置更改其符号,在零点处再次在PI
到-PI
处更改。
假设你的对象有两个在检测器的tick
s之间持久的属性, BOOL cp_pi;
和float prev_yaw;
,我们认为d_yaw
小于PI
,越过0,大于PI
,越过你圈子的另一端。 当越过另一端时,我们切换cp_pi
。 当cp_pi
在穿越0时为YES
时,我们保证已经过了整整一圈 - 否则, 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;
}
请注意,为了让我们的生活更轻松,如果yaw
坐在其中一个检查点上,我们将完全跳过探测器功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.