Я пытаюсь разработать приложение для обнаружения движения для Android. Приложение должно уметь отслеживать движение телефона в пространстве и сопоставлять его с движением на экране компьютера. Я использую 3-осевой акселерометр и, поскольку данные очень шумные, я использую фильтр Калмана.
Внутреннее состояние - это 6-компонентный вектор [speed-x, speed-y, speed-z, accel-x, accel-y, accel-z], а измеряемое состояние - 3-компонентный вектор [accel-x, accel-y, accel-z].
Фильтр работает очень хорошо на измеренных значениях, но скорость все еще очень шумная.
Теперь мне интересно, является ли это нормальным поведением или я делаю что-то не так, поскольку мое понимание фильтра Калмана очень базовое. Я использую библиотеку JKalman и следующую матрицу перехода состояния (dt - 1/15, что является приблизительной частотой обновления датчика)
double[][] A = { { 1, 0, 0, 0, dt, 0, 0 } { 0, 1, 0, 0, 0, dt, 0 }, { 0, 0, 1, 0, 0, 0, dt }, { 0, 0, 0, 1, 0, 0 }, { 0, 0, 0, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1 } };
Я также установил свои собственные ковариационные матрицы с ковариациями, рассчитанными на основе тестовых данных. Это немного улучшило сигнал ускорения, но не повлияло на скорость.
В настоящее время мне удается достичь stdvar
[0,0632041857 0,0607274545 0,0886326602] для скорости [x, y, z]
[0,0041689678 0,004423822 0,0074808552] для ускорения [x, y, z].
Меня вполне устраивает сигнал ускорения, и я думаю, что не могу улучшить его намного больше, но я бы хотел улучшить качество сигнала скорости.