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
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ải | acc_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_thetacũng cần cấu hình riêng biệt vớiacc_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_limgiữ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.