В настоящее время я работаю над проектом для школы, где мне нужно реализовать расширенный фильтр Калмана для точечного робота с лазерным сканером. Робот может вращаться с радиусом поворота 0 градусов и двигаться вперед. Все движения кусочно-линейные (движение, вращение, движение).
Симулятор, который мы используем, не поддерживает ускорение, все движения происходят мгновенно.
У нас также есть известная карта (изображение в формате PNG), которую нам нужно локализовать. Мы можем проследить лучи на изображении для имитации лазерного сканирования.
Мы с моим партнером немного смущены тем, какие модели датчиков движения и нам нужно использовать.
До сих пор мы моделируем состояние как вектор .
Мы используем уравнения обновления следующим образом
void kalman::predict(const nav_msgs::Odometry msg){
this->X[0] += linear * dt * cos( X[2] ); //x
this->X[1] += linear * dt * sin( X[2] ); //y
this->X[2] += angular * dt; //theta
this->F(0,2) = -linear * dt * sin( X[2] ); //t+1 ?
this->F(1,2) = linear * dt * cos( X[2] ); //t+1 ?
P = F * P * F.t() + Q;
this->linear = msg.twist.twist.linear.x;
this->angular = msg.twist.twist.angular.z;
return;
}
Мы думали, что у нас все работает, пока не заметили, что мы забыли инициализировать P
и что он равен нулю, то есть исправление не происходит. По-видимому, наше распространение было очень точным, так как мы еще не вносили шум в систему.
Для модели движения мы используем следующую матрицу для F:
Как якобиан наших обновлений формул. Это правильно?
Другая проблема, связанная с инициализацией P. Мы попробовали 1,10,100, и все они размещают робота за пределами карты (-90, -70), когда карта только 50x50.
Код для нашего проекта можно найти здесь: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Любые советы высоко ценится.
РЕДАКТИРОВАТЬ:
В этот момент я получил фильтр для стабилизации с базовым шумом движения, но без фактического движения. Как только робот начинает двигаться, фильтр довольно быстро расходится и выходит из карты.