Vector trong Robotics: vị trí, vận tốc và góc giữa hai hướng
Atlasbot · 17/8/2026 · 10 phút đọc
Trước khi đọc được bất kỳ công thức động học robot nào (đã xuất hiện ở bài Differential Drive và Odometry), cần thống nhất một ngôn ngữ toán học chung: vector. Vị trí robot trên mặt phẳng, vận tốc di chuyển, hướng của LiDAR quét — tất cả đều là vector.
Khái niệm chính
Một con số (scalar) chỉ mang độ lớn — ví dụ "robot đang di chuyển với tốc độ 0.5". Một vector mang cả độ lớn lẫn hướng — "robot đang di chuyển với vận tốc 0.5 m/s theo hướng 30° so với trục x". Trong robot 2D (mặt phẳng), vector được viết đơn giản dưới dạng cặp toạ độ:
p = (x, y) # vector vị trí — robot đang ở đâu
v = (vx, vy) # vector vận tốc — đang di chuyển nhanh/chậm, theo hướng nào
Độ lớn (magnitude) của vector — ví dụ tốc độ thực tế bất kể hướng — tính bằng định lý Pythagoras:
|v| = √(vx² + vy²)
Tóm lại: Vector = độ lớn + hướng, viết dưới dạng cặp toạ độ trong không gian 2D — khác biệt cốt lõi so với 1 con số (scalar) chỉ có độ lớn.
Nguyên lý hoạt động
Cộng hai vector là cộng từng thành phần tương ứng — ý nghĩa vật lý là tổng hợp hai chuyển động xảy ra đồng thời. Ví dụ robot di chuyển trên băng chuyền: vận tốc thực tế so với mặt đất là tổng vector vận tốc của robot cộng vector vận tốc băng chuyền:
v_thuc_te = v_robot + v_bang_chuyen
= (vx1 + vx2, vy1 + vy2)
Tích vô hướng (dot product) giữa hai vector cho biết chúng cùng hướng đến mức nào — dùng nhiều nhất khi cần tính góc giữa hai vector (ví dụ góc lệch giữa hướng robot đang nhìn và hướng cần tới đích):
a · b = ax·bx + ay·by = |a| |b| cos(θ)
θ = arccos( (a · b) / (|a| |b|) )
Đây chính xác là phép tính nằm bên dưới câu hỏi "robot cần xoay bao nhiêu độ để hướng thẳng về waypoint tiếp theo" mà bất kỳ bộ điều khiển bám đường đi (path following) nào cũng phải giải.
Kiến thức kỹ thuật
Công thức
Chuẩn hoá vector (normalization) — lấy vector đơn vị (unit vector) chỉ giữ lại hướng, bỏ độ lớn — dùng khi chỉ quan tâm robot đang "nhìn về đâu", không quan tâm tốc độ:
v̂ = v / |v|
VD: v = (3, 4), |v| = √(3² + 4²) = 5
v̂ = (3/5, 4/5) = (0.6, 0.8) ← vector đơn vị, |v̂| luôn = 1
Thông số
Khoảng giá trị thực tế của các vector vận tốc trên AMR trong nhà — hữu ích để biết "con số nào là hợp lý" khi debug:
| Đại lượng | Khoảng giá trị điển hình |
|---|---|
| Vận tốc dài (linear velocity) | 0 – 1.5 m/s (AMR trong nhà, không gian hẹp) |
| Vận tốc góc (angular velocity) | -π đến π rad/s (~-180°/s đến 180°/s) |
Ứng dụng thực tế
Ngoài dot product (đo "cùng hướng đến mức nào"), tích có hướng 2D (cross product, chỉ lấy thành phần z) cho biết robot cần rẽ trái hay phải để hướng về đích — bổ sung thông tin mà dot product/arccos không cho biết (arccos luôn trả về góc dương 0-180°, không phân biệt được chiều xoay):
cross_z = ax·by − ay·bx
cross_z > 0 → b lệch sang trái so với a (cần rẽ trái)
cross_z < 0 → b lệch sang phải so với a (cần rẽ phải)
Kết hợp dot product (độ lớn góc lệch) và cross product (chiều lệch trái/phải) là cách chuẩn để bộ điều khiển bám đường đi tính chính xác cần xoay bao nhiêu độ, theo chiều nào — chỉ dùng riêng dot product/arccos sẽ không đủ thông tin để biết xoay trái hay phải.
Ví dụ thực tế
import math
def magnitude(v):
return math.sqrt(v[0]**2 + v[1]**2)
def angle_between(a, b):
dot = a[0]*b[0] + a[1]*b[1]
cross_z = a[0]*b[1] - a[1]*b[0]
angle_rad = math.atan2(cross_z, dot) # atan2 giữ được cả độ lớn lẫn chiều
return math.degrees(angle_rad)
huong_robot = (1, 0) # robot đang nhìn thẳng theo trục x
huong_toi_dich = (0, 1) # đích nằm thẳng theo trục y (bên trái)
print(f"Goc can xoay: {angle_between(huong_robot, huong_toi_dich):.1f} do")
Output:
Goc can xoay: 90.0 do
Kết quả dương (+90°) cho biết robot cần xoay trái đúng 90° — dùng atan2(cross_z, dot) thay vì arccos đơn thuần giải quyết luôn vấn đề mất thông tin chiều đã nói ở mục Ứng dụng thực tế, không cần tính riêng 2 bước.
Lỗi thường gặp
- Dùng
arccosrồi mất thông tin chiều xoay (trái/phải) — như đã nói ở trên,arccoschỉ trả về góc dương 0-180°, không biết nên xoay trái hay phải — dùngatan2(cross_z, dot)để có đủ cả độ lớn lẫn chiều trong 1 bước. - Chuẩn hoá (normalize) một vector có độ lớn bằng 0 — chia cho
|v| = 0gây lỗi chia cho 0 — xảy ra khi robot đã ở đúng vị trí đích (vector hướng tới đích bằng 0), cần kiểm tra độ lớn trước khi chuẩn hoá. - Trộn lẫn đơn vị độ (degree) và radian trong cùng phép tính — hàm lượng giác trong hầu hết ngôn ngữ lập trình (Python
math, Ccmath) mặc định nhận radian, truyền nhầm độ vào gây kết quả sai hoàn toàn mà không báo lỗi. - Nhầm lẫn giữa điểm (point) và vector — 2 điểm tự nó không phải vector, phải trừ điểm đích cho điểm hiện tại mới ra vector hướng (
v = p_dich - p_hien_tai) — cộng/dùng trực tiếp toạ độ điểm như vector gây kết quả vô nghĩa.
Kết luận
Vector là viên gạch nền của mọi công thức động học robot phía sau — Matrix (bài tiếp theo) chẳng qua là công cụ biến đổi hàng loạt vector cùng lúc, còn Rotation và Transform đều là các phép biến đổi vector cụ thể. Nắm vững phép cộng, dot product, và cross product 2D là đủ để hiểu cách một bộ điều khiển bám đường đi tính toán góc cần xoay. Bài tiếp theo trong chuyên mục nói về Matrix — cách biểu diễn và áp dụng nhiều phép biến đổi vector cùng lúc một cách gọn gàng.