Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alternative to CMPedometer to calculate number of steps with accelerometer on iOS

Since CMPedometer is not available for below iPhone5S.

CMPedometer StepCounting not Available

Is there an algorithm code that we can use to program number of steps with the accelerometer on ios ?

Thanks

like image 878
Axil Avatar asked Oct 31 '22 10:10

Axil


2 Answers

IOS aside, there is no simple solution to create an accurate pedometer using just the accelerometer output; it's just to noisy. Using the output from a gyroscope(where available) to filter the output would increase the accuracy.

But a crude here's a crude approach to wiring code for a pedometer: - steps are detected as a variation in the acceleration detected on the Z axis. Assuming you know the default acceleration(the impact of gravity) here's how you do it:

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

Your threshold is g=1 (this is what you would see when standing still). Spikes in this value represent steps. So all you have to do is count the spikes. Please mind here that a simple g>1 will not do, as for one step, the g value will increase for a certain amount of time and then go back (if you plot the value over time, it should look like a sin wave when there is a step - essentially you want to count the sin waves)

Mind you that this is just something to get you started; you will have to add more complexity to it to increase accuracy. Things like: - hysteresis to avoid false step detection - filtering the accelerometer output - figuring out the step intervals Are not included here and should be experimented with.

like image 158
Pandrei Avatar answered Nov 11 '22 10:11

Pandrei


You can detect step Event using accelerometer data from 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);
        }
    }
like image 37
Kuchur Andrei Avatar answered Nov 11 '22 10:11

Kuchur Andrei