Поскольку CMPedometer недоступен для моделей ниже iPhone5S.
Подсчет шагов CMPedometer недоступен
Есть ли код алгоритма, который мы можем использовать для программирования количества шагов с помощью акселерометра на ios?
Спасибо
Поскольку CMPedometer недоступен для моделей ниже iPhone5S.
Подсчет шагов CMPedometer недоступен
Есть ли код алгоритма, который мы можем использовать для программирования количества шагов с помощью акселерометра на ios?
Спасибо
Помимо IOS, нет простого решения для создания точного шагомера, использующего только выходные данные акселерометра; это просто шумно. Использование выходных данных гироскопа (где доступно) для фильтрации выходных данных повысит точность.
Но грубый вот грубый подход к монтажному коду для шагомера: - шаги определяются как изменение ускорения, определяемого по оси Z. Предполагая, что вы знаете ускорение по умолчанию (воздействие силы тяжести), вот как вы это делаете:
float g = (x * x + y * y + z * z) / (GRAVITY_VALUE * GRAVITY_VALUE)
Ваш порог равен g=1
(это то, что вы увидите, стоя на месте). Пики в этом значении представляют собой шаги. Так что все, что вам нужно сделать, это посчитать шипы. Имейте в виду, что простой g>1 не годится, так как для одного шага значение g будет увеличиваться в течение определенного периода времени, а затем возвращаться обратно (если вы отобразите значение во времени, оно должно выглядеть как синусоидальная волна, когда есть шаг - по сути вы хотите посчитать волны синуса)
Имейте в виду, что это всего лишь то, что поможет вам начать; вам придется добавить больше сложности, чтобы повысить точность. Такие вещи, как: - гистерезис для предотвращения ложного обнаружения шагов - фильтрация выходных данных акселерометра - определение интервалов шагов Сюда не включены, и с ними следует поэкспериментировать.
Вы можете определить событие шага, используя данные акселерометра из 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);
}
}
private double accel
на -1
- person Kuchur Andrei; 01.03.2016