CMPedometerはiPhone5S以下では使用できません。iOSの加速度計で歩数を計算するCMPedometerの代替
CMPedometer StepCounting not Available
我々はiOSの加速度計と歩数をプログラムするのに使用できるアルゴリズムのコードはありますか?
おかげ
CMPedometerはiPhone5S以下では使用できません。iOSの加速度計で歩数を計算するCMPedometerの代替
CMPedometer StepCounting not Available
我々はiOSの加速度計と歩数をプログラムするのに使用できるアルゴリズムのコードはありますか?
おかげ
あなたはさておき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);
}
}
から加速度計データを用いて、ステップのイベントを検出することができ、単に加速度計出力を使用して、正確な歩数計を作成する簡単な解決策はありません。それはちょうど騒々しいです。ジャイロスコープの出力(利用可能な場合)を使用して出力をフィルタリングすると、精度が向上します。
ここで粗末なことは、歩数計のコードを配線することです: - ステップは、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に設定するだけです。 –