14

我正在开发一个计步器 Android 应用程序来计算所走的步数,并使用这些步数计算所走的距离和燃烧的卡路里。我已经按照教程 在 Android 中创建一个简单的计步器和计步器并完成了完全一样的操作。当传感器检测到运动时,它会检测步数。

但它存在一些问题:

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

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

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

4

3 回答 3

12

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

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

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

所以除非你真的想学习信号处理和人工智能(我强烈推荐,虽然我对步进检测的数据科学不太了解),否则我建议使用内置的检测器和计数器。

于 2017-10-19T07:22:49.843 回答
8

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

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

    ...

}

现在我们已经初始化了 SensorManager 和 Sensor 并将 Sensor 注册为活动中的侦听器,我们现在需要实现onSensorChanged函数,只要我们注册的 Sensor 发生更改,该函数就会由SensorEvent触发,在我们的例子中是TYPE_STEP_DETECTOR

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++;
    }
}
于 2018-01-17T10:17:52.677 回答
2

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

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

如果你还想从头开发自己的,那么看看这段代码: https ://github.com/bagilevi/android-pedometer

您还可以尝试使用 Google 学者获取有关计步算法的最新论文。特别是尝试阅读有关该主题的最新调查。

于 2017-10-19T20:03:31.510 回答