Подтвердить что ты не робот

Как подсчитать скорость, основанную на шагах

У меня есть приложение счетчика шагов, в котором я запускаю службу, которая учитывает сделанные шаги, а затем отправляет широковещательную передачу фрагменту, который затем обновляется на фрагменте. Счетчик шагов работает нормально, но я хочу рассчитать скорость, основанную на шагах. Вот что я сейчас пытаюсь сделать.

Получатель получает количество шагов:

receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        int steps = intent.getIntExtra(StepCounterService.STEP_INCREMENT_KEY, 0);
        if (firstStepTime.equals("0")) {
            firstStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY);
        } else if (secondStepTime.equals("0")) {
            secondStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY);
        } else {
            firstStepTime = secondStepTime;
            secondStepTime = intent.getStringExtra(StepCounterService.TIME_STAMP_KEY);
        }

        updateAllUI(steps);
    }
};

Итак, что я делаю, как только я начинаю делать шаги, я вижу, что переменная firstStepTime пуста. Если это так, я сохраняю время в переменной firstStepTime. На следующем шаге я вижу, что secondStepTime пуст, и если это так, я сохраняю это время в переменной secondStepTime. Теперь для следующих шагов они обновляются.

public void updateAllUI(int numberOfSteps) {

    if (!(firstStepTime.equals("0")) && !(secondStepTime.equals("0"))) {
        try {
            Calendar c = Calendar.getInstance();
            SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss.SSS");
            timeDifference = timeFormat.parse(secondStepTime).getTime() - timeFormat.parse(firstStepTime).getTime();

            speed = (float) ((0.0254 / (timeDifference * 0.001)) * 3.6);
        } catch (Exception e) {
            timeDifference = 0;
            speed = 0;
        }

        textview.settext(speed +"Km/h);
    }
}

Итак, в этом я просто проверяю, не обе пусты ли я, я принимаю значения и вычисляю разницу во времени. Проблема здесь в том, что иногда она не учитывает скорость должным образом. И большая проблема заключается в том, что пользователь останавливается, скорость остается постоянной и не падает до нуля.

Есть ли лучший способ сделать расчет скорости?

4b9b3361

Ответ 1

Поскольку вы только считаете шаги и хотите рассчитать скорость с шагами, сделанными только, я предполагаю, что вы не хотели бы использовать GPS для подсчета скорости, или вы хотели бы предоставить счетчик скорости резервного копирования, если GPS не существует.

Вы можете запустить новый поток, выполнив

    int interval=1*1000; //specifying interval to check steps
    Handler.postDelayed(mySpeedChecker(),1000);

Вам нужно сделать это для каждого шага

public void mySpeedChecker(){
// assuming steps taken stored in a global variable
// and there is one more variable which is updated by this function 
// to store number of steps before as global variable to calculate number of steps in time interval. 
// this should check if another step has been taken in the interval to check
// if stepsTaken>0 then speed is not zero and you'll know how much steps are taken
// if zero steps are taken then speed is zero 
// also it will tell you number of steps taken in last second 
// so you can use this to calculate and update speed 
// increase the interval for high accuracy but lower frequency of updates 
}

Кроме того, рекомендуется вычислять длину шага пользователя, когда GPS доступен, поэтому, когда пользователь использует GPS, длина шага может быть рассчитана путем определения пройденного расстояния/количества шагов, предпринятых с помощью GPS, это будет помогите вашей системе точно рассчитать расстояние, пройденное пользователем, с помощью количества выполненных шагов.

Ответ 2

Обычный способ вычисления скорости идеально будет использовать Location.getSpeed ​​() или некоторый анализ значений Accelerometer. но я предполагаю, что вы хотите получить его на основе подсчитанных шагов.

Чтобы решить одну из проблем: "если пользователь останавливается, скорость остается постоянной и не падает до нуля".

Вы можете использовать функцию распознавания активности Android Api, чтобы увидеть текущую активность пользователей. Используйте

ActivityRecognition.getMostProbableActivity()

Если DetectedActivity имеет тип STILL, вы можете установить свою скорость равной нулю.

Вы также можете получить уверенность DetectedActivity.getConfidence().

Для другой проблемы, когда вы сказали, что она не учитывает скорость должным образом, не могли бы вы подробнее рассказать об этом вопросе?

Ответ 3

Каждая информация, поступающая с датчиков, имеет ошибку и даже свободную информацию.

Вы должны хранить информацию, полученную в очереди или базе данных, включая отметку времени.

Периодически вы выбираете данные и анализируете их, включая фильтрацию, чтобы получить более точную информацию.

Надеюсь, что это поможет.