Tuning Acceleration: acc_lim_x quá thấp làm robot ì, quá cao làm robot giật
Atlasbot · 17/8/2026 · 11 phút đọc
Bài Giới hạn gia tốc đã giải thích trapezoidal velocity profile và công thức v(t) = v(t-1) + clamp(..., -a_max·dt, +a_max·dt). Trong Nav2, a_max chính là hai tham số acc_lim_x/decel_lim_x.
Khái niệm chính
FollowPath:
acc_lim_x: 1.0 # gia tốc tuyến tính tối đa (m/s²)
decel_lim_x: -1.5 # giảm tốc tối đa (thường cho phép lớn hơn acc_lim_x)
acc_lim_theta: 2.0 # gia tốc góc tối đa (rad/s²)
acc_lim_x quá thấp khiến robot "ì" — mất nhiều thời gian đạt tốc độ mong muốn sau mỗi lần dừng/rẽ, tổng thời gian hoàn thành nhiệm vụ tăng dù max_vel_x (bài trước) đặt đủ cao. acc_lim_x quá cao khiến controller ra lệnh đổi tốc độ nhanh hơn khả năng thực tế của động cơ/driver đáp ứng.
Nguyên lý hoạt động
acc_lim_x (tăng tốc): bị giới hạn bởi mô-men động cơ thực tế có thể tạo ra
decel_lim_x (giảm tốc): có thể tận dụng thêm ma sát + phanh động cơ,
thường có biên độ lớn hơn tăng tốc chủ động
Nhiều cấu hình thực tế đặt decel_lim_x (trị tuyệt đối) lớn hơn acc_lim_x một chút — robot giảm tốc nhanh hơn khi tăng tốc, hợp lý về mặt an toàn (ưu tiên khả năng dừng nhanh hơn khả năng tăng tốc nhanh) và thường khả thi hơn về mặt cơ khí.
Tóm lại:
acc_lim_xquá cao khiến controller ra lệnh đổi tốc độ nhanh hơn khả năng thực tế của động cơ/driver đáp ứng — driver có thể bị quá tải dòng tức thời (đã nhắc ở bài Motor Driver) hoặc gây trượt bánh làm sai lệch odometry.
Kiến thức kỹ thuật
Công thức
Đo thực tế thay vì đoán — cách xác định acc_lim_x hợp lý cho robot cụ thể:
Gửi cmd_vel bước nhảy tới v_target, đo thời gian t đạt được v_target thực tế
(qua encoder/odometry, không trượt bánh)
acc_lim_x_thực_tế ≈ v_target / t
VD: gửi lệnh v_target = 0.3 m/s, quan sát odometry đạt 0.3 m/s sau 0.4 giây
acc_lim_x_thực_tế ≈ 0.3 / 0.4 = 0.75 m/s²
Nên đặt acc_lim_x trong params.yaml THẤP HƠN giá trị đo được này
(VD: 0.6-0.7 m/s²) để chừa biên độ, tránh yêu cầu vượt khả năng thực tế
Thông số
| Tham số | Ảnh hưởng khi quá thấp | Ảnh hưởng khi quá cao |
|---|---|---|
acc_lim_x | Robot "ì", chậm đạt tốc độ mong muốn | Driver quá tải dòng tức thời, trượt bánh |
decel_lim_x | Robot dừng chậm, quãng đường phanh dài hơn | Dừng gấp, có thể gây giật/trượt |
acc_lim_theta | Xoay ì ạch, dễ cảm giác "lắc lư" ở đường nhiều cua gấp | Xoay giật, dễ trượt bánh khi xoay |
Ứng dụng thực tế
Gia tốc thấp làm robot phản ứng chậm hơn với vật cản mới xuất hiện (thời gian từ lúc quyết định giảm tốc tới lúc thực sự chậm lại kéo dài hơn) — cần cân nhắc cùng với inflation_radius (bài Costmap): robot gia tốc/giảm tốc chậm nên có vùng đệm an toàn (inflation) rộng hơn để bù lại thời gian phản ứng chậm đó. Đây là ví dụ cụ thể cho việc các tham số tuning không độc lập với nhau — thay đổi acc_lim_x có thể cần xem lại cả inflation_radius để giữ mức an toàn tổng thể tương đương.
Ví dụ thực tế
# Đo gia tốc thực tế của robot
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.3}}" --once
ros2 topic echo /odom # quan sát tốc độ thực tế tăng dần theo thời gian
Log điển hình khi đo:
t=0.0s: v=0.00 m/s
t=0.1s: v=0.09 m/s
t=0.2s: v=0.17 m/s
t=0.3s: v=0.24 m/s
t=0.4s: v=0.30 m/s <- đạt v_target
acc_lim_x_thực_tế ≈ 0.3/0.4 = 0.75 m/s²
Đặt trong params.yaml: acc_lim_x: 0.6 (chừa ~20% biên độ so với đo được)
Lỗi thường gặp
- Đặt
acc_lim_xtheo cảm tính thay vì đo thực tế — như ở mục Công thức, dùng con số không có căn cứ dễ dẫn tới robot "ì" (quá thấp) hoặc driver quá tải (quá cao). - Đặt
decel_lim_xbằngacc_lim_x— bỏ lỡ lợi thế robot thường giảm tốc nhanh hơn tăng tốc được nhờ ma sát + phanh động cơ, khiến robot phanh chậm hơn khả năng thực tế cho phép. - Không xem lại
inflation_radiuskhi thay đổi gia tốc — như đã nêu ở phần Ứng dụng thực tế, gia tốc thấp cần vùng đệm an toàn rộng hơn để bù thời gian phản ứng chậm. - Đo gia tốc thực tế trên bề mặt không đại diện cho môi trường vận hành thật — đo trên sàn phòng thí nghiệm trơn nhẵn rồi áp dụng cho môi trường kho hàng có ma sát khác biệt cho kết quả sai lệch.
Kết luận
acc_lim_x/decel_lim_x chính là a_max của công thức trapezoidal velocity profile đã học ở bài Giới hạn gia tốc — nên xác định qua đo đạc thực tế (gửi cmd_vel, quan sát odometry), không phải đoán, và cần cân nhắc cùng lúc với inflation_radius vì hai tham số ảnh hưởng lẫn nhau về mức an toàn tổng thể. Bài tiếp theo trong chuyên mục đi vào Tuning Rotation — tham số xoay có hiện tượng đặc thù riêng đáng bàn kỹ hơn.