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

Как рассчитать расстояние во время ходьбы в андроиде?

Я разрабатываю демо для своего приложения, в котором есть две кнопки с названием "СТАРТ" и "СТОП". Когда пользователь нажимает "START" , он начнет ходить. Я хочу сделать так, чтобы, когда пользователи нажимают "STOP" , демо будет вычислять его расстояние между "START" и "STOP" . Если пользователь нажал "START" и нажал "STOP" , не делая ни одного шага, он должен показывать 0 км или 0 м. Я не знаю, как мне это начать; пожалуйста, сделайте предложение.

4b9b3361

Ответ 1

Один из способов сделать это - использовать данные акселерометра. Ваше приложение должно непрерывно записывать данные акселерометра после нажатия пользователем кнопки "Пуск". Вы будете наблюдать пик в своих данных всякий раз, когда пользователь делает шаг. Примените фильтр к этим данным, и вы сможете определить количество шагов, предпринятых с разумной точностью. Умножьте его на длину шага, и вы должны получить приблизительное расстояние пройденного расстояния. Возьмите высоту пользователя в качестве входного аргумента. Длина шага составляет около 0,45 * Высота человека. Поскольку этот подход не зависит от GPS, он также будет работать в помещении. РЕДАКТИРОВАТЬ: Вам нужно будет использовать значения акселерометра для всех трех осей, чтобы сделать его достаточно независимым от ориентации устройства. Вы можете пойти с x ^ 2 + y ^ 2 + z ^ 2

Ответ 2

Существуют разные способы сделать это:

  • GPS. Продолжайте добавлять расстояние GPS между 2 точками каждые X секунд (скажем, 10 секунд). Проверьте Android Location.distanceTo или distanceBetween. Проверьте My Tracks, это с открытым исходным кодом. GPS недоступен в закрытом помещении и имел бы ошибку, если пользователь меняет направление очень часто (читается каждые 1-2 секунды).
  • Акселерометр: найдите код/​​библиотеку для определения шага с помощью акселерометра. Расстояние происходит от двойной интеграции ускорения, ошибки могут складываться очень быстро здесь.
  • Детектор шагов: встроенный в Nexus 5. Google, возможно, позаботился об ошибках акселерометра. Это аппаратное вычисление, потребляет меньше батареи, но не доступно в большинстве телефонов с даты.

Вы также можете проверить Пешеходный мертвый расчёт

Ответ 3

Спросите разрешения GPS в своем приложении. При запуске начните запись координат GPS. Сделайте то же самое для остановки. Теперь у вас две координаты. Затем вы можете применить формулу расстояния, чтобы получить общее пройденное расстояние.

Edit:

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

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

Ответ 4

Комментарий к "Есть одна проблема с этим решением: если вы путешествуете с постоянной скоростью, ускорение равно 0, так что акселерометр не будет получать какие-либо показания. - jnovacho 16 secs ago" (извините, у вас недостаточно репутации для комментариев)

когда вы выполняете аутлер, сохраняйте акселератор, а затем вычисляете скорость, по которой вы идете. Остановите расчет скорости, когда ускорение изменится и начнется. Если вы остановитесь, вы должны получить отрицательную акселеризацию, тогда вам нужно будет рассчитать, просто ли вы остановились или полностью остановились. Но это просто математика:)

Ответ 5

Я пошел с методом Gps. Со следующими шагами: При нажатии кнопки "Пуск" широта и долгота начальной точки были выбраны и сохранены в моем dto с помощью соответствующего TripId.

нажмите кнопку остановки:

TripDto dto = service.GetStartLatLong(TripIdA);
double lat = Double.valueOf(dto.getStartLati());
double lon = Double.valueOf(dto.getStartLongi());
Location locationa = new Location("point A");
locationa.setLatitude(lat);
locationa.setLongitude(lon);
double distance = location.distanceTo(locationa);

Расстояние, возвращаемое методом location.distanceTo(), находится в метрах.

Ответ 6

public double getDistance(double lat1, double lon1, double lat2, double lon2) 
{ 
    double latA = Math.toRadians(lat1); 
    double lonA = Math.toRadians(lon1);
    double latB = Math.toRadians(lat2); 
    double lonB = Math.toRadians(lon2);
    double cosAng = (Math.cos(latA) * Math.cos(latB) * Math.cos(lonB-lonA)) +
        (Math.sin(latA) * Math.sin(latB));
    double ang = Math.acos(cosAng);
    double dist = ang *6371;
    return dist;
}

Ответ 7

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

Библиотека шагомера

Будет обновлен этот ответ с более указанным кодом, если вы хотите пойти с датчиком.