Atlas Robotics
Hardware AMRTrung bình

Encoder: cách robot đếm được bánh xe đã quay bao nhiêu

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

Encoder: cách robot đếm được bánh xe đã quay bao nhiêu
Quadrature encoder: hai kênh lệch pha 90° cho biết cả tốc độ lẫn chiều quay

Bài Odometry trong Localization giả định robot đã có sẵn dữ liệu "bánh xe vừa quay bao nhiêu vòng". Encoder là cảm biến tạo ra chính xác dữ liệu đó — gắn liền trục động cơ hoặc bánh xe, đếm số xung phát ra để suy ra góc quay.

Khái niệm chính

Hai kiểu encoder phân biệt theo cách chúng biết vị trí góc:

  • Incremental encoder — chỉ đếm xung tương đối, biết "vừa quay thêm bao nhiêu" kể từ lần đọc trước — không biết vị trí góc tuyệt đối lúc mới bật nguồn. Rẻ hơn, phổ biến hơn nhiều trong AMR vì bánh xe chỉ cần biết đã quay bao xa (đủ cho odometry), không cần biết góc tuyệt đối
  • Absolute encoder — mỗi vị trí góc có một mã nhị phân riêng biệt, đọc được ngay góc tuyệt đối kể cả vừa mới bật nguồn, không cần "quy về 0" trước. Đắt hơn, dùng chủ yếu ở khớp tay máy (nơi cần biết chính xác góc khớp ngay khi khởi động, không thể chờ hiệu chỉnh)

Tuyệt đại đa số encoder gắn ở bánh xe AMR là loại incremental — vì bài toán odometry chỉ cần "đã đi thêm bao xa", không cần "bánh đang ở góc tuyệt đối nào".

Nguyên lý hoạt động

Một đĩa quay gắn liền trục động cơ, có các rãnh hoặc vạch chia đều quanh chu vi. Một cảm biến cố định (quang học hoặc từ) phát hiện mỗi lần một rãnh/vạch đi qua, phát ra một xung điện. Đếm số xung trong một khoảng thời gian, biết trước số xung mỗi vòng quay (độ phân giải encoder), suy ra được tốc độ quay.

Một encoder chỉ có 1 kênh xung chỉ biết tốc độ quay, không biết chiều quay (không phân biệt được đang quay tiến hay lùi chỉ từ đếm số xung). Quadrature encoder giải quyết bằng cách dùng hai kênh A và B, đặt lệch pha nhau 90°:

Quay chiều thuận:  kênh A đổi mức TRƯỚC kênh B
Quay chiều nghịch: kênh B đổi mức TRƯỚC kênh A

So sánh thứ tự cạnh lên/xuống giữa hai kênh cho biết ngay chiều quay — đây là lý do gần như mọi encoder dùng trong odometry AMR đều là loại quadrature 2 kênh, không phải loại 1 kênh đơn giản.

Tóm lại: Độ phân giải encoder (số xung/vòng) quyết định độ mượt và độ chính xác của odometry — độ phân giải càng cao, ước lượng vị trí càng mượt ở tốc độ thấp. Nhưng độ phân giải cao không sửa được vấn đề cốt lõi đã nói ở bài Odometry: sai số vẫn tích luỹ theo thời gian dù encoder có chính xác tới đâu, vì bản chất odometry vẫn là dead reckoning.

Kiến thức kỹ thuật

Công thức

Tốc độ quay tính từ số xung đếm được trong một khoảng thời gian:

tốc_độ_quay (vòng/giây) = (số_xung_đếm_được / số_xung_mỗi_vòng) / thời_gian (giây)

VD: encoder 360 xung/vòng, đếm được 90 xung trong 0.1 giây
tốc_độ_quay = (90 / 360) / 0.1 = 2.5 vòng/giây = 150 vòng/phút

Thông số

Vị trí gắn encoder ảnh hưởng trực tiếp độ phân giải hiệu dụng và độ tin cậy dữ liệu:

Vị trí gắnƯu điểmNhược điểm
Trên trục động cơ (trước hộp số)Độ phân giải hiệu dụng cao hơn (nhân thêm tỉ số truyền)Không phát hiện được trượt giữa hộp số và bánh xe
Trên trục bánh xe (sau hộp số)Phản ánh đúng chuyển động thực tế của bánh xeĐộ phân giải hiệu dụng thấp hơn

Phần lớn robot DIY gắn encoder ngay trên trục động cơ vì đơn giản về cơ khí và tận dụng được độ phân giải cao hơn — miễn là hộp số đủ tin cậy, không trượt răng trong điều kiện vận hành bình thường.

Ứng dụng thực tế

Dữ liệu encoder từ cả 4 bánh (ở robot dùng cấu hình differential/mecanum drive) được đọc liên tục bởi MCU (đúng vị trí Driver Layer đã nêu ở bài Kiến trúc AMR), gộp lại thành ước lượng odometry, rồi publish lên ROS2 dưới dạng message nav_msgs/Odometry để AMCL/Nav2 sử dụng cho localization. Đây là lý do encoder — dù là linh kiện phần cứng nhỏ và rẻ nhất trong toàn bộ hệ thống — lại nằm ở điểm khởi đầu của toàn bộ chuỗi định vị và điều hướng của robot.

Ví dụ thực tế

Encoder gắn trên trục động cơ, độ phân giải gốc 11 xung/vòng,
qua hộp số tỉ số truyền 1:34, dùng loại quadrature (nhân 4 nhờ đọc cả 2 kênh)

Số xung/vòng hiệu dụng ở bánh xe = 11 × 34 × 4 = 1496 xung/vòng

Nếu MCU đếm được 374 xung trong 0.1 giây:
tốc_độ_quay = (374 / 1496) / 0.1 = 2.5 vòng/giây

Với bánh xe đường kính 6.5cm (chu vi ≈ 20.4cm):
vận tốc bánh xe = 2.5 × 0.204 ≈ 0.51 m/s

Ví dụ này cho thấy độ phân giải hiệu dụng thực tế (nhân cả tỉ số truyền hộp số lẫn hệ số quadrature) lớn hơn nhiều so với thông số gốc "11 xung/vòng" ghi trên datasheet động cơ — dễ gây nhầm lẫn nếu không tính đúng khi viết code đọc encoder.

Lỗi thường gặp

  • Dùng encoder 1 kênh cho odometry — không thể phân biệt chiều quay, khiến ước lượng quãng đường sai hoàn toàn khi robot lùi hoặc dao động qua lại.
  • Quên nhân tỉ số truyền hộp số và hệ số quadrature khi tính độ phân giải hiệu dụng — như ở ví dụ trên, dùng nhầm con số "11 xung/vòng" gốc thay vì 1496 xung/vòng hiệu dụng khiến toàn bộ ước lượng vận tốc/quãng đường sai lệch hàng chục lần.
  • Kỳ vọng encoder độ phân giải cao sửa được trôi tích luỹ của odometry — độ phân giải chỉ cải thiện độ mượt, không giải quyết được bản chất dead reckoning tích luỹ sai số theo thời gian (đã nêu ở bài Odometry).
  • Gắn encoder trước hộp số nhưng không kiểm tra độ trượt/rơ của hộp số — nếu hộp số trượt răng dưới tải nặng, encoder trước hộp số sẽ không phát hiện được, dẫn tới odometry sai mà không có dấu hiệu cảnh báo nào từ chính cảm biến.

Kết luận

Encoder — dù chỉ là một cảm biến đếm xung đơn giản — là nguồn dữ liệu gốc cho toàn bộ chuỗi odometry và localization phía sau. Chọn đúng loại (quadrature 2 kênh), tính đúng độ phân giải hiệu dụng, và hiểu rõ giới hạn (sai số tích luỹ theo thời gian) là nền tảng trước khi tin tưởng dữ liệu vị trí robot báo cáo. Bài tiếp theo trong chuyên mục đi vào LiDAR — cảm biến giúp robot "nhìn thấy" môi trường xung quanh, bù đắp cho những gì odometry một mình không thể làm được.

Encoder: cách robot đếm được bánh xe đã quay bao nhiêu — Atlasbot