Atlas Robotics
Tuning Nav2Trung bình

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

Tuning Acceleration: acc_lim_x quá thấp làm robot ì, quá cao làm robot giật
acc_lim_x thấp làm robot ì, cao làm robot giật

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_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 — 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_xRobot "ì", chậm đạt tốc độ mong muốnDriver quá tải dòng tức thời, trượt bánh
decel_lim_xRobot dừng chậm, quãng đường phanh dài hơnDừng gấp, có thể gây giật/trượt
acc_lim_thetaXoay ì ạch, dễ cảm giác "lắc lư" ở đường nhiều cua gấpXoay 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_x theo 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_x bằng acc_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_radius khi 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.

Tuning Acceleration: acc_lim_x quá thấp làm robot ì, quá cao làm robot giật — Atlasbot