Зараз я працюю над проектом для школи, де мені потрібно реалізувати розширений фільтр Kalman для точкового робота з лазерним сканером. Робот може обертатися з радіусом повороту 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:
Як це якобіанські наші формули оновлення. Це правильно?
Для моделі сенсорів ми наближаємось до якобіанського (H), приймаючи кінцеві відмінності позицій роботів , та та відстеження променів на карті. Ми поговорили з ТА, яка сказала, що це буде працювати, але я все ще не впевнений, що це буде. Наш професор відсутній, тому ми не можемо його запитати на жаль. Ми використовуємо 3 лазерні вимірювання за крок корекції, так що H - 3x3.
Інше питання, де потрібно ініціалізувати P. Ми спробували 1 10000, і всі вони розміщують робота за межами карти в (-90, -70), коли карта лише 50x50.
Код нашого проекту можна знайти тут: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Будь-яка порада високо цінується.
Редагувати:
У цей момент я дістав фільтр, щоб стабілізуватись з базовим шумом руху, але фактичного руху немає. Як тільки робот починає рухатися, фільтр розходяться досить швидко і виходить з карти.