Фильтр Калмана и качество внутренних переменных состояния

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

Внутреннее состояние - это 6-компонентный вектор [speed-x, speed-y, speed-z, accel-x, accel-y, accel-z], а измеряемое состояние - 3-компонентный вектор [accel-x, accel-y, accel-z].

Фильтр работает очень хорошо на измеренных значениях, но скорость все еще очень шумная.

Plotted values

Теперь мне интересно, является ли это нормальным поведением или я делаю что-то не так, поскольку мое понимание фильтра Калмана очень базовое. Я использую библиотеку 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].

Меня вполне устраивает сигнал ускорения, и я думаю, что не могу улучшить его намного больше, но я бы хотел улучшить качество сигнала скорости.

6
задан Andraz 10 February 2012 в 15:10
поделиться