4 điểm bởi GN⁺ 12 ngày trước | 1 bình luận | Chia sẻ qua WhatsApp
  • 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
  • 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

    • Tôi đã lướt qua nhanh, và có cảm giác ma trận nhiễu quá trình Q xuất hiện khá đột ngột. Có lẽ trong sách sẽ có giải thích, nhưng sẽ tốt hơn nếu có một cơ sở ngắn gọn cho việc vì sao nó nhận những giá trị đó
    • Nhìn chung khá rõ ràng. Tuy vậy, ở phần đầu, sự khác biệt giữa mô hình hệ thống và bản thân Kalman filter hơi mơ hồ. Tôi nghĩ phần xây dựng ma trận trạng thái vẫn còn là giải thích về mô hình, nhưng rồi nó nối ngay sang các phương trình của bộ lọc nên hơi dễ gây nhầm lẫn
    • Tôi thực sự rất thích menu trợ năng. Việc điều chỉnh khả năng đọc của trang quá dễ dàng
    • Khoảng 6 tháng trước tôi từng thử tự triển khai Kalman filter, nhưng cấu trúc của nó thay đổi khá nhiều tùy theo miền ứng dụng nên tôi đã dừng giữa chừng. Tôi đang rất kỳ vọng tài liệu lần này sẽ giúp ích lớn để tôi đi đến cùng
    • Cụm từ “thuật toán tối ưu” ở đầu tutorial có phần hơi trừu tượng. Sẽ tốt hơn nếu giải thích ngắn gọn ý nghĩa của nó trước khi đi vào toán học
  • Theo tôi, hướng dẫn trực quan sẽ như sau

    1. Hiểu phương pháp bình phương tối thiểu có trọng số, và học cách cập nhật ước lượng hiện có bằng cách dùng phép đo mới cùng với độ bất định của nó
    2. Nếu giả định giá trị trung bình thực không thay đổi thì cách này hoạt động tốt
    3. Nhưng nếu giá trị trung bình thay đổi, Kalman filter sẽ dùng một mô hình để dự đoán sự thay đổi đó
    4. Sau khi dự đoán, ta lại quay về bài toán giống như ở (1)
      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

    • Tôi cũng thích cách giải thích bằng hình ảnh của bài đó. Tuy nhiên, mục tiêu của tutorial của tôi là xoay quanh ví dụ radar theo từng bước, đồng thời đề cập cả trực giác lẫn những cạm bẫy
    • Nhưng ngay cả những kiểu “giải thích đơn giản” này đôi khi thực ra vẫn có cảm giác quá phức tạp. Về bản chất, Kalman filter là một loại bộ ước lượng (estimator).
      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ìnhtí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

    1. Mô hình hệ thống
    2. Trạng thái bên trong
    3. Định nghĩa của ước lượng tối ưu
    4. Khái niệm hiệp phương sai
      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
    • Cảm ơn phản hồi. Tôi đang cân nhắc quyển 2 để nói về các chủ đề nâng cao hơn. Tuy vậy, tôi muốn làm rõ rằng EKF hay UKF là các phương pháp xấp xỉ nên không phải nghiệm tối ưu hoàn toàn
  • 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

    • Trong sách của tôi có một chương giới thiệu khái niệm sensor fusion. Nếu muốn học sâu hơn, tôi khuyên đọc sách của Bar-Shalom hoặc Blackman
    • Thực ra, bản chất của Kalman filter là ước lượng trạng thái (state estimation). Sensor fusion chỉ là một ứng dụng của nó; nếu đồng nhất hai khái niệm này sẽ dễ gây hiểu nhầm
  • 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ếptà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

    • Một ý tưởng thú vị. Có thể xem quan sát của con người như một cảm biến có nhiễu. Tuy nhiên, Kalman filter chuẩn giả định nhiễu Gaussian không chệch, nên với con người thì chưa chắc giả định đó có đúng 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ì

    • Câu hỏi hay. Nội dung Kalman filter cốt lõi được công khai miễn phí. Trong sách có nói thêm về tuning, các cân nhắc trong thiết kế và các ví dụ bổ sung
    • Sách của Roger Labbe và các notebook Jupyter thực sự rất tuyệt. Chúng giúp ích rất nhiều không chỉ cho Kalman filter mà còn cho việc hiểu cách tiếp cận các bài toán ước lượng nói chung
    • Tôi đã xem nhiều tài liệu khác, nhưng cuốn sách này đáng để giới thiệu vì phần giải thích chi tiết rất đầy đủ. Cũng có thể xem tutorial miễn phí ở đây
    • Tài liệu được link là một kinh điển kinh điển
    • Không có nhiều tài liệu tốt. Trong số những gì tôi đã xem, số tài liệu thực sự được làm tốt chỉ đếm trên đầu ngón tay. Đây là một tài liệu cho thấy nỗ lực giúp người đọc hiểu Kalman filter theo cách mới mẻ