Android - Как подойти к алгоритму обнаружения падения - PullRequest
14 голосов
/ 31 января 2011

Я хочу иметь в своем приложении довольно простой алгоритм обнаружения падения. В данный момент в onSensorChanged () я получаю абсолютное значение текущих значений x, x, z и вычитаю из этого значение SensorManager.GRAVITY_EARTH (9,8 м / с). Результирующее значение должно быть больше порогового значения в 10 раз подряд, чтобы установить флаг, указывающий, что акселерометр обнаружил падение, пороговое значение составляет около 8 м / с.

Также я сравниваю ориентацию телефона, как только порог пройден, и ориентацию его, когда порог больше не проходит, это устанавливает другой флаг, сообщающий, что датчик ориентации обнаружил падение.

Когда оба флага установлены, происходит событие, чтобы проверить, в порядке ли пользователь, и т. Д. И т. Д. Моя проблема с порогом, когда телефон удерживается прямо, абсолютное значение акселерометра составляет около 9,8 м / с, но когда я держите его неподвижно под углом, он может превышать 15 м / с. Это вызывает другие события, чтобы вызвать обнаружение падения, и если я увеличу порог, чтобы избежать этого, он не обнаружит падения.
Кто-нибудь может дать мне несколько советов, какие возможные значения мне следует использовать или как улучшить мой метод? Большое спасибо.

Ответы [ 4 ]

15 голосов
/ 31 января 2011

Во-первых, я хочу напомнить вам, что вы не можете просто сложить значения x, y, z вместе, как они есть, вы должны использовать векторную математику.Вот почему вы получаете значения более 15 м / с.Пока телефон не движется, векторная сумма всегда должна быть около 9,8 м / с.Вы рассчитываете это с помощью SQRT (x * x + y * y + z * z).Если вам нужна дополнительная информация, вы можете прочитать о векторной математике, возможно, http://en.wikipedia.org/wiki/Euclidean_vector#Length - хорошее начало для нее.

Я также предлагаю другой алгоритм: в свободном падении все три из x, yЗначения z акселерометра должны быть близки к нулю.(По крайней мере, это то, что я выучил на уроках физики давным-давно в школе.) Поэтому, возможно, вы можете использовать формулу, например, если векторная сумма x, y, z <= 3 м / с, чем вы обнаруживаете свободное падение.И если векторная сумма возрастает до значения, превышающего 20 м / с, то вы обнаруживаете приземление. </p>

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

6 голосов
/ 24 февраля 2011

Я опубликовал статью по этому вопросу.Пожалуйста, не стесняйтесь проверить "ifall" @ ww2.cs.fsu.edu/~sposaro

Мы в основном берем корневую сумму квадратов и ищем 3 вещи 1. Нижний порог сломалсяТ.е. падает 2. Верхний порог сломался.Т.е. удары о землю 3. Плоская линия около 1 г, то есть лонгли, лежащая на земле в течение длительного периода времени

4 голосов
/ 12 мая 2011

Я забыл обновить эту ветку, но iFall теперь доступен на Android Market. Также проверьте ww2.cs.fsu.edu / ~ sposaro / iFall для получения дополнительной информации

0 голосов
/ 27 сентября 2017

Это возможно с помощью датчика акселерометра.

Запишите это в сенсор сменившего слушателя ..

if (sensor == Sensor.TYPE_ACCELEROMETER) {
        long curTime = System.currentTimeMillis();
        // only allow one update every 100ms.
        if ((curTime - lastUpdate) > 100) {
            long diffTime = (curTime - lastUpdate);
            lastUpdate = curTime;

            x = values[SensorManager.DATA_X];
            y = values[SensorManager.DATA_Y];
            z = values[SensorManager.DATA_Z];

            float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
            Log.d("getShakeDetection", "speed: " + speed);
            if (speed > DashplexManager.getInstance().SHAKE_THRESHOLD) {
                result = true;
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
    }
...