Ebook Robotics · RL–UAV
Lecture 13 — Kalman Filter & Particle Filter
Chương C** · hai cách xấp xỉ Bayes: chuông Gauss vs đám hạt
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương C** · hai cách xấp xỉ Bayes: chuông Gauss vs đám hạt
Chương C · hai cách xấp xỉ Bayes: chuông Gauss vs đám hạt
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | Bayes liên tục không tính trực tiếp được — cần xấp xỉ thực dụng realtime cho UAV. |
| 2 | So với cái khác? | KF: 1 Gauss, nhanh, tuyến tính. PF: đa đỉnh/phi tuyến, đắt hơn. EKF/UKF: KF cho phi tuyến vừa. |
| 3 | Giải quyết gì & thế nào? | KF: predict mean/cov + update bằng \(K\). PF: sample–weight–resample. |
| 4 | Kết quả ra sao? | \(\hat{x},P\) hoặc đám hạt → obs cho control/RL; firmware EKF chuẩn. |
| 5 | Nên dùng KF/EKF khi nào? | Tracking gần tuyến tính, nhiễu gần Gauss (IMU+GPS/baro…). |
| 6 | Không nên / dùng PF khi nào? | Global localization đa đỉnh, phi tuyến mạnh — KF dễ bám nhầm một mode. |
🖼️ Hình nhanh: KF vs PF cạnh nhau
```
KF (1 Gauss): ─────╱╲───── mean + elip P
★PF (hạt): · · ● · · ● · · ● = trọng số cao
(resample giữ ●, bỏ · nhẹ)
```
Hình gốc hoặc minh họa cho ebook — không cắt từ slide Princeton. Dùng Present: bật Slide · F toàn màn.
🇻🇳 Chuyện thật (sân B): Hai dãy cao ốc đối xứng — laser/ảnh “giống nhau hai phía” như hành lang khách sạn.
KF/EKF chỉ giữ một chuông Gauss: tuyệt khi đang tracking gần đúng chỗ; dễ bám nhầm một mode và bay tự tin sang tường.
PF thả đám hạt; khi GPS mất lock kiểu kidnapped, vài giả thuyết còn sống để đo mới cứu.
Chốt: KF/EKF = một mode, nhanh khi gần tuyến tính; PF khi belief đa đỉnh / global / kidnap.../00C.
Firmware PX4 / Crazyflie: EKF/UKF là xương sống. Global loc / kidnapped (Lec 14) thường cần PF/MCL.
Hình “cùng một đo, hai cách giữ tin”:
đo z nhiễu: × × × ×
KF hợp nhất: ───╱╲─── (một ước lượng)
PF giữ nhiều: ● ● ● · (nhiều giả thuyết)
\[
x_t = A x_{t-1} + B u_t + w_t,\qquad
z_t = C x_t + v_t
\]
\(w\sim\mathcal{N}(0,Q),\ v\sim\mathcal{N}(0,R)\).
Predict:
\[
\hat{x}^- = A\hat{x}+Bu,\qquad
P^- = APA^\top + Q
\]
Update:
\[
K = P^-C^\top(CP^-C^\top+R)^{-1}
\]
\[
\hat{x}=\hat{x}^-+K(z-C\hat{x}^-),\qquad
P=(I-KC)P^-
\]
| \(K\) lớn khi… | \(K\) nhỏ khi… |
|---|---|
| Tin đo nhiều / \(R\) nhỏ | Tin model nhiều / \(R\) lớn |
| \(P^-\) lớn (đang không chắc) | Đã chắc, đo xấu |
predict: P ──(+Q)──► P⁻ phình nhẹ
update: P⁻ ─(K)─► P co (nếu z hữu ích)
| Biến thể | Ý tưởng | UAV |
|---|---|---|
| EKF | Tuyến tính hóa \(f,h\) quanh ước lượng | Phổ biến firmware |
| UKF | Sigma point lan truyền moment | Ổn hơn khi phi tuyến vừa, không cần Jacobian tường minh |
1. SAMPLE x^{[i]} ~ p(x_t | x_{t-1}^{[i]}, u_t) # motion
2. WEIGHT w^{[i]} ∝ p(z_t | x^{[i]}) # sensor
3. RESAMPLE sao chép hạt theo w (tránh degeneracy)
Nhược: số hạt tăng theo chiều state; degeneracy nếu không resample / thiếu hạt.
| Tình huống | Chọn | Lý do |
|---|---|---|
| Tracking pose gần đúng, IMU+GPS | EKF/UKF | 1 mode, realtime |
| Global loc, hành lang đối xứng | PF / MCL | Đa đỉnh |
| Outlier GPS đô thị | EKF + gating / \(R\) lớn | Tránh \(K\) kéo mạnh sai |
"""
KF 1D: vị trí tăng ~1 mỗi bước, đo nhiễu mạnh.
Xem hat mượt hơn z; P giảm khi hội tụ.
"""
import numpy as np
A, C = 1.0, 1.0
Q, R = 0.5, 4.0 # đo xấu hơn quá trình (R > Q)
x_true = 0.0
x_hat, P = 0.0, 10.0 # ban đầu rất không chắc
rng = np.random.default_rng(0)
print("t true z hat P K")
for t in range(8):
x_true = x_true + 1.0 + 0.1 * rng.normal()
z = x_true + 2.0 * rng.normal()
# PREDICT
x_hat = A * x_hat
P = A * P * A + Q
# UPDATE
S = C * P * C + R
K = (P * C) / S
x_hat = x_hat + K * (z - C * x_hat)
P = (1 - K * C) * P
print(f"{t} {x_true:6.2f} {z:6.2f} {x_hat:6.2f} {P:5.2f} {K:4.2f}")
# Mini PF: trọng số 5 hạt quanh đo z=3.0
particles = np.array([1.0, 2.5, 3.0, 3.2, 6.0])
z_pf, sigma = 3.0, 0.8
w = np.exp(-0.5 * ((particles - z_pf) / sigma) ** 2)
w /= w.sum()
print("PF weights", np.round(w, 3), "→ hạt gần z nặng; resample nhân bản chúng")
🧪 Kỳ vọng demo: cột
hatbámtruetốt hơnzthô;Pthường giảm từ ~10 xuống vài đơn vị;Kphản ánh mức tin đo. Dòng PF: trọng số cao quanh 3.0 / 3.2, thấp ở 1.0 và 6.0.
| ✅ KF/EKF | ❌ KF yếu | ✅ PF | ❌ PF yếu |
|---|---|---|---|
| Nhanh, firmware chuẩn | Đa đỉnh / kidnap | Đa giả thuyết | Chiều cao → cần rất nhiều hạt |
| \(K\) diễn giải được | Tuyến tính hóa xấu | MCL (Lec 14) | Degeneracy, chi phí CPU |
| Tracking tốt | Global loc | Phi tuyến mạnh | Khó realtime 12D thuần |
| ✅ Nên | ❌ Không | ≈ Gần đúng |
|---|---|---|
| Chỉnh \(Q,R\) theo đơn vị vật lý | \(Q,R\) tùy hứng | Heuristic rồi calibrate log |
| EKF tracking + PF khi đa đỉnh | KF cho mọi bài loc | UKF thay EKF |
Nghĩa với năng lượng / gió / GPS: chỉnh \(Q,R\) theo điều kiện = chỉnh “tin ai”; đừng chỉnh tùy hứng không đơn vị.
⚠️ Lỗi hay gặp: Dùng KF cho global localization đa đỉnh → bám nhầm một đỉnh.
⚠️ \(Q,R\) chỉnh tùy hứng không gắn đơn vị vật lý → \(K\) vô nghĩa.
⚠️ Quên EKF chỉ tốt cục bộ khi tuyến tính hóa còn hợp lý.
⚠️ PF không resample → một hạt chiếm gần hết trọng số (degeneracy).
⚡ Nhớ một câu: KF = một chuông Gauss cập nhật bằng \(K\); PF = đám hạt sống chết theo likelihood — cùng xấp xỉ Bayes, khác hình dạng belief.
🔗 Sang bài sau mang theo: Đặt PF/EKF lên map cố định → localization: tracking vs global vs kidnapped.
★ Hình nhớ mãi:
KF ────╱╲──── PF ··●··●··
tin K resample