2016-02-03 80 views

回答

1

可以使用加速計數據從CMMotionManager

protected CMMotionManager _motionManager; 
public event EventHandler<bool> OnMotion; 

public double ACCEL_DETECTION_LIMIT = 0.31; 
private const double ACCEL_REDUCE_SPEED = 0.9; 

private double accel = -1; 
private double accelCurrent = 0; 

private void StartAccelerometerUpdates() 
    { 
     if (_motionManager.AccelerometerAvailable) 
      _motionManager.AccelerometerUpdateInterval = ACCEL_UPDATE_INTERVAL; 
     _motionManager.StartAccelerometerUpdates (NSOperationQueue.MainQueue, AccelerometerDataUpdatedHandler); 
    } 

public void AccelerometerDataUpdatedHandler(CMAccelerometerData data, NSError error) 
     {   
     double x = data.Acceleration.X; 
     double y = data.Acceleration.Y; 
     double z = data.Acceleration.Z; 

     double accelLast = accelCurrent; 
     accelCurrent = Math.Sqrt(x * x + y * y + z * z); 
     double delta = accelCurrent - accelLast; 
     accel = accel * ACCEL_REDUCE_SPEED + delta; 

     var didStep = OnMotion; 

     if (accel > ACCEL_DETECTION_LIMIT) 
     {           
      didStep (this, true);//maked a step 
     } else { 
      didStep (this, false); 
     } 
    } 
+0

非常感謝您的解決方案。它以某種方式處理它的一些缺陷。你的代碼出於某種原因在初始加載它來到11步,然後只有我開始正確檢測步驟。我玩過ACCEL_DETECTION_LIMIT,它有一些更好的初始負載,但準確性是關閉的。這裏有更多解釋。 https://gist.github.com/anonymous/d8563c4c8fc8ba874ba6。任何想法是什麼問題? – Axil

+0

@Axil修正了一個錯誤,只是將'private double accel'設置爲-1 –

1

IOS一邊檢測步驟事件,有沒有簡單的解決方案來創建僅使用加速計輸出準確的計步器;這只是嘈雜。使用陀螺儀(如果可用)的輸出來過濾輸出會提高精度。

但這裏粗略的粗略方法是爲計步器配線代碼: - 檢測到的步數是在Z軸上檢測到的加速度的變化。假設你知道這裏的默認加速度(重力的影響)是你如何做到這一點:

float g = (x * x + y * y + z * z)/(GRAVITY_VALUE * GRAVITY_VALUE) 

你的門檻g=1(這是站着不動時,你會看到什麼)。此值中的尖峯表示步驟。所以你所要做的就是計算峯值。請注意,一個簡單的g> 1不會這樣做,因爲對於一個步驟,g值會增加一段時間,然後返回(如果隨時間推移繪製該值,它應該看起來像是一個正弦波有一個步驟 - 基本上你想要計算正弦波)

請注意,這只是讓你開始的東西;你將不得不增加更多的複雜性來提高準確性。 像這樣的事情: - 避免錯誤步進檢測的滯後 - 過濾加速度計輸出 - 計算步驟間隔 這裏不包括,應該試驗。

+0

好吧猜測它的更多研究我們必須爲此而努力。你有沒有試過第一個?這在工作開始時起作用,但僅僅是奇怪的行爲。如果我們可以微調,它會正常工作。謝謝 – Axil

+0

我在構建ecompass時使用了這個公式以及更多。校準部分可能會有點瑕疵,尤其是僅使用加速度計時。但一個正確的做法應該足夠簡單。 – Pandrei