thi*_*zy4 5 cocoa-touch objective-c ios gyroscope
我希望我的应用程序能够在设备水平放置时检测设备旋转。我可以使用指南针的读数,但我相信陀螺仪的偏航值会更准确。给定偏航读数,确定 360\xc2\xb0 旋转(顺时针或逆时针)的最佳算法是什么。而且它必须是完整的 360\xc2\xb0,而不只是将手机向一个方向转动 180\xc2\xb0,然后向相反方向转动 180\xc2\xb0。
\n这里的想法是假设您可以在短时间内获得读数,并且可以在特定的起始点将偏航归零。这与其他答案不同,后者从不断调整的起点检测整圆。
在这种方法中,我们不断将当前偏航与之前的偏航进行比较,询问是否已通过 180 度的检查点PI。最初,检查点标志cp_pi为NO,向任一方向传递它都会切换其状态。请注意,偏航在两个地方改变其符号,即在零点处和在PI处-PI。
tick假设您的对象具有两个在检测器的 sBOOL 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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,为了让我们的生活更轻松,如果探测器正好yaw位于其中一个检查点,我们将完全跳过探测器功能。
| 归档时间: |
|
| 查看次数: |
2718 次 |
| 最近记录: |