Tuning Velocity: max_vel_x đặt sai làm robot chậm chạp hoặc mất kiểm soát
Atlasbot · 17/8/2026 · 11 phút đọc
Bài Controller đã giới thiệu DWB/MPPI lấy mẫu vận tốc trong "cửa sổ động". Cửa sổ đó bị giới hạn bởi các tham số vận tốc trong params.yaml — bài này đi vào cách đặt đúng các tham số đó.
Khái niệm chính
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
max_vel_x: 0.3 # tốc độ tiến tối đa (m/s)
min_vel_x: -0.1 # tốc độ lùi tối đa (âm = lùi)
max_vel_theta: 1.0 # tốc độ xoay tối đa (rad/s)
min_speed_xy: 0.0 # tốc độ tối thiểu để coi là "đang di chuyển"
max_vel_x KHÔNG được vượt quá v_max đã tính ở bài Chọn Motor (v_max = ω × r từ RPM động cơ và bán kính bánh).
Nguyên lý hoạt động
Đặt max_vel_x cao hơn tốc độ vật lý thật động cơ có thể đạt không làm robot nhanh hơn — nó chỉ khiến DWB/MPPI lấy mẫu những vận tốc không bao giờ đạt được thực tế, lãng phí một phần không gian tìm kiếm cho các mẫu vô nghĩa. Nên đặt max_vel_x thấp hơn một chút (khoảng 80-90%) so với v_max lý thuyết, chừa biên độ cho driver/pin không đạt đúng 100% hiệu năng danh nghĩa trong điều kiện thực tế (đã nhắc ở bài Tính Battery — pin yếu dần theo thời gian sử dụng).
min_speed_xy — ngưỡng phân biệt "đang chạy" và "đứng yên" — ảnh hưởng tới cách một số recovery behavior (bài Recovery) và logic phát hiện "robot bị kẹt" (oscillation detection) hoạt động — đặt quá cao khiến hệ thống nghĩ robot đang đứng yên dù thực tế đang di chuyển chậm, kích hoạt recovery không cần thiết.
Tóm lại:
max_vel_xlà trần tốc độ mềm áp cho thuật toán điều khiển, không phải trần tốc độ cứng của phần cứng — đặt sai theo hướng nào cũng có vấn đề: quá cao lãng phí không gian tìm kiếm hoặc gây trượt bánh khi driver cố ép đạt tốc độ không khả thi; quá thấp làm robot chậm chạp không cần thiết dù phần cứng còn dư khả năng.
Kiến thức kỹ thuật
Công thức
Biên độ an toàn giữa max_vel_x cấu hình và v_max vật lý — tính theo phần trăm dự phòng cho driver/pin không đạt đúng hiệu năng danh nghĩa:
max_vel_x_cấu_hình = v_max_lý_thuyết × hệ_số_dự_phòng (0.8 - 0.9)
VD: v_max lý thuyết = 0.41 m/s (từ bài Chọn Motor, động cơ 120 RPM, bánh 65mm)
max_vel_x đề xuất = 0.41 × 0.85 ≈ 0.35 m/s
Không nên đặt max_vel_x = 0.41 (100% lý thuyết) vì driver/pin thực tế
hiếm khi đạt đúng 100% hiệu năng danh nghĩa, đặc biệt khi pin đã qua
nhiều chu kỳ sạc/xả (đã học ở bài Tính Battery)
Thông số
| Tham số | Vai trò | Rủi ro nếu sai |
|---|---|---|
max_vel_x | Trần tốc độ tiến | Quá cao: lãng phí không gian tìm kiếm/trượt bánh. Quá thấp: robot chậm chạp không cần thiết |
min_speed_xy | Ngưỡng "đang chạy" vs "đứng yên" | Quá cao: kích hoạt recovery không cần thiết khi robot chạy chậm bình thường |
max_vel_theta | Trần tốc độ xoay | Tương tự max_vel_x nhưng cho chuyển động góc |
Ứng dụng thực tế
Nhiều triển khai Nav2 thực tế dùng nhiều profile tốc độ khác nhau, chuyển đổi động theo ngữ cảnh (qua service SetSpeedLimit hoặc thay đổi tham số runtime): không gian rộng, ít vật cản → tốc độ cao (gần max_vel_x tối đa); không gian hẹp, gần con người → tốc độ giảm chủ động (an toàn hơn tốc độ); đang docking/căn chỉnh chính xác → tốc độ rất thấp (ưu tiên độ chính xác). Đây là mức tinh chỉnh nâng cao hơn việc chỉ đặt một con số max_vel_x cố định trong params.yaml — phù hợp khi robot vận hành trong môi trường có mật độ người/vật cản thay đổi theo khu vực hoặc thời điểm trong ngày.
Ví dụ thực tế
# Giảm tốc độ xuống 50% khi robot vào khu vực đông người
ros2 topic pub /speed_limit nav2_msgs/msg/SpeedLimit "{speed_limit: 0.5, percentage: true}"
# Khôi phục tốc độ bình thường khi ra khỏi khu vực đó
ros2 topic pub /speed_limit nav2_msgs/msg/SpeedLimit "{speed_limit: 0.0, percentage: true}"
Kịch bản: kho hàng có khu vực đóng gói đông nhân viên vào giờ cao điểm,
và khu vực kệ hàng vắng người phần lớn thời gian
Cấu hình zone-based speed limit qua application layer (đã học ở bài
Application Layer trong AMR): khi robot đi vào polygon khu vực đóng gói,
publish SpeedLimit 50%; khi rời khỏi, publish lại 0% (khôi phục max_vel_x mặc định)
Kết quả: robot tự động chậm lại ở khu vực rủi ro cao, giữ tốc độ bình
thường ở khu vực an toàn — không cần một max_vel_x cố định thoả hiệp
giữa an toàn và hiệu suất cho toàn bộ không gian vận hành
Lỗi thường gặp
- Đặt
max_vel_xbằng đúng 100%v_maxlý thuyết — như tính ở mục Công thức, không chừa biên độ cho hiệu năng thực tế thấp hơn danh nghĩa, dễ gây trượt bánh khi driver cố ép đạt tốc độ không khả thi. - Đặt
max_vel_xquá thấp "cho an toàn" — robot chậm chạp không cần thiết dù phần cứng còn dư khả năng, kéo dài thời gian hoàn thành nhiệm vụ không có lý do chính đáng. - Đặt
min_speed_xyquá cao — kích hoạt recovery behavior không cần thiết khi robot đang di chuyển chậm bình thường (VD: lúc docking cần tốc độ rất thấp), làm gián đoạn hành vi mong muốn. - Dùng một
max_vel_xcố định cho toàn bộ môi trường vận hành đa dạng — bỏ lỡ cơ hội tối ưu vừa an toàn vừa hiệu suất bằng cách điều chỉnh tốc độ theo từng khu vực cụ thể như ví dụ trên.
Kết luận
max_vel_x là trần tốc độ mềm cho thuật toán điều khiển, cần đặt thấp hơn giới hạn vật lý thật một biên độ hợp lý (80-90%), không phải giá trị "nghe hợp lý" tuỳ ý. Với môi trường vận hành đa dạng, cân nhắc profile tốc độ động theo khu vực thay vì một con số cố định. Bài tiếp theo trong chuyên mục đi vào Tuning Acceleration — tham số gia tốc quyết định robot đạt tới tốc độ này nhanh hay chậm.