Ответ 1
Просто для удовольствия я написал шагомер несколько недель назад, и он смог бы обнаружить три действия, которые вы упомянули. Я бы сделал следующие замечания:
- В дополнение к
Sensor.TYPE_ACCELEROMETER
у Android также естьSensor.TYPE_GRAVITY
иSensor.TYPE_LINEAR_ACCELERATION
. Если вы регистрируете значения всех трех, то вы заметите, что значения TYPE_ACCELEROMETER всегда равны сумме значений TYPE_GRAVITY и TYPE_LINEAR_ACCELERATION. МетодonSensorChanged(…)
сначала дает вам TYPE_ACCELEROMETER, за которым следуют TYPE_GRAVITY и TYPE_LINEAR_ACCELERATION, которые являются результатом его внутренней методологии разделения показаний акселерометра на гравитацию и ускорения, которое не связано с гравитацией. Учитывая, что вас интересует ускорение из-за действий, а не ускорение из-за силы тяжести, вы можете найти TYPE_LINEAR_ACCELERATION лучше для того, что вам нужно. - Независимо от того, какие датчики вы используете, X, Y, Z которые вы измеряете, будет зависеть от ориентации устройства. Однако для обнаружения действий, которые вы упомянули, результат не может зависеть от, например, независимо от того, удерживает ли пользователь устройство в портретном или альбомном положении, или является ли устройство плоским или вертикальным, поэтому отдельные значения X, Y и Z не будут использоваться. Вместо этого вам придется посмотреть длину вектора, то есть sqrt (XX + YY + ZZ), который не зависит от ориентации устройства.
- Вам нужно только сгладить данные, если вы кормите это во что-то чувствительное к шуму. Вместо этого я бы сказал, что данные - это данные, и вы получите наилучшие результаты, если вы используете механизмы, которые не чувствительны к шуму и, следовательно, не нужны сглаженные данные. По определению сглаживание отбрасывает данные. Вы хотите разработать алгоритм, который принимает шумные данные на одном конце и выводит текущую активность на другом конце, поэтому не предопределяйте, нужно ли включать сглаживание как часть этого алгоритма.
- график sqrt (XX + YY + ZZ) от Sensor.TYPE_ ACCELEROMETER, который я записал, когда я строил свой шагомер. Графики показывают показания, измеренные, когда я шел на 100 шагов. Зеленая линия - sqrt (XX + YY + Z * Z), синяя линия - экспоненциально взвешенная скользящая средняя зеленой линии, которая дает мне средний уровень зеленой линии, а красная линия показывает шаги вычисления алгоритма. Я смог подсчитать шаги, просто взглянув на максимум и минимум, и когда зеленая линия пересекает синюю линию. Я не использовал никаких сглаживающих или быстрых преобразований Фурье. По моему опыту, для такого рода простейшие алгоритмы часто работают лучше всего, потому что, хотя сложные ситуации могут работать в некоторых ситуациях, сложнее предсказать, как они будут себя вести во всех ситуациях. И надежность - жизненно важная характеристика любого алгоритма: -).