Профилирование акселерометра Android

Я написал простую операцию, которая является SensorEventListener для Sensor.TYPE_ACCELEROMETER.

В моем onSensorChanged(SensorEvent event) я просто выбираю значения в формате X,Y,Z и записываю их в файл.

Добавленный к этому X,Y,Z - это метка, метка специфична для активности, которую я выполняю. поэтому его X,Y,Z,label

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

Основной целью этого сбора данных является создание приложения обнаружения активности пользователя с использованием библиотеки нейронной сети (NeuroPh для Android) Ссылка.

Ответы

Ответ 1

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

  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 лучше для того, что вам нужно.
  2. Независимо от того, какие датчики вы используете, X, Y, Z которые вы измеряете, будет зависеть от ориентации устройства. Однако для обнаружения действий, которые вы упомянули, результат не может зависеть от, например, независимо от того, удерживает ли пользователь устройство в портретном или альбомном положении, или является ли устройство плоским или вертикальным, поэтому отдельные значения X, Y и Z не будут использоваться. Вместо этого вам придется посмотреть длину вектора, то есть sqrt (XX + YY + ZZ), который не зависит от ориентации устройства.
  3. Вам нужно только сгладить данные, если вы кормите это во что-то чувствительное к шуму. Вместо этого я бы сказал, что данные - это данные, и вы получите наилучшие результаты, если вы используете механизмы, которые не чувствительны к шуму и, следовательно, не нужны сглаженные данные. По определению сглаживание отбрасывает данные. Вы хотите разработать алгоритм, который принимает шумные данные на одном конце и выводит текущую активность на другом конце, поэтому не предопределяйте, нужно ли включать сглаживание как часть этого алгоритма.
  4. график sqrt (XX + YY + ZZ) от Sensor.TYPE_ ACCELEROMETER, который я записал, когда я строил свой шагомер. Графики показывают показания, измеренные, когда я шел на 100 шагов. Зеленая линия - sqrt (XX + YY + Z * Z), синяя линия - экспоненциально взвешенная скользящая средняя зеленой линии, которая дает мне средний уровень зеленой линии, а красная линия показывает шаги вычисления алгоритма. Я смог подсчитать шаги, просто взглянув на максимум и минимум, и когда зеленая линия пересекает синюю линию. Я не использовал никаких сглаживающих или быстрых преобразований Фурье. По моему опыту, для такого рода простейшие алгоритмы часто работают лучше всего, потому что, хотя сложные ситуации могут работать в некоторых ситуациях, сложнее предсказать, как они будут себя вести во всех ситуациях. И надежность - жизненно важная характеристика любого алгоритма: -).

enter image description here

Ответ 2

Это звучит как интересная проблема!

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

   ^
   |
 A |
   |
   |
   |
   |_________________>
   |     time
   |
   v

Я бы начал с строк для каждого вида деятельности:

  • | Ax + Ay + Az |
  • | Vx + Vy + Vz | (приблизительная по расчетной площади трапеций, сформированных вашими точками данных) ... и т.д.

Возможно, вы можете определить ориентацию телефона, пытаясь определить гравитацию, а затем поверните свои векторы в "стандартную" ориентацию (например, положительная ось Z = вверх). Если вы можете это сделать, то различные оси могут стать более значимыми. Например, ходьба (в кармане) будет иметь тенденцию иметь скорость на горизонтальной плоскости, которая может отличаться от ходьбы (в руке) движением в вертикальной плоскости.

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

https://en.wikipedia.org/wiki/Moving_average

Кроме того, этот пост имеет отношение к вашему вопросу:

Как удалить коэффициент силы тяжести с показаний акселерометра на 3-осевом акселерометре Android

Ответ 3

Вещи, идентифицированные мной:

  • Данные должны быть предварительно обработаны как и как вам это нужно, В моем case я просто хочу 3 входа и один выход
  • Данные должны быть подвергается сглаживанию (пятиточечная сглаживание или любая другая техника который наилучшим образом подходит вам) Ссылка. Так что шум фильтруется (хотя и не полностью). Moving Average является одним из методов
  • Линеаризованные данные будут хорошими, потому что вы не знаете, как были взяты данные, используйте интерполяцию, чтобы помочь вам в линеаризации данных.
  • Наконец, используйте FFT (быстрое преобразование Фурье), чтобы извлечь рецепт из тарелки, то есть извлечь данные из вашего набора данных!