2010-10-09 11 views
9

मैंने एक्सेलेरोमीटर को पढ़कर एक आईफोन के साथ किए गए चरणों को मापने के कई तरीकों की कोशिश की है, लेकिन कोई भी बहुत सटीक नहीं रहा है। मैंने उपयोग किया गया सबसे सटीक कार्यान्वयन निम्न है:मैं इस pedometer एल्गोरिदम की सटीकता में सुधार कैसे करूं?

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

उत्तर

2

ठीक है, मैं इस कोड संभालने हूँ addAcceleration समारोह के भीतर

-(void)addAcceleration:(UIAcceleration*)accel 

तो, आप का पता लगाने के एक अधिक विस्तृत रूप से प्राप्त करने के लिए अपने नमूना दर को बढ़ा सकता है है ...। तो उदाहरण के लिए, यदि आप वर्तमान में प्रति सेकंड 30 नमूने ले रहे हैं, तो आप इसे 40, 50, या 60 आदि तक बढ़ा सकते हैं ... फिर तय करें कि आपको अपने बाउंस के भीतर आने वाले कई नमूने गिनने की आवश्यकता है और उस पर विचार करें कदम। ऐसा लगता है कि आप कुछ बाउंस खोने के कारण कुछ कदमों की गणना नहीं कर रहे हैं।

इसके अलावा, टॉगलिंग का उद्देश्य क्या है? X संख्याओं के बाद आप रीसेट के साथ काउंटर का उपयोग नहीं करना चाहिए? आप अपने ईमेल पते की वैधता के भीतर हैं ...

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

आप इस मिठाई हाजिर हिट करने के लिए 2 बार के लिए होता है, लेकिन जिस तरह से आप यह निर्धारित किया है ऊपर, यह एक पंक्ति में लगातार दो नमूने नहीं हो सकता है, तो यह हो सकता है पहला नमूना और 5 वां नमूना, या दूसरा नमूना और एक 11 वां नमूना। यही वह जगह है जहां आप चरण गणना खो रहे हैं।

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; 
    } 
संबंधित मुद्दे