Atlas Robotics
Điều khiển RobotTrung bình

Giới hạn gia tốc: vì sao robot không nên đổi tốc độ tức thời

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

Giới hạn gia tốc: vì sao robot không nên đổi tốc độ tức thời
Trapezoidal velocity profile: tăng tốc dần, giữ đều, giảm tốc dần

Bài Điều khiển tốc độ đã giả định bộ điều khiển tốc độ luôn có thể đạt ngay tốc độ mong muốn. Trong thực tế, nhảy thẳng từ 0 lên tốc độ tối đa (hoặc ngược lại) trong một chu kỳ điều khiển là điều không nên làm, kể cả khi động cơ đủ khoẻ để làm được — đây là lý do khái niệm giới hạn gia tốc (acceleration limit) luôn xuất hiện trong cấu hình Nav2 và mọi bộ điều khiển robot nghiêm túc.

Khái niệm chính

  • Trượt bánh (wheel slip) — thay đổi tốc độ đột ngột đòi hỏi lực ma sát tức thời rất lớn giữa bánh và mặt sàn; vượt quá giới hạn ma sát tĩnh, bánh trượt thay vì lăn — dữ liệu odometry trở nên sai lệch ngay lập tức
  • Giật cơ khí — khung robot, giá đỡ cảm biến, hàng hoá chở trên robot đều chịu lực quán tính lớn khi gia tốc đột ngột — về lâu dài gây mỏi/hỏng kết cấu
  • Dòng điện tức thời quá lớn — động cơ đổi tốc độ nhanh cần dòng điện tức thời cao, có thể vượt giới hạn driver hoặc gây sụt áp

Nguyên lý hoạt động

Giải pháp chuẩn: thay vì đổi tốc độ tức thời (dạng bậc thang), giới hạn tốc độ thay đổi tối đa mỗi chu kỳ — tạo ra đồ thị vận tốc theo thời gian có dạng hình thang: tăng tốc dần (accel), giữ đều (cruise), giảm tốc dần (decel):

v_lenh(t) = v_hien_tai + clamp(v_muc_tieu − v_hien_tai, −a_max·dt, +a_max·dt)

Tóm lại: "Dừng ngay lập tức" trong phần mềm điều khiển robot bình thường không có nghĩa là set PWM = 0 ngay trong một chu kỳ — nó có nghĩa là bắt đầu giảm tốc với gia tốc âm tối đa cho phép. Chỉ E-Stop phần cứng (ngắt nguồn động cơ trực tiếp) mới thực sự dừng tức thời — chính vì vậy E-Stop luôn là mạch cứng riêng biệt, không đi qua phần mềm.

Cấu hình trong Nav2:

controller_server:
  ros__parameters:
    FollowPath:
      max_vel_x: 0.5
      acc_lim_x: 1.0        # giới hạn gia tốc tuyến tính (m/s²)
      max_vel_theta: 1.0
      acc_lim_theta: 2.0     # giới hạn gia tốc góc (rad/s²)

Kiến thức kỹ thuật

Công thức

Thời gian cần để đạt tốc độ mục tiêu từ trạng thái nghỉ, tính trực tiếp từ giới hạn gia tốc — hữu ích để ước lượng trước khi lập kế hoạch quỹ đạo (bài tiếp theo):

t_dat_toc_do = v_muc_tieu / a_max

VD: v_muc_tieu = 0.5 m/s, a_max = 1.0 m/s²
t = 0.5 / 1.0 = 0.5 giây để đạt đủ tốc độ

Quãng đường đi được trong lúc tăng tốc (giả sử tăng tuyến tính):
d = 0.5 × v_muc_tieu × t = 0.5 × 0.5 × 0.5 = 0.125m

Thông số

Giá trị acc_lim điển hình khác nhau đáng kể tuỳ loại tải AMR đang chở:

Loại robot/tảiacc_lim_x điển hình
AMR nhẹ, không chở hàng dễ vỡ0.5 – 1.5 m/s²
AMR chở hàng dễ đổ/dễ vỡ (chất lỏng, hàng xếp chồng)0.2 – 0.5 m/s² (thấp hơn nhiều)

Ứng dụng thực tế

Với AMR chở hàng đặc biệt nhạy cảm với rung lắc (thùng chất lỏng, hàng xếp chồng cao dễ đổ), ngay cả trapezoidal profile cũng chưa đủ mượt — "góc" của hình thang (chuyển đột ngột từ gia tốc a_max sang gia tốc 0 tại thời điểm bắt đầu cruise) vẫn tạo ra jerk (tốc độ thay đổi của gia tốc) đủ lớn để gây xóc. Giải pháp nâng cao hơn là S-curve profile — giới hạn thêm cả jerk, không chỉ gia tốc, làm mượt cả các góc chuyển tiếp giữa 3 giai đoạn tăng tốc/cruise/giảm tốc — đánh đổi bằng việc mất nhiều thời gian hơn để đạt tốc độ mục tiêu so với trapezoidal profile thông thường, chỉ đáng dùng khi thực sự cần độ êm cao cho hàng hoá nhạy cảm.

Ví dụ thực tế

def trapezoidal_ramp(v_current, v_target, a_max, dt):
    delta = v_target - v_current
    max_change = a_max * dt
    delta = max(-max_change, min(max_change, delta))
    return v_current + delta

v = 0
target = 0.5
a_max = 1.0
dt = 0.1

for step in range(6):
    v = trapezoidal_ramp(v, target, a_max, dt)
    print(f"Step {step}: v={v:.2f} m/s")
Output:
Step 0: v=0.10 m/s
Step 1: v=0.20 m/s
Step 2: v=0.30 m/s
Step 3: v=0.40 m/s
Step 4: v=0.50 m/s
Step 5: v=0.50 m/s

Tốc độ tăng đều đặn 0.1 m/s mỗi bước (đúng a_max × dt = 1.0 × 0.1), đạt mục tiêu sau 5 bước rồi giữ nguyên — đúng hình dạng "tăng tốc dần rồi giữ đều" của trapezoidal profile, không nhảy vọt ngay ở bước đầu tiên dù mục tiêu đã biết trước.

Lỗi thường gặp

  • acc_lim đặt quá cao — mất hết ý nghĩa của giới hạn gia tốc, robot vẫn giật gần như tức thời — quay lại đúng vấn đề trượt bánh/giật cơ khí đã nêu ở phần Khái niệm chính.
  • acc_lim đặt quá thấp — robot phản ứng quá chậm với tình huống khẩn cấp, mâu thuẫn trực tiếp với phép tính khoảng cách phản ứng đã học ở bài Sense-Think-Act — cần cân bằng giữa êm ái và khả năng phản ứng an toàn, không chỉ tối ưu 1 phía.
  • Chỉ cấu hình giới hạn gia tốc tuyến tính, quên giới hạn góc — acc_lim_theta cũng cần cấu hình riêng biệt với acc_lim_x, thiếu nó khiến robot xoay giật cục dù di chuyển thẳng đã mượt.
  • Copy nguyên acc_lim giữa 2 robot khác khối lượng/tải trọng — robot nặng hơn cần giới hạn gia tốc thấp hơn để tránh trượt bánh (quán tính lớn hơn với cùng lực ma sát khả dụng) — luôn hiệu chỉnh lại theo đặc tính vật lý thực tế của từng robot, không dùng chung 1 bộ số.

Kết luận

Giới hạn gia tốc chuyển đổi tốc độ dạng "bậc thang" nguy hiểm thành dạng "hình thang" êm ái và an toàn hơn — đánh đổi bằng thời gian đạt tốc độ mục tiêu chậm hơn một chút. Cân bằng đúng giữa độ êm và khả năng phản ứng an toàn là quyết định thiết kế quan trọng, không chỉ là thông số kỹ thuật đơn thuần. Bài tiếp theo trong chuyên mục nói về Trajectory (quỹ đạo) — cách lập kế hoạch toàn bộ đường đi robot sẽ theo, trong đó giới hạn gia tốc vừa học là một ràng buộc bắt buộc phải tôn trọng.

Giới hạn gia tốc: vì sao robot không nên đổi tốc độ tức thời — Atlasbot