Tuning Rotation: xoay tại chỗ ổn định thay vì lắc lư qua lại
Atlasbot · 17/8/2026 · 11 phút đọc
Bài Tuning Velocity đã nói max_vel_theta. Riêng chuyển động xoay có một vài tham số và hiện tượng đặc thù đáng bàn kỹ hơn — đặc biệt là hiện tượng "lắc lư" (oscillation) khi robot cố xoay vào đúng hướng.
Khái niệm chính
Triệu chứng: robot xoay phải một chút, rồi xoay trái một chút, lặp lại
liên tục thay vì xoay dứt khoát một chiều tới đích
Nguyên nhân phổ biến: min_vel_theta (tốc độ xoay tối thiểu) đặt quá gần 0, hoặc trọng số các critic (đã học ở bài Controller) liên quan tới hướng (GoalAlign, PathAlign) xung đột nhau, khiến DWB liên tục đổi ý giữa "xoay phải một chút tốt hơn" và "xoay trái một chút tốt hơn" ở mỗi chu kỳ tính toán mới.
Nguyên lý hoạt động
FollowPath:
min_vel_theta: 0.15 # đặt đủ lớn để tránh xoay "nhấp nhả" gần 0
Oscillation.scale: 5.0 # tăng phạt cho hành vi đổi chiều liên tục
Vấn đề khác cần xử lý riêng: robot vi sai lệch hướng lớn so với path (ví dụ vừa quay đầu 90°) khiến DWB cố vừa tiến vừa xoay cùng lúc → quỹ đạo cong bất thường, không hiệu quả khi lệch hướng quá lớn. Nav2 cung cấp RotationShimController — plugin trung gian, khi phát hiện góc lệch giữa hướng robot và hướng path vượt ngưỡng, ưu tiên xoay tại chỗ trước cho tới khi hướng gần khớp, rồi mới chuyển giao cho controller chính (DWB/MPPI) xử lý tiến/lùi bám path bình thường:
controller_server:
ros__parameters:
controller_plugins: ["FollowPath"]
FollowPath:
plugin: "nav2_rotation_shim_controller::RotationShimController"
primary_controller: "dwb_core::DWBLocalPlanner"
rotate_to_heading_angular_vel: 1.8
max_angular_accel: 3.2
Tóm lại: Rotation Shim tách rõ hai giai đoạn — "xoay đúng hướng" và "di chuyển bám path" — thay vì để một controller duy nhất cố làm cả hai cùng lúc khi góc lệch quá lớn. Đây là giải pháp cấu hình (đổi plugin), không phải chỉnh tham số đơn thuần như các bài khác trong chuyên mục này.
Kiến thức kỹ thuật
Công thức
acc_lim_theta ảnh hưởng tới độ "dứt khoát" khi xoay — giống acc_lim_x (bài trước) nhưng cho chuyển động góc:
acc_lim_theta quá thấp → xoay ì ạch, chậm đạt max_vel_theta,
càng dễ bị cảm giác "lắc lư" nếu path yêu cầu
đổi hướng liên tục trong khoảng cách ngắn
Ngưỡng kích hoạt RotationShimController thường đặt theo góc lệch:
rotate_to_heading_min_angle ≈ 0.5-0.8 rad (~30-45°)
Góc lệch vượt ngưỡng này → ưu tiên xoay tại chỗ trước khi tiến
Thông số
| Triệu chứng | Kiểm tra |
|---|---|
| Lắc lư qua lại khi xoay tại chỗ | min_vel_theta, Oscillation.scale |
| Quỹ đạo cong bất thường khi vừa quay đầu | Cân nhắc RotationShimController |
| Xoay chậm, ì | acc_lim_theta, max_vel_theta |
Ứng dụng thực tế
Trong vận hành AMR thực tế ở nhà kho có nhiều góc cua gấp (giữa các dãy kệ hàng sát nhau), hiện tượng lắc lư khi xoay đặc biệt dễ xảy ra nếu path sinh ra từ Planner có nhiều điểm gấp khúc liên tiếp (đã học ở bài Planner — planner không có smoother hậu kỳ dễ sinh path kiểu này). Kết hợp RotationShimController cho các khúc cua gấp với việc tăng PathAlign.scale/Oscillation.scale phù hợp giúp robot xoay dứt khoát hơn, tránh hiện tượng lắc lư gây mất thời gian và trông thiếu chuyên nghiệp khi vận hành thực tế trước mặt người dùng.
Ví dụ thực tế
Kịch bản debug: robot đứng lắc lư ~5 giây trước khi thực sự bắt đầu
di chuyển về hướng goal, đặc biệt rõ khi vừa nhận goal mới
Bước 1: kiểm tra min_vel_theta — nếu gần 0 (VD: 0.02), tăng lên 0.15
Bước 2: kiểm tra Oscillation.scale — nếu thấp (VD: 1.0), tăng lên 5.0
Bước 3: test lại cùng kịch bản, quan sát robot có còn lắc lư không
Bước 4: nếu vẫn lắc lư khi vừa quay đầu lớn, cân nhắc RotationShimController
thay vì tiếp tục tăng Oscillation.scale (có thể gây tác dụng phụ
khác tới hành vi bám path bình thường)
Lỗi thường gặp
- Đặt
min_vel_thetaquá gần 0 — như đã nêu, gây hiện tượng xoay "nhấp nhả" thay vì dứt khoát một chiều. - Tăng
Oscillation.scalequá cao để "chữa cháy" — có thể gây tác dụng phụ tới hành vi bám path bình thường ở các tình huống không liên quan tới lắc lư, cần cân nhắcRotationShimControllercho vấn đề gốc (góc lệch lớn) thay vì chỉ tăng phạt oscillation. - Không phân biệt "lắc lư khi xoay tại chỗ" và "quỹ đạo cong bất thường khi vừa quay đầu" — hai triệu chứng khác nhau, nguyên nhân và giải pháp khác nhau (bảng Thông số), chẩn đoán nhầm dẫn tới chỉnh sai tham số.
- Đặt
acc_lim_thetaquá thấp cho môi trường nhiều cua gấp — như ở mục Công thức, càng dễ gây cảm giác lắc lư khi path yêu cầu đổi hướng liên tục trong khoảng cách ngắn.
Kết luận
Hiện tượng lắc lư khi xoay có 2 nguyên nhân khác nhau cần chẩn đoán đúng — min_vel_theta/Oscillation.scale cho lắc lư tại chỗ, RotationShimController cho quỹ đạo cong bất thường khi góc lệch quá lớn. Không phải mọi vấn đề xoay đều giải quyết bằng cách tăng một tham số phạt duy nhất. Bài tiếp theo trong chuyên mục đi vào Tuning Footprint — hình dạng vật lý robot ảnh hưởng tới costmap thế nào.