Atlas Robotics
Động học RobotTrung bình

Động học robot di chuyển: Differential Drive và Odometry cơ bản

Atlasbot · 4/7/2026 · 11 phút đọc

Động học robot di chuyển: Differential Drive và Odometry cơ bản

Phần lớn robot AMR giá rẻ và dễ chế tạo nhất dùng cấu hình hai bánh vi sai (differential drive): hai bánh chủ động gắn động cơ riêng biệt ở hai bên, cộng thêm bánh đỡ (caster wheel) để giữ thăng bằng. Không có bánh lái riêng — mọi chuyển động, kể cả quay tại chỗ, đều đến từ việc điều khiển độc lập tốc độ hai bánh.

Khái niệm chính

Trực giác: nếu hai bánh quay cùng tốc độ, robot đi thẳng. Nếu bánh phải quay nhanh hơn bánh trái, robot lệch dần sang trái. Nếu hai bánh quay ngược chiều nhau với cùng tốc độ, robot xoay tại chỗ quanh tâm của chính nó.

Về mặt toán học, đây là hai công thức nền tảng nhất trong robot di động:

v = (v_R + v_L) / 2      # vận tốc dài tại tâm robot
ω = (v_R − v_L) / L      # vận tốc góc (quay)

Trong đó v_L, v_R là vận tốc dài của bánh trái/phải (m/s), còn L là khoảng cách giữa tâm hai bánh (m).

Vài trường hợp đặc biệt trở nên rất trực quan:

  • v_L = v_R → ω = 0: đi thẳng, không quay
  • v_L = −v_R → v = 0, ω ≠ 0: xoay tại chỗ, không tịnh tiến
  • v_L = 0, v_R > 0: robot quay quanh chính bánh trái (bán kính quay = L/2)

Nguyên lý hoạt động

Vận tốc dài của một bánh liên hệ với tốc độ quay động cơ qua bán kính bánh xe r:

v_banh = ω_dong_co × r

Đây chính là con số bạn thực sự gửi xuống driver động cơ ở bước "Act" trong vòng lặp điều khiển — bộ điều khiển tính ra v và ω mong muốn, rồi đảo ngược hai công thức trên để suy ra v_L, v_R cần thiết.

Odometry là kỹ thuật ước lượng vị trí hiện tại của robot (x, y, hướng θ) dựa trên số vòng quay bánh xe đo được từ encoder, mà không cần cảm biến định vị tuyệt đối. Nguyên lý: ở mỗi chu kỳ nhỏ Δt, tính được v và ω từ dữ liệu encoder, rồi tích luỹ (tích phân) để cập nhật vị trí:

θ_moi = θ_cu + ω × Δt
x_moi = x_cu + v × cos(θ_cu) × Δt
y_moi = y_cu + v × sin(θ_cu) × Δt

Kiến thức kỹ thuật

Công thức

Từ 2 công thức v/ω ở trên có thể suy ra bán kính quay tức thời (instantaneous radius of curvature) — hữu ích để biết robot đang đi theo cung tròn bán kính bao nhiêu tại một thời điểm:

R = v / ω = L/2 × (v_R + v_L) / (v_R − v_L)

VD: L = 0.3m, v_L = 0.2 m/s, v_R = 0.4 m/s
R = 0.3/2 × (0.4+0.2)/(0.4−0.2) = 0.15 × 3 = 0.45m
→ robot đang đi theo cung tròn bán kính 0.45m

Trường hợp v_L = v_R khiến mẫu số bằng 0 (R tiến tới vô cùng) — đúng nghĩa hình học: đi thẳng là đi theo "cung tròn bán kính vô hạn".

Thông số

Giá trị L (khoảng cách 2 bánh) điển hình theo kích cỡ AMR, và độ phân giải encoder ảnh hưởng trực tiếp tới sai số odometry (đã học ở bài Encoder trong chuyên mục Điều khiển động cơ):

Kích cỡ AMRL điển hình
AMR nhỏ trong nhà (chở hàng nhẹ)0.3 – 0.5m
AMR cỡ trung (nhà kho, xưởng)0.5 – 0.8m

Encoder độ phân giải càng cao (PPR lớn hơn, đã học ở bài Encoder), sai số làm tròn tích luỹ mỗi chu kỳ càng nhỏ — đây là lý do robot cần định vị chính xác dài hạn thường đầu tư encoder độ phân giải cao hơn ngay từ đầu, dù odometry vẫn luôn cần hiệu chỉnh bằng SLAM.

Ứng dụng thực tế

Odometry rẻ, đơn giản, chạy được ngay trên MCU — nhưng có nhược điểm chí mạng: sai số cộng dồn theo thời gian do trượt bánh, sai số làm tròn, dung sai chế tạo. Đây là lý do AMR thực tế không thể chỉ dùng odometry để định vị — nó được dùng làm nguồn dữ liệu "ngắn hạn, tần số cao" (chạy mượt giữa hai lần cập nhật), rồi được hiệu chỉnh định kỳ bằng dữ liệu "dài hạn, chính xác hơn" từ SLAM, thường thông qua bộ lọc Kalman (EKF, bài riêng trong chuyên mục Localization) kết hợp cả hai nguồn — đúng kiến trúc odom/map hai tầng đã học ở bài Hệ toạ độ.

Ví dụ thực tế

import math

L = 0.3  # khoảng cách 2 bánh (m)
dt = 0.1  # chu kỳ cập nhật (s)

x, y, theta = 0, 0, 0
v_L, v_R = 0.2, 0.4  # vận tốc bánh trái/phải (m/s)

v = (v_R + v_L) / 2
omega = (v_R - v_L) / L

theta += omega * dt
x += v * math.cos(theta) * dt
y += v * math.sin(theta) * dt

print(f"v={v:.2f} m/s, omega={omega:.2f} rad/s")
print(f"Vi tri moi: x={x:.3f}, y={y:.3f}, theta={math.degrees(theta):.1f} do")
Output:
v=0.30 m/s, omega=0.67 rad/s
Vi tri moi: x=0.023, y=0.002, theta=3.8 do

Sau đúng 1 chu kỳ Δt=0.1s, robot đã dịch một khoảng nhỏ và xoay 3.8° — lặp lại vòng lặp này liên tục (thường ở 20-50Hz) chính là cách odometry "tích luỹ" ra vị trí robot theo thời gian, từng bước rất nhỏ cộng dồn lại.

Lỗi thường gặp

  • Nhầm dấu trong công thức ω — (v_R − v_L) (không phải v_L − v_R) quyết định chiều dương của ω là xoay trái hay phải — nhầm dấu khiến robot xoay ngược hướng mong muốn dù độ lớn tính đúng.
  • Không chuẩn hoá θ về khoảng cố định — cộng dồn θ liên tục qua hàng nghìn chu kỳ khiến giá trị vượt xa khoảng -π đến π (hoặc 0-360°) — cần lấy θ mod 2π định kỳ để tránh số quá lớn gây mất độ chính xác dấu phẩy động.
  • Trộn độ và radian trong công thức tích phân — lỗi lặp lại xuyên suốt các bài Toán cho Robotics, hàm cos/sin trong θ_moi luôn cần radian.
  • Coi sai số odometry là hoàn toàn ngẫu nhiên — trượt bánh hệ thống (VD: 1 bánh mòn hơn bánh kia, khiến bán kính thực tế nhỏ hơn giá trị đã hiệu chỉnh) tạo ra sai số lệch có hệ thống theo 1 hướng cố định, không chỉ nhiễu ngẫu nhiên — cần hiệu chỉnh (calibration) định kỳ bán kính bánh xe thực tế, không chỉ dựa vào thông số danh nghĩa.

Kết luận

Hai công thức v/ω từ vận tốc bánh trái-phải là nền tảng của mọi robot differential drive — dùng để cả điều khiển (tính tốc độ động cơ cần set) lẫn định vị (tích phân ra vị trí qua odometry). Hiểu rõ sai số tích luỹ là hạn chế cố hữu, không phải lỗi cần "sửa hết", giúp thiết kế đúng kiến trúc kết hợp odometry + SLAM ngay từ đầu. Bài tiếp theo trong chuyên mục nói về Forward Kinematics — bài toán tổng quát hơn: biết vận tốc từng khớp/bánh, suy ra chuyển động của toàn bộ robot.

Động học robot di chuyển: Differential Drive và Odometry cơ bản — Atlasbot