[英]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.