Как обнаружить ходьбу с помощью акселерометра Android - PullRequest
17 голосов
/ 14 февраля 2011

Я пишу приложение, и моя цель - определить, когда пользователь гуляет.Я использую фильтр Калмана следующим образом:

float kFilteringFactor=0.6f;

        gravity[0] = (accelerometer_values[0] * kFilteringFactor) + (gravity[0] * (1.0f - kFilteringFactor));
        gravity[1] = (accelerometer_values[1] * kFilteringFactor) + (gravity[1] * (1.0f - kFilteringFactor));
        gravity[2] = (accelerometer_values[2] * kFilteringFactor) + (gravity[2] * (1.0f - kFilteringFactor));

        linear_acceleration[0] = (accelerometer_values[0] - gravity[0]);
        linear_acceleration[1] = (accelerometer_values[1] - gravity[1]);
        linear_acceleration[2] = (accelerometer_values[2] - gravity[2]);

        float magnitude = 0.0f;
        magnitude = (float)Math.sqrt(linear_acceleration[0]*linear_acceleration[0]+linear_acceleration[1]*linear_acceleration[1]+linear_acceleration[2]*linear_acceleration[2]);
        magnitude = Math.abs(magnitude);
if(magnitude>0.2)
  //walking

Гравитация массива [] инициализируется с 0 с.

Я могу определить, когда пользователь идет или нет (глядя на значениевеличины вектора ускорения), но моя проблема в том, что, когда пользователь не ходит и перемещает телефоны, кажется, что он ходит.

Использую ли я правильный фильтр?

Правильно ли наблюдать только величину вектора или я должен смотреть на отдельные значения ??

Ответы [ 5 ]

21 голосов
/ 16 июля 2015

Google предоставляет API для этого, называемый DetectedActivity, который можно получить с помощью ActivityRecognitionApi.К этим документам можно получить доступ здесь и здесь .

DetectedActivity имеет метод public int getType() для получения текущей активности пользователя, а также public int getConfidence(), которыйвозвращает значение от 0 до 100. Чем выше значение, возвращаемое getConfidence(), тем более уверенным является API в том, что пользователь выполняет возвращаемое действие.

Вот постоянная сводка того, что возвращает getType():

  • int IN_VEHICLE Устройство находится в транспортном средстве, например в автомобиле.
  • int ON_BICYCLE Устройство находится на велосипеде.
  • int ON_FOOTУстройство находится на пользователе, который ходит или работает.
  • int RUNNING Устройство находится на пользователе, который работает.
  • int STILL Устройство все еще (не движется).
  • int TILTING Значительно изменился угол наклона устройства относительно силы тяжести.
  • int UNKNOWN Невозможно определить текущую активность.
  • int WALKING Устройство находится на пользователе, который ходит.
5 голосов
/ 03 января 2013

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

По сути, это наблюдение того, как «звучит» ходьба, обработка входов датчика акселерометра как микрофона и наблюдение громких частот при ходьбе (другими словами, на какой частоте происходит наибольшее ускорение).

Я предполагаю, что вы будете искать большую величину на некоторой низкой частоте (например, скорость шага) или что-то еще. Было бы интересно увидеть данные.

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

4 голосов
/ 03 октября 2012

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

В этом приложении был использован следующий код https://play.google.com/store/apps/details?id=com.tartakynov.robotnoise

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER){
            return;
        }
        final float z = smooth(event.values[2]); // scalar kalman filter                               
        if (Math.abs(z - mLastZ) > LEG_THRSHOLD_AMPLITUDE)
        {
            mInactivityCount = 0;
            int currentActivity = (z > mLastZ) ? LEG_MOVEMENT_FORWARD : LEG_MOVEMENT_BACKWARD;                  
            if (currentActivity != mLastActivity){
                mLastActivity = currentActivity;
                notifyListeners(currentActivity);
            }                   
        } else {
            if (mInactivityCount > LEG_THRSHOLD_INACTIVITY) {
                if (mLastActivity != LEG_MOVEMENT_NONE){
                    mLastActivity = LEG_MOVEMENT_NONE;
                    notifyListeners(LEG_MOVEMENT_NONE);                                 
                }
            } else {
                mInactivityCount++;
            }
        }
        mLastZ = z;
    }
0 голосов
/ 24 января 2019

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

Вы измеряете горизонтальное ускорение и обновляете значение скорости с его помощью.Скорость будет дрейфовать со временем, но вам нужно сохранять сглаженную скользящую среднюю скорость за время шага, и пока она не дрейфует больше, чем, скажем, половина скорости ходьбы за 3 колебания, тогда она идет, но только если онаПервоначально скорость ходьбы возросла за короткое время, то есть за полсекунды или, возможно, 2 колебания.
Все это должно почти покрыть ееКонечно, немного ai поможет сделать вещи проще или сложнее, но удивительно точными, если вы рассмотрите все это как входные данные для NN.Т.е. предварительная обработка.

0 голосов
/ 14 февраля 2011

РЕДАКТИРОВАТЬ: Я не думаю, что это достаточно точно, так как при обычной ходьбе среднее ускорение было бы около 0. Максимум, что вы могли бы сделать, измеряя ускорение, это обнаружить, когда кто-то начинает ходить или останавливается (Но, как вы сказали, трудно фильтровать это от устройства, перемещенного кем-то, стоящим в одном месте)

Итак ... то, что я написал ранее, вероятно, в любом случае не сработает:

Вы можете "предсказать", движется ли пользователь, отбрасывая, когда пользователь не движется (очевидно), и первые два варианта, которые мне приходят на ум:
Проверьте, не скрыт ли телефон, используя датчик приближения и освещенности (опция). Этот метод менее точен, но проще.
Контролируя непрерывность движения, если телефон движется более ... 10 секунд и движение не является подлым, то вы считаете, что он ходит. Я знаю, что это не идеально, но это трудно без использования какого-либо позиционирования, кстати ... почему бы вам просто не использовать LocationManager?

...