答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
但是这里的原油是计步器接线代码的粗略方法: - 检测步骤作为在Z轴上检测到的加速度的变化。假设你知道默认加速度(重力的影响),你就是这样做的:
float g = (x * x + y * y + z * z) / (GRAVITY_VALUE * GRAVITY_VALUE)
您的门槛为g=1
(这是您站着不动时会看到的)。此值中的峰值表示步骤。因此,您所要做的就是计算峰值。请注意,一个简单的g> 1将不会这样做,因为一步,g值将增加一段时间然后返回(如果你随时间绘制值,它应该看起来像一个正弦波有一个步骤 - 基本上你想要计算正弦波)
请注意,这只是让你入门的事情;你将不得不增加更多的复杂性来提高准确性。 像: - 滞后以避免错误的步骤检测 - 过滤加速度计输出 - 计算步骤间隔 不包括在这里,应该进行实验。