Hiểu bộ lọc Kalman qua một ví dụ radar đơn giản
(kalmanfilter.net)- Bộ lọc Kalman là một thuật toán ước lượng trạng thái tối ưu dùng để ước lượng trạng thái của hệ thống và dự đoán tương lai trong môi trường có nhiều nhiễu
- Lấy ví dụ radar theo dõi máy bay, bài viết giải thích quá trình lặp lại các bước dự đoán và cập nhật để tăng độ chính xác bằng cách dùng các giá trị đo khoảng cách và vận tốc
- Ở mỗi bước, thuật toán tính vector trạng thái, ma trận hiệp phương sai, độ lợi Kalman (Kalman Gain) để kết hợp có trọng số giữa giá trị đo và giá trị dự đoán
- Bài viết đưa ra các con số cho thấy khi cùng xem xét cả độ bất định của phép đo và độ bất định của mô hình, sai số ước lượng (độ bất định) giảm dần theo thời gian
- Thông qua ví dụ số trực quan và các phép tính theo từng bước, tài liệu cung cấp nền tảng hiểu biết để có thể tự thiết kế và triển khai bộ lọc
Giới thiệu về bộ lọc Kalman
-
Kalman Filter** là một thuật toán ước lượng trạng thái dùng để ước lượng và dự đoán trạng thái của hệ thống trong môi trường tồn tại độ bất định như nhiễu đo hoặc các yếu tố bên ngoài
- Đây là công cụ cốt lõi trong nhiều lĩnh vực như theo dõi vật thể, dẫn đường, robotics, điều khiển
- Ví dụ, nó được dùng để giảm nhiễu trong quỹ đạo chuột nhằm tạo chuyển động mượt hơn, phát hiện xu hướng trong dữ liệu tài chính, hoặc dự báo thời tiết
- Bài viết chỉ ra rằng nhiều tài liệu học tập quá thiên về suy diễn toán học nên thiếu ví dụ thực tế, và tài liệu này cung cấp phần giải thích trực quan tập trung vào ví dụ số
- Tài liệu cũng đề cập các trường hợp bộ lọc thất bại trong theo dõi do thiết kế sai và cách hiệu chỉnh
- Mục tiêu là giúp người đọc xây dựng được sự hiểu biết đủ để tự thiết kế và triển khai bộ lọc Kalman
Lộ trình học
- Tổng quan một trang: giới thiệu ngắn gọn các khái niệm cốt lõi và công thức chính, chỉ cần kiến thức nền tảng về thống kê và đại số tuyến tính
- Tutorial web miễn phí: tutorial trực tuyến với các ví dụ số theo từng bước để xây dựng trực giác, không yêu cầu kiến thức trước
- Kalman Filter from the Ground Up (sách): gồm 14 ví dụ số hoàn chỉnh, bộ lọc phi tuyến (Extended/Unscented) và hợp nhất cảm biến, kèm mã Python·MATLAB
Sự cần thiết của dự đoán
- Bài viết dùng ví dụ radar theo dõi máy bay để giải thích sự cần thiết của ước lượng trạng thái và dự đoán
- Trạng thái hệ thống là vị trí của máy bay (khoảng cách (r)), radar tính khoảng cách bằng cách đo thời gian phản xạ của xung
- Vận tốc (v) có thể đo bằng hiệu ứng Doppler
- Dự đoán vị trí sau một khoảng thời gian nhất định (\Delta t) được thực hiện thông qua mô hình động lực học
- Ví dụ: (r_{t_1} = r_{t_0} + v \cdot \Delta t)
- (\Delta t = 5s), (r_{t_0}=10,000m), (v=200m/s) → (r_{t_1}=11,000m)
- Trong môi trường thực tế luôn tồn tại nhiễu đo (Measurement Noise) và độ bất định của mô hình (Process Noise)
- Ngay cả khi nhiều radar cùng đo đồng thời thì kết quả vẫn khác nhau đôi chút
- Các yếu tố bên ngoài như gió có thể khiến giả định vận tốc không đổi không còn đúng
- Bộ lọc Kalman đồng thời thực hiện ước lượng trạng thái hiện tại và dự đoán trạng thái tương lai, đồng thời cung cấp độ bất định (phương sai) của từng ước lượng
- Đây là thuật toán tối ưu nhằm giảm thiểu độ bất định của ước lượng trạng thái
Ví dụ về bộ lọc Kalman
-
Một radar 1 chiều đo khoảng cách (r) và vận tốc (v) của máy bay
- Vector trạng thái (\boldsymbol{x} = [r, v]^T)
- Hệ thống được biểu diễn bằng vector và ma trận
-
Iteration 0 — Khởi tạo và dự đoán
-
Khởi tạo
- Khởi tạo bộ lọc bằng giá trị đo đầu tiên (\boldsymbol{z}_0 = [10{,}000, 200]^T)
- Độ bất định của phép đo (độ lệch chuẩn): khoảng cách 4m, vận tốc 0.5m/s (\boldsymbol{R}_0 = \begin{bmatrix}16 & 0 \ 0 & 0.25\end{bmatrix})
- Giá trị ước lượng trạng thái ban đầu (\hat{\boldsymbol{x}}_{0,0} = \boldsymbol{z}_0)
- Hiệp phương sai ban đầu (\boldsymbol{P}_{0,0} = \boldsymbol{R}_0)
-
Bước dự đoán
- Khoảng thời gian (\Delta t = 5s)
- Ma trận chuyển trạng thái (\boldsymbol{F} = \begin{bmatrix}1 & 5 \ 0 & 1\end{bmatrix})
- Trạng thái dự đoán (\hat{\boldsymbol{x}}{1,0} = \boldsymbol{F}\hat{\boldsymbol{x}}{0,0} = [11{,}000, 200]^T)
- Dự đoán hiệp phương sai (không tính nhiễu quá trình): (\boldsymbol{P}{1,0} = \boldsymbol{F}\boldsymbol{P}{0,0}\boldsymbol{F}^T = \begin{bmatrix}22.25 & 1.25 \ 1.25 & 0.25\end{bmatrix})
- Thêm nhiễu quá trình ((\sigma_a = 0.2m/s^2)): (\boldsymbol{Q} = \begin{bmatrix}6.25 & 2.5 \ 2.5 & 1\end{bmatrix})
- Hiệp phương sai dự đoán cuối cùng: (\boldsymbol{P}_{1,0} = \begin{bmatrix}28.5 & 3.75 \ 3.75 & 1.25\end{bmatrix})
-
Tóm tắt Iteration 0
- Khởi tạo trạng thái và hiệp phương sai từ phép đo đầu tiên
- Dùng mô hình chuyển trạng thái để dự đoán trạng thái tiếp theo và độ bất định
- Công thức dự đoán
- Dự đoán trạng thái: (\hat{\boldsymbol{x}}{n+1,n} = \boldsymbol{F}\hat{\boldsymbol{x}}{n,n} + \boldsymbol{G}\boldsymbol{u}_n)
- Dự đoán hiệp phương sai: (\boldsymbol{P}{n+1,n} = \boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T + \boldsymbol{Q})
-
Iteration 1 — Cập nhật và dự đoán
-
Cập nhật bộ lọc
- Phép đo thứ hai: (\boldsymbol{z}_1 = [11{,}020, 202]^T)
- Độ bất định của phép đo tăng lên (độ lệch chuẩn: khoảng cách 6m, vận tốc 1.5m/s) (\boldsymbol{R}_1 = \begin{bmatrix}36 & 0 \ 0 & 2.25\end{bmatrix})
- Khi so với hiệp phương sai dự đoán (\boldsymbol{P}_{1,0}), độ bất định của dự đoán nhỏ hơn
- Bộ lọc Kalman kết hợp phép đo và dự đoán bằng trung bình có trọng số
- Trọng số (K_1): Kalman Gain
- Công thức cập nhật trạng thái: (\hat{\boldsymbol{x}}{1,1} = \hat{\boldsymbol{x}}{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1 - \boldsymbol{H}\hat{\boldsymbol{x}}{1,0}))
- Ma trận quan sát (\boldsymbol{H} = \boldsymbol{I})
- Tính độ lợi Kalman: (\boldsymbol{K}1 = \boldsymbol{P}{1,0}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{1,0}\boldsymbol{H}^T + \boldsymbol{R}_1)^{-1}) Kết quả: (\boldsymbol{K}_1 = \begin{bmatrix}0.4048 & 0.6377 \ 0.0399 & 0.3144\end{bmatrix})
- Innovation: (\boldsymbol{z}1 - \hat{\boldsymbol{x}}{1,0} = [20, 2]^T)
- Giá trị hiệu chỉnh: (\boldsymbol{K}_1[20, 2]^T = [9.37, 1.43]^T)
- Trạng thái sau cập nhật: (\hat{\boldsymbol{x}}_{1,1} = [11{,}009.37, 201.43]^T)
-
Cập nhật hiệp phương sai
- Dùng dạng đơn giản hóa: (\boldsymbol{P}_{1,1} = (\boldsymbol{I} - \boldsymbol{K}1)\boldsymbol{P}{1,0})
- Kết quả: (\boldsymbol{P}_{1,1} = \begin{bmatrix}14.57 & 1.43 \ 1.43 & 0.71\end{bmatrix})
- Sau cập nhật, độ bất định nhỏ hơn cả độ bất định của dự đoán lẫn phép đo → khi kết hợp phép đo và dự đoán, độ bất định luôn giảm
-
Bước dự đoán
- Dự đoán cho thời điểm tiếp theo (t_2)
- Dự đoán trạng thái: (\hat{\boldsymbol{x}}{2,1} = \boldsymbol{F}\hat{\boldsymbol{x}}{1,1} = [12{,}016.5, 201.43]^T)
- Dự đoán hiệp phương sai: (\boldsymbol{P}{2,1} = \boldsymbol{F}\boldsymbol{P}{1,1}\boldsymbol{F}^T + \boldsymbol{Q} = \begin{bmatrix}52.86 & 7.47 \ 7.47 & 1.71\end{bmatrix})
- Nếu không có phép đo mới theo thời gian, độ bất định sẽ tăng trở lại
- Dự đoán cho thời điểm tiếp theo (t_2)
-
Tóm tắt Iteration 1
- Bước cập nhật: kết hợp dự đoán và phép đo bằng độ lợi Kalman
- Bước dự đoán: truyền trạng thái đã cập nhật sang thời điểm kế tiếp
- Các công thức chính
- Cập nhật trạng thái: (\hat{\boldsymbol{x}}{n,n} = \hat{\boldsymbol{x}}{n,n-1} + \boldsymbol{K}_n(\boldsymbol{z}n - \boldsymbol{H}\hat{\boldsymbol{x}}{n,n-1}))
- Cập nhật hiệp phương sai (Joseph form): (\boldsymbol{P}_{n,n} = (\boldsymbol{I} - \boldsymbol{K}n\boldsymbol{H})\boldsymbol{P}{n,n-1}(\boldsymbol{I} - \boldsymbol{K}_n\boldsymbol{H})^T + \boldsymbol{K}_n\boldsymbol{R}_n\boldsymbol{K}_n^T)
- Độ lợi Kalman: (\boldsymbol{K}n = \boldsymbol{P}{n,n-1}\boldsymbol{H}^T(\boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T + \boldsymbol{R}_n)^{-1})
Tóm tắt ví dụ
- Bộ lọc Kalman có ba bước: khởi tạo → dự đoán → cập nhật
- Sau đó lặp lại vòng dự đoán-cập nhật
- Mỗi khi có thêm phép đo mới, độ bất định giảm xuống và việc ước lượng trạng thái của hệ thống ngày càng tinh hơn
- Tài liệu học thêm
- Tutorial trực tuyến miễn phí: cung cấp ví dụ số theo từng bước
- Sách Kalman Filter from the Ground Up: gồm bộ lọc tuyến tính·phi tuyến, hướng dẫn triển khai, mã Python/MATLAB
1 bình luận
Ý kiến trên Hacker News
Tôi là tác giả. Gần đây tôi đã cập nhật trang chủ của tutorial Kalman Filter của mình. Tôi đã thêm một ví dụ theo dõi radar đơn giản để ngay cả những người chỉ biết nền tảng thống kê và đại số tuyến tính cũng có thể hiểu được
Tôi cố gắng giảm thiểu phần suy diễn công thức, đồng thời cho thấy một cách trực quan quá trình nhiễu của phép đo, mô hình dự đoán và cách bộ lọc kết hợp chúng. Tôi muốn nghe phản hồi về mức độ toán học và độ rõ ràng của phần giải thích
Theo tôi, hướng dẫn trực quan sẽ như sau
Cuối cùng, cốt lõi vẫn là phương pháp bình phương tối thiểu, và dưới một số giả định nhất định có thể chứng minh đây là cách tối ưu
Bài “How a Kalman Filter Works in Pictures” thật sự rất hay
Ví dụ, bộ lọc thông thấp cũng là một dạng bộ ước lượng, còn Kalman filter thì bổ sung mô hình quá trình và tính toán hiệp phương sai để có thể điều chỉnh một cách động.
Nó phản ánh mối quan hệ giữa các biến có tương quan như vị trí và vận tốc, để một phép đo của biến này cũng ảnh hưởng đến ước lượng của biến khác.
Tuy nhiên, vì dựa trên đại số tuyến tính nên nó phải giả định nhiễu Gaussian, và với các bài toán phi tuyến thì cần các biến thể như EKF hay UKF
Để hiểu Kalman filter, cần biết bốn điều sau
Bộ lọc là một lời giải toán học để ước lượng tối ưu trạng thái bên trong và hiệp phương sai của hệ thống dựa trên các phép đo.
Tôi nghĩ sách của Alex Becker là một tài liệu nhập môn rất tốt cho chủ đề này. Nó có nhiều ví dụ và giúp xây dựng trực giác rất tốt
Khi học Kalman filter, sẽ trực quan hơn nhiều nếu có từ hai đầu vào trở lên với các đặc tính nhiễu khác nhau. Nhưng phần lớn tutorial chỉ nói về một đầu vào duy nhất
Kalman filter cũng được dùng rất nhiều trong thực tế. Ví dụ, Sendspin sử dụng nó để đồng bộ loa
Có thể tham khảo demo trực tiếp và tài liệu triển khai
Tôi tò mò liệu có thể áp dụng khái niệm Kalman filter vào lời khai của con người hay không
Có thể xem một phần giải thích đơn giản tại thekalmanfilter.com
Bài này trông giống như quảng cáo cho một cuốn sách đắt tiền. Trong khi đã có rất nhiều tài liệu miễn phí, ví dụ như Kalman and Bayesian Filters in Python chẳng hạn. Tôi muốn biết cuốn sách này có điểm mạnh riêng gì