计步器(步进计数器)



我正在开发一个Pedometer Android应用程序,用于计算所走的步数,并使用这些步数计算所走距离和消耗的卡路里。我已经学习了教程在Android中创建一个简单的计步器和步数计数器,并与之完全一样。当传感器检测到运动时,它会检测步数。

但它也有一些问题:

  1. 当我拿着设备站在同一个地方,只是移动我的手或猛拉设备时,它会检测到变化并增加步数
  2. 如果我拿着设备移动得很慢,它不会检测到变化
  3. 如果我跳,那么它会在计数器中增加几步

我已经从Play Store中检查了一些其他应用程序,它们不做这种事情。

我已经搜索过了,但找不到合适的解决方案或教程。任何帮助或建议。感谢

这里的问题是您的实现不够复杂:它只检查加速度计数据中是否存在尖峰,并假设尖峰来自一个步骤。它不知道加速度的峰值是从哪里来的:它还可能来自你跳跃或摇晃手中的设备。

那么如何使其更加准确呢?好吧,这是一个非常困难的问题,长期以来一直是科学论文的主题。即使是最复杂的健身追踪器(使用机器学习、信号处理和其他统计方法)也很难确定步骤何时是真实的,何时只是noice或用户在玩设备。

幸运的是,Android确实有自己的内置步数计数器和步数检测器,它们比你的例子中的类更复杂。

因此,除非你真的想学习信号处理和人工智能(我强烈建议你学习,尽管我对步进检测的数据科学了解不多),否则我建议你使用内置的检测器和计数器。

通过在类中实现SensorEventListener侦听器,并覆盖onSensorChangedonAccuracyChanged这两个方法,您可以开始跟踪步骤。

public class StepActivity extends Activity implements SensorEventListener{
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor sSensor= sensorManager .getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
...
}

现在我们已经初始化了传感器管理器和传感器,并将传感器注册为活动中的侦听器,我们现在需要实现onSensorChanged功能,每当我们注册的传感器发生更改时,该功能将由SensorEvent触发,在我们的情况下为TYPE_STEP_DETECTR

private long steps = 0;
@Override
public void onSensorChanged(SensorEvent event) {
Sensor sensor = event.sensor;
float[] values = event.values;
int value = -1;
if (values.length > 0) {
value = (int) values[0];
}

if (sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
steps++;
}
}

这是实现步数的一种非常简单的方法。你应该使用安卓内置的步数计数器,因为它还使用其他传感器(如果可用),如陀螺仪,可以提高步数检测。如果你要在上面构建东西,你应该特别使用这个内置版本。你需要一个可靠的底层。你也可以尝试使用线性加速度传感器,它是通过从加速度计中去除重力分量来计算的。重力使加速度计非常灵敏,这就是为什么当你站着的时候,你会看到步数计数器在增加。

详细信息可在此处找到:https://source.android.com/devices/sensors/sensor-types#step_detector

如果您仍然想从头开始开发自己的代码,请查看以下代码:https://github.com/bagilevi/android-pedometer

你也可以试试谷歌学者关于步数算法的最新论文。尤其是试着阅读关于这个话题的最新调查。