Tôi hiện đang làm việc trong một dự án cho trường học, nơi tôi cần triển khai Bộ lọc Kalman mở rộng cho một robot điểm bằng máy quét laser. Robot có thể xoay với bán kính quay 0 độ và lái về phía trước. Tất cả các chuyển động là piecewise tuyến tính (ổ đĩa, xoay, ổ đĩa).
Trình giả lập chúng tôi đang sử dụng không hỗ trợ tăng tốc, tất cả chuyển động là tức thời.
Chúng tôi cũng có một bản đồ đã biết (hình ảnh png) mà chúng tôi cần bản địa hóa. Chúng tôi có thể chiếu tia trong hình ảnh để mô phỏng quét laser.
Đối tác của tôi và tôi hơi bối rối về các mô hình chuyển động và cảm biến mà chúng tôi sẽ cần sử dụng.
Cho đến nay chúng ta đang mô hình hóa trạng thái như một vectơ .
Chúng tôi đang sử dụng các phương trình cập nhật như sau
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;
}
Chúng tôi nghĩ rằng chúng tôi đã làm mọi thứ cho đến khi chúng tôi nhận thấy rằng chúng tôi quên khởi tạo P
và nó bằng không, có nghĩa là không có sự điều chỉnh nào xảy ra. Rõ ràng sự lan truyền của chúng tôi rất chính xác vì chúng tôi chưa đưa tiếng ồn vào hệ thống.
Đối với mô hình chuyển động, chúng tôi đang sử dụng ma trận sau cho F:
Là Jacobian của công thức cập nhật của chúng tôi. Điều này có đúng không?
Đối với mô hình cảm biến, chúng tôi đang tính xấp xỉ Jacobian (H) bằng cách lấy sự khác biệt hữu hạn của các vị trí robot , và và dò tia trong bản đồ. Chúng tôi đã nói chuyện với TA, người nói rằng việc này sẽ hiệu quả nhưng tôi vẫn không chắc là nó sẽ hoạt động. Prof của chúng tôi đi vắng nên chúng tôi không thể hỏi anh ấy một cách đáng tiếc. Chúng tôi đang sử dụng 3 phép đo laser cho mỗi bước hiệu chỉnh nên H là 3x3.
Vấn đề khác khi có cách khởi tạo P. Chúng tôi đã thử 1.10.100 và tất cả họ đều đặt robot bên ngoài bản đồ ở (-90, -70) khi bản đồ chỉ có 50x50.
Mã cho dự án của chúng tôi có thể được tìm thấy ở đây: https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
Bất cứ lời khuyên nào cũng đươc đánh giá cao.
BIÊN TẬP:
Tại thời điểm này, tôi đã nhận được bộ lọc để ổn định với tiếng ồn chuyển động cơ bản nhưng không có chuyển động thực tế. Ngay khi robot bắt đầu di chuyển bộ lọc sẽ chuyển hướng khá nhanh và thoát khỏi bản đồ.