2010-10-09 80 views
9

我已經嘗試了幾種方法來測量用戶通過讀取加速度計所做的步驟,但沒有一個非常準確。我用最準確的實現如下:如何提高此計步器算法的準確度?

float xx = acceleration.x; 
float yy = acceleration.y; 
float zz = acceleration.z; 

float dot = (mOldAccX * xx) + (mOldAccY * yy) + (mOldAccZ * zz); 
float a = ABS(sqrt(mOldAccX * mOldAccX + mOldAccY * mOldAccY + mOldAccZ * mOldAccZ)); 

float b = ABS(sqrt(xx * xx + yy * yy + zz * zz)); 

dot /= (a * b); 

if (dot <= 0.994 && dot > 0.90) // bounce 
{ 

    if (!isChange) 
    { 

    isChange = YES; 
    mNumberOfSteps += 1; 

    } else { 
    isChange = NO; 
    } 
} 

mOldAccX = xx; 
mOldAccY = yy; 
mOldAccZ = zz; 
} 

但是,這僅捕獲用戶的步驟80%。我如何提高計步器的準確度?

+5

乘你的答案的一個因素添加缺少的20% - 我敢打賭,這就是便宜的計步器 - 他們有一個敏感的撥號在他們;) – deanWombourne 2010-10-09 19:49:24

回答

2

好吧,我假設這個代碼是addAcceleration函數內...

-(void)addAcceleration:(UIAcceleration*)accel 

所以,你可以增加你的採樣率,以獲得檢測的更細的粒度。因此,例如,如果您目前每秒採樣30個樣本,則可以將其增加到40,50或60等等。然後決定是否需要計算一些落在您的反彈範圍內的樣本數量,並考慮單個樣本步。這聽起來像你沒有計算一些步驟,因爲錯過了一些反彈。

此外,什麼是切換isChange的目的?在x次計數後不應該使用計數器進行重置嗎?如果您是反彈中......

if (dot <= 0.994 && dot > 0.90) // bounce 

,你將不得不打這個甜蜜點的2倍,但你已經設置的方式,它可能不是連續兩個連續的樣本,它可能是第一樣品和第五樣品,或第二樣品和第十一樣品。那是你失去步數的地方。

1

請記住,不是每個人都採取同樣的大步驟。所以點的計算應該根據某人的長度,步長來調整。

您應該相應地調整反彈閾值。試着讓程序瞭解它的乘客。

3

下面是檢測每個步驟的更精確答案。但是,在我的情況下,我每25步就得到+或 - 1步。所以我希望這可能對你有所幫助。 :)

if (dot <= 0.90) { 
    if (!isSleeping) { 
     isSleeping = YES; 
     [self performSelector:@selector(wakeUp) withObject:nil afterDelay:0.3]; 
     numSteps += 1; 
     self.stepsCount.text = [NSString stringWithFormat:@"%d", numSteps]; 
    } 
} 



- (void)wakeUp { 

     isSleeping = NO; 
    }