Расчет скорости по ускорению (акселерометр)

Я использую акселерометр на устройстве Android для отслеживания и обнаружения определенных движений, используя только одну ось, поскольку движения линейны по этой оси.

Я использую простой фильтр для удаления шума из данных акселерометра:

ouput = ouput + alpha * (input - output)

Результат выглядит так, как я ожидал, и кажется пригодным для моих целей:

Ускорение по оси X

Я хочу рассчитать скорость по данным акселерометра, которые я получаю, но здесь я сталкиваюсь с проблемами, как видно здесь:

Расчетная скорость по оси X

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

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

  • Это необработанные данные, и, таким образом, они включают влияние гравитации, которое я просто вычитаю (я использую среднее значение короткого периода в начале, в котором нет движения, в данном случае это было 9,55).
  • У меня есть метка времени каждой точки данных, поэтому я знаю интервал между показаниями
  • Я использую простую формулу V = V0 + A * dtдля расчета скорости.
    • V0изначально равно нулю, затем устанавливается на предыдущее значение
    • Aскорректированное ускорение (т.е. accel - grav)
    • dtинтервал, разница между текущей и предыдущей отметкой времени

Я подумал, что проблема, возможно, заключается в том, что ускорение также не возвращается к нулю, а вместо этого остается немного ниже нуля (как видно на первом изображении выше), что добавляет слишком много отрицательных значений, которые распространяются при расчете. Так что я установил gravменьшее число, и, кажется, есть сладкое пятно. В этом примере большие значения приводят gravк падению скорости до отрицательных значений, малые значения обращают эффект вспять, при этом кривая скорости поднимается к более высоким положительным значениям. Прямо около grav = 9.3(9,32 на этом изображении) график кажется наиболее правдоподобным. Этот интервал очень мал, 9,28 и 9,35 уже демонстрируют значительную тенденцию к росту или падению соответственно.

Расчетная скорость по оси X с grav=9,32

Что может быть причиной этого? Откуда ~ 9,32? Почему это не ~9,55, которое я наблюдаю в начальный период неподвижности? Можно ли каким-то образом изменить расчеты, чтобы получить более согласованные значения? Например, между каждым повторением должен быть короткий промежуток времени V = 0.

Довольно сложно отлаживать такие вещи... вы должны просто попробовать поиграться, протестировав свой акселерометр в некоторых простых условиях, где вы ожидаете очень простую форму волны. На мой взгляд, есть несколько вещей, которые, возможно, являются источниками ошибки: может быть, ваша частота дискретизации ( г т ) слишком велик, а ошибки увековечиваются и увеличиваются. Возможно, вы забыли сбросить некоторые переменные в своем коде перед вычислением будущих значений. Может быть, есть какие-то силы, которыми вы пренебрегаете. Это может быть не физика: это может быть просто код или неисправный акселерометр.
Я почти уверен, что это не проблема с моим кодом, я действительно просто беру значение, которое дает мне API Android, и записываю его в файл. Скорее всего просто датчик не очень точный. На самом деле это цель этого, чтобы узнать, какие полезные данные я могу собрать с «дешевого» акселерометра умных часов. Я не ищу точных значений, меня больше интересуют относительные изменения. Я не был уверен, является ли это правильным SE, но поскольку в моем коде не так уж много того, что могло бы повлиять на это, я не думал, что он хорошо подходит для Stackoverflow. Спасибо за понимание.

Ответы (2)

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

Тот факт, что вы получаете гравитацию от 9,3 до 9,5, наводит на размышления. Это говорит о том, что у вас проблема со смещением или масштабом. Один из способов проверить это — считать значения с устройства, лежащего на столе, затем перевернуть его вверх дном и прочитать снова. Смещение будет отображаться как разница сверху вниз. Проблема с масштабом покажет низкие значения в обоих направлениях.

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

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

Спасибо. Я попробую ваши предложения, чтобы увидеть, смогу ли я определить, является ли это проблемой масштаба или смещения.
Я только что сделал быстрый тест, и, кажется, есть смещение. В одну сторону 9,685, в другую 9,949. В совокупности это на самом деле очень близко к удвоенному 9,81 (9,817).

Это должен быть комментарий, но я хотел включить график.

Было бы полезно иметь детали движения, которое вы наблюдаете.

Вы проверили, что ускорения вдоль двух других ортогональных осей равны нулю?

Площадь под графиком зависимости ускорения от времени показывает изменение скорости.

введите описание изображения здесь

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

Если вы подозреваете, что общее изменение скорости равно нулю, значит, ноль ускорения находится не в том месте, т.е. ось ускорения смещена?

Наверное, я слишком сильно пытаюсь упростить. Движение представляет собой простое движение вверх-вниз, вдоль оси, но не в идеальных условиях, т.е. оно не идеально прямое, и могут быть движения влево-вправо и вперед-назад. Таким образом, две другие оси не равны нулю, но я их игнорировал, так как в идеальных условиях они были бы равны нулю. Мне не нужны точные измерения, меня больше интересует относительное изменение, поэтому я пытаюсь упростить.