Зараз я працюю над проектом для школи, де мені потрібно реалізувати розширений фільтр 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
Будь-яка порада високо цінується.
Редагувати:
У цей момент я дістав фільтр, щоб стабілізуватись з базовим шумом руху, але фактичного руху немає. Як тільки робот починає рухатися, фільтр розходяться досить швидко і виходить з карти.