Android – Как подходить к алгоритму обнаружения падения

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

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

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

Solutions Collecting From Web of "Android – Как подходить к алгоритму обнаружения падения"

Во-первых, я хочу напомнить вам, что вы не можете просто добавлять значения 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 м / с, чем вы обнаруживаете посадку.

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

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

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

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