Atlas Robotics
Toán cho RoboticsCơ bản

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

Vector trong Robotics: vị trí, vận tốc và góc giữa hai hướng
Vector vị trí, vector vận tốc và góc giữa hai vector

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ượngKhoả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 arccos rồi mất thông tin chiều xoay (trái/phải) — như đã nói ở trên, arccos chỉ trả về góc dương 0-180°, không biết nên xoay trái hay phải — dùng atan2(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| = 0 gâ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, C cmath) 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.

Vector trong Robotics: vị trí, vận tốc và góc giữa hai hướng — Atlasbot