Localization Layer trong AMR: EKF cục bộ và AMCL phối hợp ra sao
Atlasbot · 22/8/2026 · 11 phút đọc
Chuyên mục ROS2 Navigation đã có bài riêng giải chi tiết EKF và AMCL. Bài này không lặp lại toán học Kalman Filter hay Monte Carlo Localization — nó đứng đúng vị trí của Localization Layer trong mô hình 5 tầng: tầng này nhận dữ liệu từ ROS2 Layer, trả về ước lượng vị trí đáng tin cậy cho Navigation Layer sử dụng.
Khái niệm chính
Localization Layer trong một AMR thực tế gần như luôn gồm 2 tầng xử lý nối tiếp, không phải một thuật toán duy nhất:
- EKF cục bộ (package
robot_localization) — hợp nhất/odomvà/imuliên tục, tần số cao, publish/odometry/filtered— đã nhắc ở bài IMU trong AMR - AMCL — so khớp dữ liệu
/scanvới bản đồ tĩnh đã có sẵn, tần số thấp hơn, sửa lỗi trôi tích luỹ của tầng EKF cục bộ
Nguyên lý hoạt động
Hai tầng này giải quyết hai vấn đề khác nhau nhưng bổ sung nhau: EKF cục bộ chạy nhanh và mượt nhưng trôi dần theo thời gian (đúng bản chất dead reckoning đã học ở bài Odometry cho AMR) vì nó không có tham chiếu tuyệt đối nào bên ngoài; AMCL chạy chậm hơn nhưng có khả năng sửa trôi vì nó so khớp trực tiếp với bản đồ — tham chiếu tuyệt đối mà EKF cục bộ không có.
Kết quả của phối hợp này thể hiện qua cây TF (Transform Tree, đã học ở bài TF Tree): frame odom (đầu ra của EKF cục bộ, mượt nhưng trôi) và frame map (hệ toạ độ tuyệt đối của bản đồ) được nối với nhau qua một phép biến đổi (map → odom) mà AMCL liên tục cập nhật để bù đúng phần trôi đã tích luỹ. Robot luôn biết vị trí tức thời mượt mà (odom frame), đồng thời có một phép hiệu chỉnh định kỳ để không lệch quá xa vị trí thực tế trong bản đồ (map frame).
Tóm lại: Không nên coi AMCL là "thay thế" EKF cục bộ hay ngược lại — chúng vận hành ở hai tần số khác nhau, phục vụ hai mục đích bổ sung: một cho độ mượt tức thời, một cho độ chính xác dài hạn.
Kiến thức kỹ thuật
Công thức
Độ trễ hiệu dụng của việc "biết vị trí đúng trong bản đồ" phụ thuộc vào tần số cập nhật của AMCL, không phải tần số của EKF cục bộ:
Nếu AMCL cập nhật phép biến đổi map→odom mỗi 500ms (2Hz, điển hình),
và robot di chuyển 0.5 m/s, thì trong khoảng thời gian giữa 2 lần AMCL cập nhật:
Sai_số_trôi_tối_đa_tích_luỹ ≈ Vận_tốc × Khoảng_thời_gian_giữa_2_lần_AMCL
× Tỉ_lệ_trôi_odometry (thường 1-5% quãng đường)
VD: 0.5 m/s × 0.5s = 0.25m quãng đường đi được giữa 2 lần AMCL,
sai số trôi tích luỹ trong khoảng đó ước tính 1-5% × 0.25m ≈ 0.25-1.25cm
Thông số
| Tầng | Tần số điển hình | Vai trò |
|---|---|---|
EKF cục bộ (robot_localization) | 30-50Hz | Ước lượng vị trí mượt, tức thời, dùng cho vòng điều khiển |
| AMCL | 1-5Hz (mỗi khi có scan mới đáng kể) | Sửa trôi tích luỹ bằng cách so khớp bản đồ |
Ứng dụng thực tế
Trong triển khai thực tế, Navigation Layer (bài tiếp theo) chủ yếu dựa vào output tần số cao của EKF cục bộ (/odometry/filtered) cho các quyết định tức thời (né vật cản cục bộ), trong khi vị trí tuyệt đối trong bản đồ (kết quả AMCL) quan trọng hơn cho việc lập kế hoạch đường đi toàn cục (global planning). Đây là lý do kiến trúc 2 tầng này tồn tại — không phải sự phức tạp không cần thiết, mà là giải pháp cho việc một thuật toán khó có thể vừa nhanh vừa chính xác tuyệt đối cùng lúc.
Ví dụ thực tế
# Kiểm tra tần số thực tế của từng tầng localization trên robot đang chạy
ros2 topic hz /odometry/filtered # nên ~30-50Hz
ros2 topic hz /amcl_pose # nên ~1-5Hz
# Xem cây TF hiện tại để xác nhận map -> odom -> base_link đúng cấu trúc
ros2 run tf2_tools view_frames
Nếu /amcl_pose gần như không cập nhật (tần số ~0), khả năng cao AMCL chưa hội tụ đúng vị trí (robot "bị lạc" trong bản đồ) hoặc dữ liệu /scan không tới đúng — đây là bước debug đầu tiên trước khi nghi ngờ Navigation Layer phía trên đi sai đường.
Lỗi thường gặp
- Coi
/odometry/filteredlà vị trí tuyệt đối chính xác trong bản đồ — đây vẫn là ước lượng cục bộ có thể trôi, chỉ được AMCL hiệu chỉnh định kỳ, không phải nguồn chân lý tuyệt đối liên tục. - Không kiểm tra AMCL đã hội tụ trước khi bắt đầu điều hướng — nếu robot khởi động ở vị trí không khớp ước lượng ban đầu của AMCL, cần thời gian di chuyển để AMCL hội tụ đúng, bắt đầu điều hướng quá sớm dễ dẫn robot đi sai hướng.
- Nhầm lẫn frame
odomvàmapkhi debug — vị trí trong 2 frame này khác nhau đúng bằng phần trôi đã tích luỹ, so sánh nhầm frame khiến kết luận sai về việc robot có định vị đúng hay không. - Tần số AMCL quá thấp so với tốc độ di chuyển của robot — như tính ở mục Công thức, robot di chuyển nhanh mà AMCL cập nhật thưa khiến sai số trôi tích luỹ giữa 2 lần cập nhật lớn hơn mong muốn, cần cân đối lại thông số scan matching.
Kết luận
Localization Layer trong AMR thực tế không phải một thuật toán đơn lẻ mà là sự phối hợp giữa EKF cục bộ (nhanh, mượt, trôi dần) và AMCL (chậm hơn, sửa trôi bằng bản đồ) — thể hiện qua cây TF với 2 frame odom và map tách biệt. Bài tiếp theo trong chuyên mục đi vào Navigation Layer — nơi ước lượng vị trí này được dùng để tính đường đi và né vật cản thực tế.