Atlas Robotics
Tuning Nav2Trung bình

Tuning Rotation: xoay tại chỗ ổn định thay vì lắc lư qua lại

Atlasbot · 17/8/2026 · 11 phút đọc

Tuning Rotation: xoay tại chỗ ổn định thay vì lắc lư qua lại
Robot lắc lư qua lại thay vì xoay dứt khoát về một hướng

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ứngKiể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 đầuCâ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_theta quá 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.scale quá 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ắc RotationShimController cho 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_theta quá 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.

Tuning Rotation: xoay tại chỗ ổn định thay vì lắc lư qua lại — Atlasbot