由於CMPedometer不適用於iPhone5S以下。替代CMP計算器以計算iOS上的加速度計的步數
CMPedometer StepCounting not Available
有,我們可以用它來編程與iOS上的加速計步數的算法代碼?
感謝
由於CMPedometer不適用於iPhone5S以下。替代CMP計算器以計算iOS上的加速度計的步數
CMPedometer StepCounting not Available
有,我們可以用它來編程與iOS上的加速計步數的算法代碼?
感謝
可以使用加速計數據從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);
}
}
IOS一邊檢測步驟事件,有沒有簡單的解決方案來創建僅使用加速計輸出準確的計步器;這只是嘈雜。使用陀螺儀(如果可用)的輸出來過濾輸出會提高精度。
但這裏粗略的粗略方法是爲計步器配線代碼: - 檢測到的步數是在Z軸上檢測到的加速度的變化。假設你知道這裏的默認加速度(重力的影響)是你如何做到這一點:
float g = (x * x + y * y + z * z)/(GRAVITY_VALUE * GRAVITY_VALUE)
你的門檻g=1
(這是站着不動時,你會看到什麼)。此值中的尖峯表示步驟。所以你所要做的就是計算峯值。請注意,一個簡單的g> 1不會這樣做,因爲對於一個步驟,g值會增加一段時間,然後返回(如果隨時間推移繪製該值,它應該看起來像是一個正弦波有一個步驟 - 基本上你想要計算正弦波)
請注意,這只是讓你開始的東西;你將不得不增加更多的複雜性來提高準確性。 像這樣的事情: - 避免錯誤步進檢測的滯後 - 過濾加速度計輸出 - 計算步驟間隔 這裏不包括,應該試驗。
非常感謝您的解決方案。它以某種方式處理它的一些缺陷。你的代碼出於某種原因在初始加載它來到11步,然後只有我開始正確檢測步驟。我玩過ACCEL_DETECTION_LIMIT,它有一些更好的初始負載,但準確性是關閉的。這裏有更多解釋。 https://gist.github.com/anonymous/d8563c4c8fc8ba874ba6。任何想法是什麼問題? – Axil
@Axil修正了一個錯誤,只是將'private double accel'設置爲-1 –