我希望我的应用能够在设备水平放置时检测到设备旋转。我可以使用指南针的读数,但我相信陀螺仪的偏航值会更准确。给定偏航读数,确定 360° 旋转(顺时针或逆时针)的最佳算法是什么。它必须是一个完整的 360°,而不仅仅是将手机向一个方向旋转 180°,然后在相反方向返回 180°。
问问题
2597 次
2 回答
3
您将使用 CoreMotion 来获得围绕垂直轴的旋转。您需要添加旋转事件的增量。每次超过最小值时,其方向都与上一次不同时,您会重置起点。然后,当你从这个起点到达正负 360 度时,你就有了旋转。
于 2013-01-14T06:18:05.853 回答
2
这是一个想法,假设您可以在短时间内获得读数,并且偏航可以在特定起点归零。这与另一个答案不同,后者从连续调整的起点检测完整的圆圈。
在这种方法中,我们不断将当前偏航角与之前的偏航角进行比较,询问是否通过了 180 度的检查点或PI
是否已通过。最初,检查点标志cp_pi
是NO
,并且在任一方向传递它都会切换其状态。请注意,yaw 在两个位置改变其符号,在零点和再次在PI
to -PI
。
tick
假设您的对象具有两个在检测器的 s 和BOOL cp_pi;
之间持续存在的属性float prev_yaw;
,我们认为它d_yaw
小于PI
穿过 0 并且大于PI
穿过圆的另一端。当穿过另一端时,我们切换cp_pi
。当cp_pi
是YES
越过 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;
}
请注意,为了让我们的生活更轻松,如果检测器yaw
正好位于其中一个检查点上,我们将完全跳过检测器功能。
于 2013-01-14T06:22:31.087 回答