В настоящее время я работаю над проектом для школы, где мне нужно реализовать расширенный фильтр Калмана для точечного робота с лазерным сканером. Робот может вращаться с радиусом поворота 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
Любые советы высоко ценится.
РЕДАКТИРОВАТЬ:
В этот момент я получил фильтр для стабилизации с базовым шумом движения, но без фактического движения. Как только робот начинает двигаться, фильтр довольно быстро расходится и выходит из карты.
источник
Прежде всего, вы ничего не упомянули о том, какую локализацию вы используете. Это с известными или неизвестными соответствиями?
Теперь, чтобы приобрести якобиана в Matlab, вы можете сделать следующее
Результат
Расширенный фильтр Калмана требует, чтобы система была линейной, а шум - гауссовским. Система здесь означает, что модели движения и наблюдения должны быть линейными. Лазерные датчики дают диапазон и угол к ориентиру от рамы робота, поэтому модель измерения не является линейной. О
P
, если вы предполагаете, что он большой, тогда ваш EKF-оценщик будет плохим в начале, и он будет опираться на измерения, потому что предыдущий вектор состояния недоступен. Однако, как только ваш робот начнет двигаться и чувствовать, EKF станет лучше, потому что он использует модели движения и измерения для оценки позы робота. Если ваш робот не обнаруживает какие-либо ориентиры, неопределенность резко возрастает. Кроме того, вы должны быть осторожны с углом. В C ++cos and sin
угол должен быть в радианах. В вашем коде нет ничего об этой проблеме. Если при расчете в радианах вы принимаете шум в градусах в градусах, вы можете получить странные результаты, поскольку один градус в виде шума в то время как вычисления в радианах считаются огромными.источник