Как интерпретировать математику за обнаружением сотрясения в Android? - PullRequest
1 голос
/ 17 марта 2020

Я вижу много ответов в Интернете, и все они имеют одинаковый скопированный код, но ни один из них не имеет объяснения математики, которую они используют. У меня есть URL к коду на tutorialspoint, который совпадает с ответами, которые я вижу на stackoverflow. Однако кто-то может объяснить мне эту часть кода:

   private final SensorEventListener mSensorListener = new SensorEventListener() {
  @Override
  public void onSensorChanged(SensorEvent event) {
     float x = event.values[0];
     float y = event.values[1];
     float z = event.values[2];
     mAccelLast = mAccelCurrent;
     mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
     float delta = mAccelCurrent - mAccelLast;
     // What is this doing?
     mAccel = mAccel * 0.9f + delta;
     if (mAccel > 12) {
        Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
     }
  }

Что должна делать эта строка

mAccel = mAccel * 0.9f + delta;

Откуда взялся 0,9f и почему мы умножаем это само собой и добавление дельты? Моя физика не сильна, поэтому для меня это не очевидно.

https://www.tutorialspoint.com/how-to-detect-shake-event-in-android-app

1 Ответ

0 голосов
/ 18 марта 2020

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

  1. mAccelCurrent рассчитывается как текущее абсолютное значение ускорения
  2. delta рассчитывается как разница между текущим и предыдущим абсолютным значение ускорения. Это делается для того, чтобы избавиться от значения постоянного ускорения (силы тяжести) и усилить колебательное движение (изменение ускорения).
  3. mAccel рассчитывается как экспоненциальное сглаживание delta, фильтрация первого порядка с коэффициентом 0,9, который в зависимости от времени, в которое вызывается эта функция, может иметь высокое или низкое значение (если оно вызывается часто, это низкое значение). Вы правы, говоря, что умножение 0.1f выглядит отсутствующим, но если вы посмотрите на код в защищенной функции void onCreate, вы увидите, что mAccel инициализируется в 10f. Другими словами, mAccel в 10 раз превышает экспоненциальное сглаживание delta.
  4. Затем результат сравнивается с 12, что выглядит для меня как произвольное значение.

Вы можете использовать умножение 0,1, если хотите, этого будет достаточно, чтобы уменьшить на 10 раз также значение, с которым он сравнивается (1,2 вместо 12)

...