Определить, падает ли человек - PullRequest
5 голосов
/ 10 января 2012

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

Ниже приведен мой код для обнаружения падения:

@Override
public void onSensorChanged(SensorEvent arg0) {
  // TODO Auto-generated method stub
  if (arg0.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
    double gvt=SensorManager.STANDARD_GRAVITY;

    float vals[] = arg0.values;
    //int sensor=arg0.sensor.getType();
    double xx=arg0.values[0];
    double yy=arg0.values[1];
    double zz=arg0.values[2];
    double aaa=Math.round(Math.sqrt(Math.pow(xx, 2)
                                    +Math.pow(yy, 2)
                                    +Math.pow(zz, 2)));

    if (aaa<=6.0) {
      min=true;
      //mintime=System.currentTimeMillis();
    }

    if (min==true) {
      i++;
      if(aaa>=13.5) {
        max=true;
      }
    }

    if (min==true && max==true) {
      Toast.makeText(FallDetectionActivity.this,"FALL DETECTED!!!!!" ,Toast.LENGTH_LONG).show();
      i=0;
      min=false;
      max=false;
    }

    if (i>4) {
      i=0;
      min=false;
      max=false;
    }
  }
}

Чтобы объяснить приведенный выше код, я использовал векторную сумму и проверил, достигло ли значение меньше или равно 6 (при падении) и внезапно больше 13,5 (при посадке), чтобы подтвердить падение.

Теперь мне сказали на форумах, что если устройство все еще является векторным, сумма вернет значение 9,8. При падении он должен быть близок к 0 и должен достигать 20 при посадке. Похоже, этого не происходит в моем случае. Пожалуйста, кто-нибудь может подсказать, если я где-то не так?

Ответы [ 3 ]

7 голосов
/ 13 мая 2013

Есть парень, который разработал приложение для Android для этого. Может быть, вы можете получить некоторую информацию с его сайта: http://ww2.cs.fsu.edu/~sposaro/iFall/. Он также сделал статью, объясняющую, как он обнаружил падение. Это действительно интересно, вы должны это проверить!

Ссылка на бумагу: http://ww2.cs.fsu.edu/~sposaro/publications/iFall.pdf

При возобновлении обнаружения падения используется результат ускорения X-Y-Z. На основании этого значения:

  1. При падении падение обычно начинается с периода свободного падения, в результате чего результат значительно падает ниже 1 г.
  2. При воздействии на землю наблюдается пик амплитуды результирующего значения со значениями, превышающими 3g.
  3. После этого, если человек не мог двигаться из-за падения, результирующее значение останется близким к 1G.
1 голос
/ 12 января 2017

Добавить усреднение к вашему сигналу означает: - скользящее среднее. Это зависит от размера ваших окон. Например. Скажем, у меня есть один вектор со следующими числами: 1,2,3,4,5,6. и мой размер окна равен 2. Тогда скользящее среднее должно взять каждые два числа из вашего вектора и усреднить их по 2. Таким образом, вы бы взяли 1 + 2/2, а затем переместили одно к следующим двум. 2 + 3/2 и т. Д.

1 голос
/ 10 января 2012

Следующее произойдет, если человек / телефон упадет:

  • абсолютное значение вектора ускорения становится равным 0 (с некоторым шумом, конечно)
  • при посадке будет происходить значительный скачок абсолютного значения вектора (до максимального значения, полученного акселерометром)

Когда телефон неподвижен, вектор силы тяжести по модулю указывает вверх

Ваш код в основном правильный, но я бы использовал некоторое усреднение, потому что акселерометры, используемые в телефонах, дешевы - шумно и не хватает точности

...