AMCL là gì? Định vị trên bản đồ có sẵn bằng particle filter
Atlasbot · 17/8/2026 · 11 phút đọc
Bài EKF theo dõi độ không chắc chắn bằng một elip Gaussian — giả định vị trí thật luôn nằm quanh một đỉnh duy nhất. AMCL (Adaptive Monte Carlo Localization) — thuật toán định vị chuẩn của Nav2 — giải cùng bài toán localization nhưng bằng một cách tiếp cận khác hẳn: particle filter, không giả định trước hình dạng phân phối vị trí.
Khái niệm chính
Thay vì một elip duy nhất, AMCL duy trì một tập hợp lớn các particle (hạt) — mỗi hạt là một giả thuyết độc lập về vị trí (x, y, θ) của robot. Vòng lặp gồm 3 bước, lặp lại liên tục:
1. PREDICT — di chuyển từng hạt theo dữ liệu odometry vừa nhận
(giống bước Predict của EKF, nhưng áp dụng cho từng hạt riêng)
2. UPDATE — so khớp scan LiDAR dự đoán tại vị trí mỗi hạt với scan LiDAR thực đo được
→ hạt nào dự đoán càng khớp thực tế thì trọng số càng cao
3. RESAMPLE — loại dần các hạt trọng số thấp, nhân bản các hạt trọng số cao
quanh vùng có khả năng đúng nhất
Tóm lại: EKF trả lời "vị trí trung bình là gì, độ lệch bao nhiêu" bằng công thức đóng. AMCL trả lời cùng câu hỏi bằng cách thử hàng nghìn khả năng cùng lúc rồi chọn lọc dần — đắt hơn về tính toán, nhưng không bị ràng buộc bởi giả định phân phối Gaussian, xử lý tốt cả trường hợp vị trí ban đầu hoàn toàn không rõ (multi-modal).
Nguyên lý hoạt động
AMCL không giữ cố định số lượng hạt trong suốt quá trình — dùng kỹ thuật KLD-sampling: nhiều hạt khi độ bất định còn cao, giảm dần số hạt khi đã hội tụ. Đây là lý do AMCL tiêu tốn tài nguyên tính toán biến thiên theo thời gian, không cố định.
Đầu vào bắt buộc:
- Bản đồ tĩnh đã có sẵn (từ SLAM — package map_server)
- Dữ liệu odometry liên tục (bước Predict)
- Dữ liệu LiDAR liên tục (bước Update)
Đầu ra:
- Transform map → odom — chính là phần "neo" tuyệt đối bù cho sai số trôi của odometry
Khác với SLAM (vừa xây bản đồ vừa định vị), AMCL giả định bản đồ đã cố định — quy trình chuẩn của một robot AMR là chạy SLAM một lần để xây bản đồ, lưu lại, sau đó chuyển sang chạy AMCL cho các phiên vận hành tiếp theo.
Kiến thức kỹ thuật
Công thức
Trọng số mỗi hạt phải được chuẩn hoá (normalize) để tổng bằng 1 trước khi resample — đảm bảo hạt có trọng số cao hơn được nhân bản đúng tỷ lệ tương đối:
w_i_chuan_hoa = w_i / Σ(w_j) với mọi j
VD: 3 hạt có trọng số thô 0.8, 0.5, 0.2 (dựa trên độ khớp scan LiDAR)
Tổng = 1.5
w1 = 0.8/1.5 ≈ 0.53, w2 = 0.5/1.5 ≈ 0.33, w3 = 0.2/1.5 ≈ 0.13
→ hạt 1 có ~53% cơ hội được nhân bản ở bước resample, hạt 3 chỉ ~13%
Thông số
Số lượng hạt cấu hình trong Nav2 (min_particles/max_particles) ảnh hưởng trực tiếp cân bằng giữa độ chính xác và tải tính toán:
| Tham số | Giá trị điển hình |
|---|---|
min_particles | ~100 – 500 (khi đã hội tụ tốt) |
max_particles | ~2000 – 5000 (lúc mới khởi động, chưa rõ vị trí) |
Ứng dụng thực tế
Particle filter giải quyết được bài toán kinh điển "robot bị bắt cóc" (kidnapped robot problem) — tình huống robot bị di chuyển đột ngột tới vị trí khác mà không qua bất kỳ dữ liệu odometry nào ghi nhận (VD: bị nhấc lên và đặt lại chỗ khác, hoặc trượt bánh nghiêm trọng mất hoàn toàn dấu vết). AMCL có thể phục hồi bằng cách định kỳ "tiêm" thêm một số hạt ngẫu nhiên phân bố khắp bản đồ (random particle injection) — nếu vị trí ước lượng cũ không còn khớp với dữ liệu LiDAR mới, các hạt ngẫu nhiên mới có cơ hội "bắt được" vị trí thật và dần chiếm ưu thế qua các vòng resample tiếp theo. Đây chính xác là điều EKF không thể làm được do giả định 1 đỉnh Gaussian duy nhất (đã nêu ở bài trước) — một lý do quan trọng khiến AMCL vẫn là lựa chọn chuẩn cho định vị toàn cục dù tốn tài nguyên tính toán hơn EKF.
Ví dụ thực tế
import random
# Mo phong don gian 1D: vi tri that = 5.0
vi_tri_that = 5.0
particles = [random.uniform(0, 10) for _ in range(5)] # rai ngau nhien 5 hat
def trong_so(p, target, sigma=1.0):
return pow(2.718, -((p - target)**2) / (2 * sigma**2))
weights = [trong_so(p, vi_tri_that) for p in particles]
tong = sum(weights)
weights_chuan_hoa = [w/tong for w in weights]
for p, w in zip(particles, weights_chuan_hoa):
print(f"Hat tai {p:.2f}: trong so chuan hoa = {w:.3f}")
Output (vi du, ngau nhien moi lan chay khac nhau):
Hat tai 4.82: trong so chuan hoa = 0.312
Hat tai 1.15: trong so chuan hoa = 0.002
Hat tai 5.34: trong so chuan hoa = 0.287
Hat tai 8.90: trong so chuan hoa = 0.001
Hat tai 5.71: trong so chuan hoa = 0.398
Các hạt gần vị trí thật (5.0) nhận trọng số cao hơn hẳn hạt ở xa — ở bước resample tiếp theo, các hạt trọng số cao (4.82, 5.34, 5.71) sẽ được nhân bản nhiều lần, các hạt trọng số gần 0 (1.15, 8.90) gần như biến mất — quần thể hạt dần "co cụm" quanh vị trí thật đúng như mô tả ở phần Khái niệm chính.
Lỗi thường gặp
- Quá ít hạt gây "particle deprivation" — không đủ đa dạng giả thuyết để đại diện đúng tình huống đa đỉnh (multi-modal), đặc biệt nguy hiểm ngay sau khi robot bị "bắt cóc" — cần đủ
max_particlesđể có cơ hội phục hồi. - Quá nhiều hạt gây quá tải tính toán trên phần cứng nhúng — chạy AMCL với
max_particlesquá cao trên Raspberry Pi/Jetson yếu có thể khiến tần số cập nhật localization tụt xuống dưới ngưỡng an toàn cho vòng điều khiển phía trên. - Giả định bản đồ tĩnh không còn đúng thực tế — AMCL không xử lý tốt khi môi trường thực tế thay đổi đáng kể so với bản đồ đã lưu (kệ hàng bị di chuyển, khu vực mới xây thêm) — cần chạy lại SLAM để cập nhật bản đồ khi môi trường thay đổi lớn, không thể chỉ dựa vào AMCL tự thích nghi.
- Cho AMCL một ước lượng vị trí khởi tạo sai lệch quá xa — nếu vị trí khởi tạo (initial pose) đặt trên RViz2 sai quá xa vị trí thật, phần lớn hạt ban đầu tập trung sai vùng, hội tụ chậm hoặc thất bại hoàn toàn — luôn đặt vị trí khởi tạo gần đúng thực tế nhất có thể khi khởi động AMCL.
Kết luận
AMCL giải bài toán định vị toàn cục bằng particle filter — hàng nghìn giả thuyết cạnh tranh nhau qua vòng lặp predict-update-resample, không bị ràng buộc bởi giả định Gaussian đơn đỉnh như EKF, đánh đổi bằng chi phí tính toán cao hơn. Đây là bài cuối cùng của chuyên mục Localization, và cũng khép lại toàn bộ chuyên mục Robotics Fundamentals — từ Toán cho Robotics (vector, matrix, quaternion), Động học Robot (forward/inverse kinematics, differential drive, mecanum), Điều khiển Robot (PID, closed-loop, trajectory), tới Localization (odometry, IMU, sensor fusion, EKF, AMCL) vừa học — đủ nền tảng toán học và thuật toán cốt lõi để đọc hiểu và tuỳ biến bất kỳ hệ thống điều hướng robot thực tế nào, kể cả những package phức tạp như Nav2.