Jump to content
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

Share this post


Link to post
Share on other sites

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

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

primer.pdf

  • Like 1

Share this post


Link to post
Share on other sites

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

 

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

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

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

x1 x2 x1_optimal x2_optimal

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

 

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

abr-kalman.txt

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Проблема в том, что я даже не знаю, как подогнать обычный пример. Может я неправильно подхожу к решению задачи или у меня опыта мало в программировании в целом? Моет не надо копаться в каждой строчке? Вот, например, при установке 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

Share this post


Link to post
Share on other sites

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

 

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

 

while (getline(fin, s))

{

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

}

 

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

Share this post


Link to post
Share on other sites

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

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]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×