Học bộ lọc Kalman từ nền tảng
(kalmanfilter.net)- Kalman Filter là thuật toán ước lượng trạng thái hiện tại và dự đoán tương lai trong các hệ thống có nhiễu đo lường và các yếu tố bên ngoài chưa biết; được dùng trong các lĩnh vực như theo dõi, định vị, robotics và điều khiển
- Ví dụ radar một chiều đo khoảng cách (r) và vận tốc (v) của máy bay; xử lý đồng thời trạng thái và độ bất định bằng vector trạng thái (\boldsymbol{x}=[r, v]^T) và các ma trận hiệp phương sai (\boldsymbol{P}, \boldsymbol{R}, \boldsymbol{Q})
- Giá trị đo ban đầu là khoảng cách 10.000m, vận tốc 200m/s; nếu áp dụng khoảng lấy mẫu 5 giây và mô hình vận tốc không đổi, vị trí dự đoán tiếp theo là 11.000m
- Bước dự đoán lan truyền trạng thái bằng ma trận chuyển trạng thái (\boldsymbol{F}), tính hiệp phương sai bằng (\boldsymbol{F}\boldsymbol{P}\boldsymbol{F}^T+\boldsymbol{Q}), phản ánh việc độ bất định của vận tốc và nhiễu quá trình làm tăng độ bất định của vị trí
- Bước cập nhật không tin hoàn toàn phép đo mới cũng không loại bỏ nó, mà kết hợp có trọng số giữa dự đoán và đo lường bằng Kalman Gain để giảm độ bất định của ước lượng; sau đó bộ lọc lặp lại dự đoán và cập nhật
Bài toán mà Kalman Filter xử lý
- Kalman Filter là thuật toán thực hiện ước lượng trạng thái và dự đoán tương lai trong các hệ thống có độ bất định
- Xử lý các tình huống có nhiễu đo lường hoặc các yếu tố bên ngoài chưa biết tác động lên hệ thống
- Được dùng như công cụ cốt lõi trong các lĩnh vực theo dõi vật thể, định vị, robotics và điều khiển
- Trong ước lượng quỹ đạo chuột máy tính, có thể giảm run tay và nhiễu để tạo đường di chuyển ổn định hơn
- Trong phân tích thị trường tài chính, được dùng để phát hiện xu hướng giá cổ phiếu từ dữ liệu thị trường lẫn nhiễu; trong khí tượng học, được áp dụng vào dự báo thời tiết
- Tutorial này xây dựng trực giác bằng ví dụ số thay vì đưa toán học phức tạp lên trước
- Cũng bao gồm ví dụ về Kalman Filter được thiết kế sai khiến nó không theo dõi vật thể đúng cách
- Mục tiêu là đạt đến mức có thể hiểu khái niệm và toán học, rồi tự thiết kế và triển khai
Lộ trình học
- Lộ trình học được cung cấp được chia thành ba giai đoạn
- Tổng quan một trang: giải thích các khái niệm cốt lõi và phương trình thiết yếu mà không suy dẫn, giả định người đọc có kiến thức thống kê cơ bản và đại số tuyến tính
- Tutorial web miễn phí dựa trên ví dụ: tại tutorial, xây dựng trực giác bằng các ví dụ số và trình bày từng bước đến phần suy dẫn các phương trình Kalman Filter
- Sách: Kalman Filter from the Ground Up gồm 14 ví dụ số được giải đầy đủ, đồ thị và bảng hiệu năng, Extended Kalman Filter và Unscented Kalman Filter, sensor fusion, cùng hướng dẫn triển khai
Vì sao cần dự đoán trong theo dõi bằng radar
- Để radar theo dõi máy bay, nó phải liên tục hướng chùm tia hẹp về phía mục tiêu, nên cần dự đoán vị trí tương lai tại thời điểm gửi chùm tia kế tiếp
- Nếu dự đoán thất bại, chùm tia có thể hướng sai và mất dấu mục tiêu
- Cần có mô hình động biểu diễn cách máy bay di chuyển theo thời gian
- Trong ví dụ một chiều được đơn giản hóa, chỉ xét chuyển động thẳng khi máy bay tiến lại gần hoặc đi xa radar
- Trạng thái được định nghĩa là khoảng cách (r) từ radar
- Radar tính khoảng cách (r) bằng thời gian phát/thu xung và tốc độ ánh sáng
- Cũng có thể đo vận tốc (v) bằng hiệu ứng Doppler
- Giả sử tại (t_0), đo được khoảng cách 10.000m và vận tốc 200m/s với độ đúng và độ chính xác rất cao
- Khoảng lấy mẫu là (\Delta t=5s)
- Trong mô hình vận tốc không đổi, quãng đường di chuyển là (\Delta r=v\cdot\Delta t)
- Vị trí dự đoán là (10,000+200\cdot5=11,000m)
Nhiễu đo lường và nhiễu quá trình
- Phép đo radar thực tế không hoàn hảo; ngay cả khi nhiều radar đo cùng một máy bay tại cùng thời điểm, kết quả vẫn hơi khác nhau
- Sự dao động này phát sinh do nhiễu đo lường
- Cần tính không chỉ giá trị ước lượng, mà cả mức độ đáng tin cậy của ước lượng đó
- Mô hình động cũng không mô tả hoàn toàn chuyển động thực tế
- Dù giả định máy bay di chuyển với vận tốc không đổi, các yếu tố bên ngoài như gió vẫn có thể thay đổi chuyển động thực
- Những ảnh hưởng không thể dự đoán này được xử lý như nhiễu quá trình
- Kalman Filter cung cấp đồng thời ước lượng trạng thái hiện tại, dự đoán trạng thái tương lai và độ bất định của từng phần
- Được giới thiệu là thuật toán tối ưu giúp tối thiểu hóa độ bất định của ước lượng trạng thái
Biểu diễn trạng thái và khởi tạo trong ví dụ radar
- Trạng thái hệ thống trong ví dụ là vector gồm khoảng cách (r) và vận tốc (v) của máy bay
[ \boldsymbol{x}=\left[\begin{matrix}r\v\\end{matrix}\right] ]
- Vector được ký hiệu bằng chữ thường in đậm, ma trận bằng chữ hoa in đậm
- Khởi tạo Kalman Filter bằng phép đo đầu tiên
- Tại (t_0), giá trị đo là khoảng cách 10.000m, vận tốc 200m/s
- Vector đo như sau
[ \boldsymbol{z}_0=\left[\begin{matrix}10{,}000\200\\end{matrix}\right] ]
- Giá trị đo không phải trạng thái hệ thống chính xác, mà là biến ngẫu nhiên có lẫn nhiễu
- Độ lệch chuẩn của phép đo khoảng cách là (4m)
- Độ lệch chuẩn của phép đo vận tốc là (0.5m/s)
- Vì phương sai là bình phương của độ lệch chuẩn, ma trận hiệp phương sai đo lường (\boldsymbol{R}_0) như sau
[ \boldsymbol{R}_0=\left[\begin{matrix}16&0\0&0.25\\end{matrix}\right] ]
- Trong ví dụ này, giả định sai số đo khoảng cách và vận tốc không liên quan với nhau, nên đặt các phần tử ngoài đường chéo của ma trận hiệp phương sai bằng 0
- Tại thời điểm khởi tạo, vì chỉ có một phép đo duy nhất, có thể dùng giá trị đo làm ước lượng trạng thái ban đầu
[ \boldsymbol{\hat{x}}_{0,0}=\boldsymbol{z}_0=\left[\begin{matrix}10{,}000\200\\end{matrix}\right] ]
- Cách này chỉ khả dụng trong bước khởi tạo
Bước dự đoán: lan truyền trạng thái và hiệp phương sai
- Để dự đoán trạng thái tiếp theo, dùng mô hình động vận tốc không đổi
[ v_1=v_0=v ]
[ r_1=r_0+v_0\Delta t ]
- Dự đoán trạng thái ở dạng ma trận như sau
[ {\hat{\boldsymbol{x}}}{1,0}=\boldsymbol{F}{\hat{\boldsymbol{x}}}{0,0} ]
- (\boldsymbol{F}) là ma trận chuyển trạng thái; khi (\Delta t=5s), kết quả dự đoán như sau
[ {\hat{\boldsymbol{x}}}_{1,0}
\left[\begin{matrix}1&5\0&1\\end{matrix}\right] \left[\begin{matrix}10,000\200\\end{matrix}\right]
\left[\begin{matrix}11,000\200\\end{matrix}\right] ]
- Ngoại suy trạng thái tổng quát, tức phương trình dự đoán, như sau
[ {\hat{\boldsymbol{x}}}{n+1,n}=\boldsymbol{F}{\hat{\boldsymbol{x}}}{n,n}+\boldsymbol{G}\boldsymbol{u}_n ]
- (\boldsymbol{u}_n) là biến đầu vào
- (\boldsymbol{G}) là ma trận chuyển đầu vào
- Trong ví dụ này không có đầu vào, nên (\boldsymbol{u}_n=0)
- Hiệp phương sai không được tính đơn giản bằng (\boldsymbol{F}\boldsymbol{P})
- Vì hiệp phương sai bao gồm các hạng bình phương của phương sai và hiệp phương sai
- Khi không có nhiễu quá trình, phương trình ngoại suy hiệp phương sai như sau
[ \boldsymbol{P}{n+1,n}=\boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T ]
- Trong ví dụ, khi lan truyền hiệp phương sai ban đầu (\boldsymbol{P}_{0,0}), thu được kết quả sau
[ \boldsymbol{P}_{1,0}
\left[\begin{matrix}22.25&1.25\1.25&0.25\\end{matrix}\right] ]
- Phương sai vận tốc được giữ ở (0.25m^2/s^2)
- Phương sai khoảng cách tăng từ (16m^2) lên (22.25m^2)
- Độ bất định của vận tốc theo thời gian dẫn đến độ bất định của khoảng cách
Phản ánh nhiễu quá trình
- Chỉ với giả định vận tốc không đổi thì khó mô tả hoàn toàn chuyển động thực của máy bay
- Các yếu tố bên ngoài chưa biết như gió có thể ảnh hưởng đến vận tốc
- Những ảnh hưởng không thể dự đoán này được biểu diễn bằng nhiễu quá trình (\boldsymbol{Q})
- Phương trình dự đoán hiệp phương sai có xét nhiễu quá trình như sau
[ \boldsymbol{P}{n+1,n}=\boldsymbol{F}\boldsymbol{P}{n,n}\boldsymbol{F}^T+\boldsymbol{Q} ]
- Trong ví dụ, giả định độ lệch chuẩn của gia tốc ngẫu nhiên là (\sigma_a=0.2m/s^2)
- Phương sai là (\sigma_a^2=0.04m^2/s^4)
- Khi (\Delta t=5s), ma trận nhiễu quá trình như sau
[ \boldsymbol{Q}
\left[\begin{matrix}6.25&2.5\2.5&1\\end{matrix}\right] ]
- Hiệp phương sai dự đoán sau khi cộng nhiễu quá trình như sau
[ \boldsymbol{P}_{1,0}
\left[\begin{matrix}28.5&3.75\3.75&1.25\\end{matrix}\right] ]
Bước cập nhật: kết hợp phép đo và dự đoán
- Tại (t_1), phép đo thứ hai như sau
[ \boldsymbol{z}_1= \left[\begin{matrix}11{,}020\202\\end{matrix}\right] ]
- Phép đo này có tỷ lệ tín hiệu trên nhiễu thấp hơn phép đo đầu tiên và độ bất định lớn hơn do một spike nhiễu mạnh
- Độ lệch chuẩn của phép đo khoảng cách là (6m)
- Độ lệch chuẩn của phép đo vận tốc là (1.5m/s)
- Ma trận hiệp phương sai đo lường như sau
[ \boldsymbol{R}_1= \left[\begin{matrix}36&0\0&2.25\\end{matrix}\right] ]
- Tại (t_1), có thể sử dụng cả trạng thái dự đoán đã tính ở bước trước và phép đo mới
- Các phần tử đường chéo của hiệp phương sai dự đoán (\boldsymbol{P}_{1,0}) là (28.5), (1.25)
- Các phần tử đường chéo của hiệp phương sai đo lường (\boldsymbol{R}_1) là (36), (2.25)
- Trong trường hợp này, độ bất định của dự đoán nhỏ hơn độ bất định của phép đo
- Kalman Filter không dùng nguyên phép đo mới, cũng không chỉ giữ nguyên dự đoán
- Nó kết hợp dự đoán và phép đo bằng trung bình có trọng số
- Đặt trọng số lớn hơn cho phía có độ bất định thấp hơn
- Dạng kết hợp một chiều như sau
[ \hat{x}{1,1}=K_1z_1+(1-K_1)\hat{x}{1,0} ]
- (K_1) là Kalman Gain, quyết định mức trọng số dành cho phép đo và dự đoán
- Khi giả định mô hình đúng, nó tối thiểu hóa độ bất định của ước lượng sau cập nhật
Cập nhật trạng thái và innovation
- Phương trình cập nhật trạng thái ở dạng ma trận như sau
[ \hat{\boldsymbol{x}}_{1,1}
\hat{\boldsymbol{x}}_{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1-\hat{\boldsymbol{x}}{1,0}) ]
- Nói chung, giá trị đo và trạng thái hệ thống có thể không biểu diễn cùng một đại lượng vật lý
- Nhiệt kế số đo tín hiệu điện, nhưng trạng thái hệ thống có thể là nhiệt độ
- Khi đó cần ma trận quan sát (\boldsymbol{H}) để chuyển trạng thái dự đoán sang miền đo lường
- Phương trình cập nhật trạng thái tổng quát như sau
[ \hat{\boldsymbol{x}}_{1,1}
\hat{\boldsymbol{x}}_{1,0} + \boldsymbol{K}_1(\boldsymbol{z}1-\boldsymbol{H}\hat{\boldsymbol{x}}{1,0}) ]
- (\boldsymbol{z}1-\boldsymbol{H}\hat{\boldsymbol{x}}{1,0}) là innovation hoặc residual, biểu thị thông tin mới
- Trong ví dụ, cả trạng thái và phép đo đều là khoảng cách và vận tốc, nên (\boldsymbol{H}) là ma trận đơn vị
Tính Kalman Gain
- Kalman Gain một chiều như sau
[ K_n=\frac{p_{n,n-1}}{p_{n,n-1}+r_n} ]
- (p_{n,n-1}) là phương sai của trạng thái dự đoán
- (r_n) là phương sai đo lường
- Trong Kalman Filter đa biến, Kalman Gain trở thành ma trận và có dạng như sau
[ \boldsymbol{K}n= \boldsymbol{P}{n,n-1}\boldsymbol{H}^T \left( \boldsymbol{H}\boldsymbol{P}_{n,n-1}\boldsymbol{H}^T+\boldsymbol{R}_n \right)^{-1} ]
- Kalman Gain tại (t_1) được tính trong ví dụ như sau
[ \boldsymbol{K}_1= \left[\begin{matrix}0.4048&0.6377\0.0399&0.3144\\end{matrix}\right] ]
- Có thể tính ma trận nghịch đảo bằng
inv(A)trong MATLAB hoặcnumpy.linalg.inv(A)trong Python- Trong triển khai thực tế, thay vì tính nghịch đảo tường minh, thường tốt hơn nếu giải trực tiếp hệ tuyến tính, như
A\btrong MATLAB hoặcnumpy.linalg.solve(A, b)trong Python
- Trong triển khai thực tế, thay vì tính nghịch đảo tường minh, thường tốt hơn nếu giải trực tiếp hệ tuyến tính, như
Kết quả cập nhật và giảm hiệp phương sai
- Trong ví dụ, innovation như sau
[ \boldsymbol{z}1-\hat{\boldsymbol{x}}{1,0}
\left[\begin{matrix}20\2\\end{matrix}\right] ]
- Lượng hiệu chỉnh sau khi áp dụng Kalman Gain như sau
[ \boldsymbol{K}_1 \left[\begin{matrix}20\2\\end{matrix}\right]
\left[\begin{matrix}9.37\1.43\\end{matrix}\right] ]
- Ước lượng trạng thái sau cập nhật như sau
[ \hat{\boldsymbol{x}}_{1,1}
\left[\begin{matrix}11{,}009.37\201.43\\end{matrix}\right] ]
- Trong cập nhật hiệp phương sai đa biến, Joseph form thường được dùng
[ \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 ]
- Trong tài liệu, dạng rút gọn cũng thường xuất hiện
[ \boldsymbol{P}_{n,n}
(\boldsymbol{I}-\boldsymbol{K}n\boldsymbol{H}) \boldsymbol{P}{n,n-1} ]
- Với số học chính xác, hai dạng cho cùng kết quả
- Trong triển khai trên máy tính, Joseph form thường ổn định số học hơn
- Trong ví dụ, dùng cập nhật hiệp phương sai dạng rút gọn và thu được kết quả sau
[ \boldsymbol{P}_{1,1}
\left[\begin{matrix}14.57&1.43\1.43&0.71\\end{matrix}\right] ]
- Độ bất định của ước lượng sau cập nhật thấp hơn cả độ bất định của dự đoán lẫn đo lường
- Các phần tử đường chéo của hiệp phương sai dự đoán là (28.5), (1.25)
- Các phần tử đường chéo của hiệp phương sai đo lường là (36), (2.25)
- Các phần tử đường chéo của hiệp phương sai cập nhật là (14.57), (0.71)
- Về lý thuyết, thông tin mới làm giảm độ bất định của ước lượng ngay cả khi nó có độ bất định lớn
- Trong hệ thống thực tế, đôi khi cần loại bỏ các phép đo khó tin cậy
Dự đoán tiếp theo và vòng lặp lặp lại
- Bước dự đoán của Iteration 1 được thực hiện theo cùng cách với Iteration 0
- Tuy nhiên, điểm bắt đầu là (\hat{\boldsymbol{x}}{1,1}) và (\boldsymbol{P}{1,1}) đã được cập nhật
- Dự đoán trạng thái như sau
[ \hat{\boldsymbol{x}}_{2,1}
\boldsymbol{F}\hat{\boldsymbol{x}}_{1,1}
\left[\begin{matrix}12,016.5\201.43\\end{matrix}\right] ]
- Dự đoán hiệp phương sai như sau
[ \boldsymbol{P}_{2,1}
\boldsymbol{F}\boldsymbol{P}_{1,1}\boldsymbol{F}^\top+\boldsymbol{Q}
\left[\begin{matrix}52.86&7.47\7.47&1.71\\end{matrix}\right] ]
- Nếu thời gian trôi qua mà không có phép đo mới, cả hai phương sai lại tăng lên
- Độ bất định của vận tốc tiếp tục làm tăng độ bất định của khoảng cách, khiến phương sai khoảng cách tăng nhanh hơn
- Kalman Filter hoạt động theo cấu trúc: khởi tạo một lần khi bắt đầu, rồi liên tục lặp lại dự đoán và cập nhật
- Dự đoán lan truyền ước lượng hiện tại và hiệp phương sai sang thời điểm tiếp theo bằng mô hình chuyển trạng thái
- Cập nhật kết hợp phép đo mới và dự đoán bằng Kalman Gain để cập nhật trạng thái hiện tại và độ bất định
1 bình luận
Ý kiến trên Hacker News
Mỗi khi thấy “hướng dẫn cho người mới bắt đầu” thì tôi đều kỳ vọng, nhưng phần lớn là thất vọng, và lần này cũng không ngoại lệ
Ban đầu thì ổn, nhưng kiểu gì cũng bỏ qua một khái niệm hay thuật ngữ cốt lõi nào đó mà không giải thích đủ. Ở đây tôi khựng lại ở đoạn: “biến ngẫu nhiên được mô tả bằng hàm mật độ xác suất, và hàm mật độ xác suất được đặc trưng bởi các moment. Moment của một giá trị xác suất là kỳ vọng của lũy thừa của biến ngẫu nhiên”.
Tôi không biết đó là kỳ vọng theo số mũ của giá trị xác suất, hay là kỳ vọng của một giá trị xác suất được nâng lên lũy thừa nào đó, và cũng không hiểu vì sao lũy thừa lại đặc biệt chứ không phải chính giá trị xác suất. Cảm giác như các tác giả đột nhiên từ bỏ việc giải thích dễ hiểu giữa dòng suy nghĩ, hoặc ngay từ đầu họ chưa thật sự hiểu các khái niệm nền tảng nên không thể giải thích cho người khác, điều đó khá bực bội. Giá như có thể hỏi giảng viên như trên Udemy thì tốt, còn với tác giả sách thì chẳng có cách nào nhận được câu trả lời
Chỉ cần tác giả không giải thích đủ một lần là toàn bộ sẽ sụp đổ, và nếu có vòng phản hồi thì sẽ rất hữu ích. Nếu không có, cuối cùng bạn phải tự chịu trách nhiệm tra cứu những từ và cụm từ mình không biết. Hãy tìm những cách diễn đạt mà bạn chưa hiểu đủ, như “biến ngẫu nhiên” hay “hàm mật độ xác suất”, rồi bổ sung bằng Wikipedia, ChatGPT, giáo trình, video, v.v. Quá trình này mang tính đệ quy nên sẽ lại xuất hiện các khái niệm chưa biết khác, nhưng cứ tiếp tục đi sâu xuống. Giá trị của gia sư cũng nằm ở việc dẫn dắt tốt kiểu tìm kiếm theo chiều sâu này. Trong một lĩnh vực mới, thường thì thời gian lấp đầy kiến thức nền còn lâu hơn đọc phần nội dung chính, và lần sau gặp chủ đề tương tự có thể sẽ nhanh hơn
Thật lạ là một khái niệm cơ bản như vậy lại không được nội tại hóa qua cả bậc đại học và cao học
Vì vậy người dạy quên mất những thứ họ xem là hiển nhiên mình đã biết. Tôi cũng cảm thấy vấn đề tương tự trong các video của 3blue1brown. Video thì đẹp, nhưng không tạo ra sự hiểu; những người đã biết sẽ gật gù khi thấy các khái niệm quen thuộc được trình bày gọn gàng, còn với người như tôi thì có vẻ có quá nhiều điều kiện tiên quyết
Để hiểu bộ lọc Kalman, trước hết cần biết nền tảng xác suất và tầm quan trọng của phân phối Gaussian. Phần suy luận toán học giả định rằng mọi phân phối xác suất liên quan đều là phân phối Gaussian, và phân phối Gaussian được xác định duy nhất nếu biết moment bậc 1 và bậc 2. Rốt cuộc không thể tránh việc đưa vào khái niệm moment, rồi sau đó là phần toán khá gai góc. Bộ lọc Kalman không phải là chủ đề dễ; Rudolf Kalman từng nói trong một cuộc phỏng vấn rằng nếu không có bộ lọc của ông thì cuộc đổ bộ lên Mặt Trăng của Mỹ đã không thể thực hiện được
Có thể bắt đầu từ trường hợp đơn biến đơn giản rồi chỉnh sửa và khái quát hóa, nên tôi luôn nghĩ đây là một cách hay để dạy bộ lọc Kalman
Vài năm trước tôi đã nghe một chuỗi bài giảng ngắn của Kalman, và ông nhấn mạnh rất mạnh mẽ đức tính làm việc trực tiếp với dữ liệu quan sát
Ông cho rằng nếu trước hết giả định một mô hình rồi cố khớp nó với dữ liệu thì sẽ sinh ra thiên lệch, và ông lấy Principia của Newton làm một ví dụ tốt cho nguyên tắc này. Theo cách giải thích đó, Newton không đi tìm một mô hình để giải thích các định luật Kepler, mà chủ yếu dùng lập luận hình học để suy ra định luật hấp dẫn nghịch đảo bình phương từ các định luật Kepler. Ông là một diễn giả xuất sắc, có quan điểm mạnh mẽ, và tất nhiên cũng giải thích ý tưởng của bộ lọc Kalman, nhưng vì tôi không có việc gì trực tiếp dùng đến trong công việc nên các chi tiết đã bị quên từ lâu
Trên thực tế, tôi từng làm việc với các nhà khoa học và kỹ sư đã triển khai những hệ thống rất phức tạp và nổi tiếng; những người như vậy thường hoài nghi các thuật toán thịnh hành và thường bắt đầu từ nguyên lý thứ nhất. Trong 90% trường hợp, một bộ lọc Kalman tuyến tính bình thường, đơn giản, hoặc thậm chí không có mô hình chuyển động, là đã đủ
Gần đây một người bạn nhờ tôi triển khai bộ lọc Kalman cho một side project, nên tôi đã đọc nhiều tài liệu và cả trang web này, nhưng vẫn chưa biết phải triển khai thế nào
Tất cả trông như kiểu “vẽ phần còn lại của con cú”. Sẽ rất tốt nếu có tài liệu giải thích như một lập trình viên, chẳng hạn dùng vòng lặp trên mảng thay vì ký hiệu sigma. Theo những gì tôi hiểu, bộ lọc Kalman trông giống như một dạng trung bình trượt của vị trí, vận tốc, và có lẽ cả gia tốc; có vẻ nó dùng ba giá trị này để ước lượng “giá trị thực” thay vì giá trị mà cảm biến báo về
Tuy nhiên trước tiên cần viết ra phần toán mô tả động lực học. Bộ lọc Kalman gần như là việc áp dụng định lý Bayes cho một hệ động lực cụ thể, lặp đi lặp lại cách cập nhật ước lượng trạng thái hiện tại khi nhận được phép đo, và cách động lực học của hệ ảnh hưởng đến độ bất định sau phép đo đó cho đến trước phép đo tiếp theo. Trước hết cần có mô hình động lực học cho biết đối tượng theo dõi thay đổi theo thời gian như thế nào. Nếu không có nó thì việc triển khai chắc chắn sẽ rối. Đọc trước về bộ lọc Bayes hoặc bộ lọc hạt có thể giúp nắm khái niệm mà không cần ma trận. Tôi luôn thấy khó chịu với câu nói rằng có thể trở thành lập trình viên mà không biết toán; điều đó có thể đúng khi làm trang web, nhưng càng biết nhiều toán thì phạm vi các vấn đề bạn có thể mô hình hóa và giải quyết càng rộng hơn nhiều
Điều quan trọng là dựa trên trạng thái đó để ước lượng, rồi sau khi nhận phép đo thì dùng cả hai nguồn thông tin để điều chỉnh lặp đi lặp lại trạng thái tiếp theo. Khi hiểu công thức thì việc code khá dễ. Tài liệu này có thể hữu ích: http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies
Có thể thêm điều khiển bên ngoài và nhiễu quá trình, còn trạng thái nội bộ được biểu diễn bằng một vector các giá trị. Cũng cần một mô hình tuyến tính về cách trạng thái nội bộ được chuyển thành quan sát, cùng với nhiễu quan sát.
x là trạng thái mô hình, F là mô hình chuyển trạng thái tuyến tính
x(t+1) = F x(t), Q là ma trận hiệp phương sai của nhiễu quá trình nên thực tế làx(t+1) = F x(t) + N(0,Q), H là mô hình quan sát tuyến tính, R là ma trận hiệp phương sai của nhiễu quan sát, u và B là vector điều khiển bên ngoài tùy chọn và cách nó tác động.N(0,Q)là phân phối chuẩn có trung bình 0 và hiệp phương sai Q.Ví dụ với một vật thể đang chuyển động, trạng thái mô hình có thể là vị trí x và vận tốc v. Với radar chẳng hạn, thường chỉ quan sát được vị trí chứ không quan sát được vận tốc hiện tại, nên mô hình quan sát sẽ có dạng chỉ lấy ra vị trí. Trước khi làm bộ lọc Kalman, phải có “con cú” như vậy trước, và tùy quá trình là gì mà bạn phải tự quyết định. Bộ lọc Kalman cho biết cách ước lượng tối ưu vector trạng thái thực tại mỗi thời điểm khi cả mô hình chuyển trạng thái lẫn quan sát đều có nhiễu. Nhiều tutorial trộn lẫn phần mô hình quá trình được chọn với phần bộ lọc Kalman nên dễ gây nhầm lẫn; trong các ví dụ quá nhỏ như mô hình hằng số một chiều, mô hình động lực học biến mất trong công thức nên lại càng làm rối hơn
Vài chương đầu trình bày rất tốt về bộ lọc Kalman và bộ lọc thông tin
Khi biết phép đo của cảm biến có nhiễu, ta lấy trung bình nhiều mẫu để có ước lượng gần giá trị thực hơn; nếu biết mức nhiễu của cảm biến thì cũng có cảm giác nên lấy trung bình bao nhiêu mẫu. Ở đây có thể xem mọi giá trị cảm nhận hoặc suy luận đều được ước lượng bằng phân phối Gaussian được tham số hóa bởi trung bình và phương sai.
Trong một hệ vật lý có gia tốc, vận tốc và vị trí, nếu tại thời điểm t có vị trí p và vận tốc v thì vị trí tại t+dt xấp xỉ là
p+(v*dt). Cũng có thể cập nhật vận tốc bằng ước lượng gia tốc, và nếu đó là hệ đang được điều khiển thì cũng có thể cập nhật mô hình gia tốc bằng lực đã ra lệnh. Nhưng vì ước lượng ban đầu có độ bất định, nếu cứ đẩy mô hình quá trình này tiến về phía trước thì độ bất định sẽ ngày càng lớn và cuối cùng trở nên vô dụng.Bộ lọc Kalman là kỹ thuật kết hợp thông tin cảm biến với mô hình quá trình để ước lượng đại lượng quan tâm tốt hơn so với chỉ dùng một trong hai. Ở mỗi bước thời gian, nó dự đoán trạng thái bằng mô hình quá trình dựa trên ước lượng trạng thái trước đó, rồi cập nhật trung bình và độ bất định bằng phép đo cảm biến hiện tại. Trong bộ lọc Kalman cơ bản, giả định mô hình quá trình là tuyến tính và mọi ước lượng đều là phân phối Gaussian đơn giản, sau đó quyết định tin mô hình hay cảm biến ở mức nào bằng một hệ số nhân gọi là độ lợi Kalman
Một playlist video hướng dẫn từng bước khác về bộ lọc Kalman: https://www.youtube.com/watch?v=CaCcOwJPytQ&list=PLX2gX-ftPV...
Khi đã nắm được trực giác, bộ lọc Kalman thực sự rất thú vị; bộ lọc hạt cũng thú vị để tìm hiểu và trực quan hóa
Tôi có cuốn sách này và đã dùng nó khá thành công cho các bài toán thực tế
Dù đọc lại nhiều lần vẫn có vài chỗ hơi khó theo, nhưng nhìn chung khá tốt
Một bài viết hay khác liên quan: Is the Kalman filter a low-pass filter? Sometimes!
https://jbconsulting.substack.com/p/is-the-kalman-filter-jus...
Tôi từng dùng nó để giảm rung trong chuyển động camera ảo ở video cắt khung quanh khuôn mặt theo thời gian thực. Cách làm là gửi luồng vị trí khuôn mặt phát hiện được cho worker chạy bộ lọc Kalman, rồi nhận lại luồng vị trí camera ổn định
Khi tài nguyên tính toán bị hạn chế, bộ lọc Kalman rất tuyệt, nhưng cá nhân tôi thích các mô hình mới hơn và cao cấp hơn như particle filter hơn
Ưu điểm của particle filter là có thể xử lý các tình huống phức tạp có vật lý phi tuyến và phân phối phi Gaussian. Ví dụ, GPS trên xe có thể dùng bản đồ đường dựa trên lịch sử rẽ gần đây để loại bỏ những vị trí bất khả thi. Bộ lọc Gaussian không làm được việc này và chỉ tạo ra một khối mờ phủ lên vài khu phố
Ngoài ra tôi cũng tò mò liệu có mô hình nào mới hơn hoặc cao cấp hơn đáng khuyên dùng ngoài particle filter cho xử lý offline hay không
Năm 2007 tôi từng làm ở một công ty công nghệ quảng cáo, CEO và nhóm nghiên cứu bị ám ảnh với bộ lọc Kalman để tối ưu các chiến dịch quảng cáo trên mạng Google và MSN
Theo tôi nhớ thì nó có hiệu quả ở một mức nào đó, nhưng giờ tôi không tìm được đơn đăng ký bằng sáng chế nào, và Zeta cùng Walmart đã mua lại công nghệ đó
Các bài giải thích về bộ lọc Kalman hầu như luôn bắt đầu kiểu như “hãy nghĩ đến bộ điều nhiệt như một ví dụ trực quan. Hiểu rồi chứ? Tốt! Giờ để làm cho nó trực quan hơn nữa, hãy xem đại số tuyến tính nâng cao”
Tôi tự hỏi liệu bạn đã từng thấy một bài giải thích về bộ lọc Kalman nào không nhảy thẳng vào toán học chưa
Nếu bạn nhắm mắt đi về phía một bức tường, theo thời gian bạn sẽ ngày càng kém chắc chắn về vị trí của mình; đến khoảnh khắc ngón tay chạm vào tường, độ chắc chắn về vị trí sẽ tăng vọt. Phần đầu là bước dự đoán, phần sau là cập nhật đo lường. Đại số tuyến tính chỉ là cách tính các trọng số đó trong một hệ động lực tuyến tính có nhiễu Gaussian
Bộ lọc Kalman dựa trên các giả định thống kê như phân phối chuẩn, nên tối thiểu bạn cần biết thống kê và ma trận trung bình·hiệp phương sai. Nếu ở mức đó thì có lẽ bạn có thể theo được đến trước phần 4 của https://sites.ualberta.ca/~dwiens/stat679/meinhold&singpurwa.... Từ phần 4 trở đi là phần đẩy mạnh các phép tính toán học cần cho triển khai thực tế, nên không đem lại thêm nhiều hiểu biết đáng kể
Cách tiếp cận xử lý mọi thứ trước ở một chiều rồi mở rộng sang bài toán nhiều chiều chắc chắn giúp nắm được khái niệm. Playlist bài giảng có vẻ ở đây: https://youtube.com/playlist?list=PLAwxTw4SYaPkCSYXw6-a_aAoX...
Phần về bộ lọc Kalman bắt đầu từ video “Tracking Intro - Artificial Intelligence for Robotics”. Có vẻ khóa học miễn phí cũng ở đây nhưng cần đăng nhập để truy cập: https://www.udacity.com/course/intro-to-artificial-intellige...
Vì không rành Kalman, tôi đã đọc các bài nhập môn trên website này nhưng vẫn không thấy thấm lắm
Khi nghĩ về các biểu đồ mẫu, nó trông giống trung bình động hàm mũ hơn nhiều, vốn dễ hiểu hơn nhiều. Tìm so sánh trên Google thì trên Stats Stack Exchange có nói rằng với “random walk + nhiễu”, EMA tốt ngang Kalman, còn bài báo năm 2003 của Joseph J. LaViola ở Brown University cho thấy thuật toán làm mượt hàm mũ kép có chất lượng tương đương Kalman và Kalman mở rộng, nhưng nhanh hơn 135 lần và đơn giản hơn.
Vì làm mượt hàm mũ kép dễ hiểu hơn Kalman rất nhiều, nên nếu giả định bài của LaViola là đúng, tôi không định bỏ thêm công sức để hiểu Kalman nữa