Фильтр Калмана и качество внутренних переменных состояния - PullRequest
6 голосов
/ 10 февраля 2012

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

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

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

Plotted values

Теперь мне интересно, является ли это нормальным поведением или я делаю что-то не так, так как мое понимание фильтра Калмана очень простое.Я использую библиотеку JKalman и следующую матрицу перехода состояний (dt равно 1/15, что является приблизительной частотой обновления датчика)

double [] [] A = {{1, 0, 0, dt,0, 0}, {0, 1, 0, 0, дт, 0}, {0, 0, 1, 0, 0, дт}, {0, 0, 0, 1, 0, 0}, {0,0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 1}};

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

В настоящее время я могу достичь стандартного значения

[0,0632041857 0,0607274545 0,0886326602] для скорости [x, y, z]

[0,0041689678 0,004423822 0,0074808552] для ускорения [x, y, z].

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

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Не будет работать.

Независимо от того, что вы делаете, скорость станет очень неточной в считанные секунды. Хотя ответ в приведенной выше ссылке касается позиции, то же самое относится и к скорости. Что касается фильтра Калмана, см. Также здесь.

Вы должны либо попробовать GPS для определения скорости, либо (если применимо) просто использовать ориентацию телефона в своем приложении и отказаться от получения скорости.

2 голосов
/ 10 февраля 2012

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

stdvars должен представлять только шум, но я сомневаюсь, что это то, что вы рассчитали.Но что более важно, я думаю, что вам не хватает некоторых входных данных: фильтры Калмана используются, когда у вас есть много разных входов, например, акселерометр + GPS.

Кажется невозможным - с Калманом или чем-то еще - что вы могли бы читать на шумном входе акселерометра и каким-то образом получить плавную точную траекторию.Вы всегда можете сделать какое-то усреднение по времени данных акселерометра, что даст вам плавную траекторию, но траектория будет отличаться от реальной.(Если вы хотите попробовать усреднение по времени: например, a_smooth {i} = 0,6 a {i} + 0,3 a {i-1} + 0,1 a {i-2}.)

И естьбольшая проблема в том, что точность акселерометра очень мала, и вы, вероятно, не можете с этим ничего поделать, особенно отслеживая положение, как ответил @ Ali.

EDIT : Iнашел в Интернете некоторые ссылки, которые имеют уравнения, аналогичные вашим, но они были для фильтра Калмана, используемого в модели с постоянным ускорением, что, очевидно, не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...