Atlas Robotics
LocalizationCơ bản

Odometry trong bài toán Localization: dead reckoning là gì

Atlasbot · 17/8/2026 · 11 phút đọc

Odometry trong bài toán Localization: dead reckoning là gì
Dead reckoning: vị trí ước lượng từ chuyển động, không tham chiếu landmark

Bài Differential Drive và Odometry đã trình bày chi tiết công thức tính odometry từ tốc độ bánh xe. Đây là chuyên mục Localization — nơi câu hỏi trọng tâm không phải "công thức tính thế nào" mà là "robot dùng gì để biết mình đang ở đâu, và tại sao chỉ một nguồn thông tin thường không đủ".

Khái niệm chính

Dead reckoning là thuật ngữ hàng hải cổ — ước lượng vị trí hiện tại dựa trên vị trí đã biết trước đó, cộng với hướng đi và quãng đường đã di chuyển, không cần quan sát bất kỳ điểm mốc (landmark) cố định nào bên ngoài. Odometry (dùng encoder bánh xe) là một dạng dead reckoning điển hình trong robot di động.

vị_trí_mới = vị_trí_cũ + (khoảng cách đã di chuyển, theo hướng đã đi)

Dead reckoning nói chung, và odometry nói riêng, có ưu điểm lớn: hoạt động độc lập hoàn toàn, không cần bản đồ có sẵn, không cần landmark, không cần tín hiệu bên ngoài — chỉ cần cảm biến gắn ngay trên robot. Đây là lý do odometry luôn là nguồn dữ liệu vị trí "sẵn có ngay từ giây đầu tiên", trước cả khi SLAM/AMCL kịp hội tụ.

Nguyên lý hoạt động

Vì mỗi bước ước lượng đều dựa trên bước trước đó (tích luỹ), sai số nhỏ ở mỗi bước cộng dồn không giới hạn theo thời gian — không có cơ chế nội tại nào tự triệt tiêu sai số này. Đặc điểm này không riêng gì odometry bánh xe — mọi hệ dead reckoning (kể cả dùng IMU thuần) đều mắc chung vấn đề.

Tóm lại: Dead reckoning trả lời tốt câu hỏi "tôi vừa di chuyển bao xa" trong thời gian ngắn, nhưng không bao giờ có thể tự sửa sai lệch tích luỹ — vì nó không có cách nào đối chiếu với một điểm tham chiếu tuyệt đối bên ngoài.

Odometry/IMU (dead reckoning) → mượt, tần số cao, trôi dần theo thời gian
      +
AMCL/SLAM (đối chiếu bản đồ)  → chính xác dài hạn, cập nhật thưa hơn
      =
Ước lượng vị trí đáng tin cậy cho cả ngắn hạn lẫn dài hạn

Đây chính là vai trò của hệ toạ độ map và odom tách riêng — odom là kết quả thuần dead reckoning (trôi dần), map là kết quả sau khi neo lại bằng AMCL.

Kiến thức kỹ thuật

Công thức

Chất lượng odometry thường đo bằng tỷ lệ trôi (drift rate) — sai số tích luỹ tính theo phần trăm quãng đường đã đi, không phải giá trị tuyệt đối cố định:

Sai_so_uoc_luong = Ty_le_troi (%) × Quang_duong_da_di

VD: odometry có tỷ lệ trôi 2%, robot đã di chuyển 50m
Sai số ước lượng ≈ 2% × 50m = 1m

→ sau 50m di chuyển liên tục không hiệu chỉnh, vị trí ước lượng có thể lệch tới 1m
so với vị trí thật — đủ để gây va chạm nếu không hiệu chỉnh định kỳ bằng AMCL/SLAM

Thông số

Tỷ lệ trôi thực tế khác nhau tuỳ nguồn dead reckoning — đây là lý do các nguồn này thường được kết hợp (sensor fusion, bài tiếp theo) thay vì chỉ dùng riêng lẻ:

Nguồn dead reckoningTỷ lệ trôi điển hình
Odometry bánh xe thuần (encoder)~1-5% quãng đường đã đi
Odometry + IMU kết hợp (sensor fusion cơ bản)~0.5-2% quãng đường đã đi

Ứng dụng thực tế

Một tình huống vận hành thực tế: robot đi qua một hành lang dài, trống trải, ít đặc điểm phân biệt (tường phẳng đồng đều) — LiDAR scan matching của AMCL có thể tạm thời "mất tự tin" (không đủ đặc điểm để đối chiếu chính xác với bản đồ), khiến robot gần như chỉ dựa vào dead reckoning thuần trong suốt đoạn hành lang đó. Tỷ lệ trôi và độ dài đoạn hành lang quyết định trực tiếp robot sẽ lệch bao xa trước khi ra khỏi hành lang và AMCL có đủ đặc điểm để "khoá" lại vị trí chính xác — đây là lý do khi thiết kế môi trường vận hành AMR, nên tránh các hành lang quá dài, quá đồng đều nếu có thể, hoặc bổ sung landmark nhân tạo (QR code, marker) để hỗ trợ định vị ở những đoạn "nghèo đặc điểm" này.

Ví dụ thực tế

ty_le_troi = 0.02  # 2%
quang_duong = [0, 10, 20, 30, 40, 50]

for d in quang_duong:
    sai_so = ty_le_troi * d
    print(f"Quang duong {d}m -> sai so uoc luong ~{sai_so:.2f}m")
Output:
Quang duong 0m -> sai so uoc luong ~0.00m
Quang duong 10m -> sai so uoc luong ~0.20m
Quang duong 20m -> sai so uoc luong ~0.40m
Quang duong 30m -> sai so uoc luong ~0.60m
Quang duong 40m -> sai so uoc luong ~0.80m
Quang duong 50m -> sai so uoc luong ~1.00m

Sai số tăng tuyến tính theo quãng đường — không có điểm nào tự "chững lại" hay giảm xuống, đúng bản chất "cộng dồn không giới hạn" đã nói ở phần Nguyên lý hoạt động, xác nhận vì sao cần một nguồn hiệu chỉnh tuyệt đối định kỳ.

Lỗi thường gặp

  • Coi tỷ lệ trôi là hằng số cố định trong mọi điều kiện — trượt bánh trên sàn trơn, tải trọng thay đổi, hay tốc độ di chuyển khác nhau đều làm tỷ lệ trôi thực tế dao động — con số "2%" chỉ là ước lượng tham khảo, không phải cam kết chính xác tuyệt đối.
  • Không giới hạn thời gian/quãng đường vận hành thuần dead reckoning — để robot di chuyển quá xa mà không có cơ hội hiệu chỉnh bằng AMCL/SLAM (VD: môi trường thiếu đặc điểm kéo dài) khiến sai số vượt ngưỡng an toàn mà không có cảnh báo nào.
  • Cho rằng dead reckoning "vô dụng" vì sẽ trôi — kết luận sai lầm phổ biến; dead reckoning cực kỳ hữu ích cho khoảng thời gian/quãng đường ngắn (đúng vai trò odom trong kiến trúc 2 tầng đã học) — vấn đề chỉ là không dùng riêng lẻ cho định vị dài hạn.
  • Giả định IMU luôn chính xác hơn odometry bánh xe cho vị trí — thực tế IMU thường trôi vị trí nhanh hơn odometry bánh xe (dù tốt hơn cho hướng ngắn hạn) do phải tích phân 2 lần từ gia tốc — bài tiếp theo về IMU sẽ giải thích rõ vì sao.

Kết luận

Odometry là một dạng dead reckoning — ước lượng vị trí thuần từ chuyển động bản thân, mạnh về tính độc lập và tần số cao, nhưng luôn trôi dần theo thời gian mà không có cách nào tự sửa. Hiểu rõ tỷ lệ trôi giúp thiết kế đúng chu kỳ hiệu chỉnh cần thiết bằng nguồn tuyệt đối bên ngoài. Bài tiếp theo trong chuyên mục nói về IMU — nguồn dead reckoning thứ hai, thường kết hợp cùng odometry bánh xe để cải thiện độ tin cậy.

Odometry trong bài toán Localization: dead reckoning là gì — Atlasbot