2010-10-09 18 views
9

Bir kullanıcının ivmeölçer okuyarak bir iPhone ile yaptığı adımları ölçmenin çeşitli yollarını denedim, ancak hiçbiri çok doğru olmadı.Bu pedometre algoritmasının doğruluğunu nasıl geliştirebilirim?

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; 
} 

Ancak bu yalnızca kullanıcının adımların% 80'ini yakalar: Kullandığım en doğru uygulama şudur. Adımsayarımın doğruluğunu nasıl geliştirebilirim?

+5

eksik% 20 eklemek için bir faktörle cevabınızı çarpın - O ucuz adım ölçerler böyle yapar bahis - Üzerlerinde bir duyarlılık kadranı var;) – deanWombourne

cevap

2

Tamam, ben bu kodu farz ediyorum sen algılama ince bir tanelilik almak için örnekleme hızı artırabilir, ... addAcceleration fonksiyonu içinde Yani

-(void)addAcceleration:(UIAcceleration*)accel 

olduğunu. Örneğin, şu anda saniyede 30 örnek alıyorsanız, bunu 40, 50 veya 60 vb. Düzeylerine yükseltebilirsiniz. Ardından, zıplamanızın içine giren birkaç örnek sayıp saymayacağınıza karar verin. adım. Bazı geri dönüşlerin eksik olması nedeniyle bazı adımları saymıyor gibi geliyor.

Ayrıca, geçiş değiştirme amacı nedir? X sayım sayısından sonra sıfırlama olan bir sayaç kullanmamalısınız? Eğer

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

bu tatlı yerinde 2 kere vurmak zorunda kalacak ... senin çıkma içindedir, ama bu kurdunuz şekilde, üst üste iki ardışık numuneler olmayabilir, bu olabilir bir birinci örnek ve bir 5. örnek veya bir 2. örnek ve bir 11. örnek. Adım sayımlarını kaybediyorsunuz.

1

Herkesin aynı büyük adımları atmadığını unutmayın. Böylece nokta hesaplaması, birisinin uzunluğuna, adım boyutuna göre ayarlanmalıdır.

Geri dönen eşiğini buna göre ayarlamanız gerekir. Programın yolcu hakkında öğrenmesini sağlamaya çalışın.

3

Her adımı saptamak için bazı daha hassas yanıtlar. Ama evet durumumda her 25 adımda + veya - 1 adım alıyorum. Umarım bu size yardımcı olabilir. :)

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; 
    } 
İlgili konular