Перейти к содержимому
Compvision.ru
RinOS

Фильтр Калмана

Recommended Posts

Ну у Вас опечатка наверное, в wiki http://en.wikipedia.org/wiki/Kalman_filter

Это немного по-другому:

post-1-0-09186900-1348947041_thumb.jpg

Опечатки нет, это действительно немного по-другому. Я вывел матрицы в более строгом виде в соответствии с теорией.

Но и то, что представили Вы тоже работает.

post-5950-0-33979500-1349000549_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выкладываю примерный перевод главы про пример фильтра из книги Learning OpenCV, о котором шла речь в начале темы. Может кому поможет. А может кто и ошибки найдет

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

primer.pdf

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

есть двумерная функция X(t)

известно, что движение равноускоренное 
даны измерения координаты с интервалом в 1 сек 

Нужно сформировать файл out.txt  с сглаженной траекторией формата 

x1 x2 x1_optimal x2_optimal

первые две колонки - те же что и на входе, x1_optimal и x2_optimal - сглаженные значения 

 

Во вложенном файле x1 и x2

abr-kalman.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ммм, а в чём проблема? Была попытка подогнать стандартный пример из OpenCV под свои данные? Получилось? Нет? Что конкретно не получилось?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема в том, что я даже не знаю, как подогнать обычный пример. Может я неправильно подхожу к решению задачи или у меня опыта мало в программировании в целом? Моет не надо копаться в каждой строчке? Вот, например, при установке OpenCV у меня появился пример (вложенный файл) 

Единственное, что я понял, это что  

 

KF.transitionMatrix = *(Mat_<float>(2, 2) << 1, 1, 0, 1); - это матрица перехода

 

и 

 

setIdentity(KF.measurementMatrix);
setIdentity(KF.processNoiseCov, Scalar::all(1e-5));
setIdentity(KF.measurementNoiseCov, Scalar::all(1e-1)); - другие матрицы, ошибки и т.д.
setIdentity(KF.errorCovPost, Scalar::all(1));

 

Что означают остальные строчки - вообще не понятно. Что такое KalmanFilter (4, 2, 0), что за числа вообще, откуда?

Что за класс Mat, что он делает? Зачем нужен генератор случайных чисел в таких задачах? И, самое главное, понятия не имею что писать в main(), какие функции запускать и т.д. (Я понимаю, что там полно строчек по изображениям, но не важно, мне интересны остальные, по фильтру)

kalman.cpp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По-русски почитать можно на Хабре например:

 

http://habrahabr.ru/post/140274/

http://habrahabr.ru/post/166693/

http://habrahabr.ru/post/120133/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за информацию. Последний вопрос, если не затруднит:

 

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

 

while (getline(fin, s))

{

       ????куда????

}

 

или я опять что-то не так делаю:(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всё в соответствии с теорией:

KalmanFilter KF;
KF.init();
...
while()
{
    Mat prediction = KF.predict();
    Mat estimated = KF.correct(measurement);
}

Можешь ещё посмотреть намного более сложный случай применения фильтра Кальмана для 3D объектов, лежит в OpenCV 3.0, называется real_time_pose_estimation. Вот там динамическая модель выглядит интересней:

  //  [1 0 0 dt  0  0 dt2   0   0 0 0 0  0  0  0   0   0   0]
  //  [0 1 0  0 dt  0   0 dt2   0 0 0 0  0  0  0   0   0   0]
  //  [0 0 1  0  0 dt   0   0 dt2 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  1  0  0  dt   0   0 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  0  1  0   0  dt   0 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  0  0  1   0   0  dt 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  0  0  0   1   0   0 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  0  0  0   0   1   0 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  0  0  0   0   0   1 0 0 0  0  0  0   0   0   0]
  //  [0 0 0  0  0  0   0   0   0 1 0 0 dt  0  0 dt2   0   0]
  //  [0 0 0  0  0  0   0   0   0 0 1 0  0 dt  0   0 dt2   0]
  //  [0 0 0  0  0  0   0   0   0 0 0 1  0  0 dt   0   0 dt2]
  //  [0 0 0  0  0  0   0   0   0 0 0 0  1  0  0  dt   0   0]
  //  [0 0 0  0  0  0   0   0   0 0 0 0  0  1  0   0  dt   0]
  //  [0 0 0  0  0  0   0   0   0 0 0 0  0  0  1   0   0  dt]
  //  [0 0 0  0  0  0   0   0   0 0 0 0  0  0  0   1   0   0]
  //  [0 0 0  0  0  0   0   0   0 0 0 0  0  0  0   0   1   0]
  //  [0 0 0  0  0  0   0   0   0 0 0 0  0  0  0   0   0   1]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

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

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×