Atlas Robotics
Tuning Nav2Trung bình

Tuning Costmap: inflation_radius và cost_scaling_factor

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

Tuning Costmap: inflation_radius và cost_scaling_factor
inflation_radius và cost_scaling_factor ảnh hưởng vùng đệm an toàn

Bài Costmap đã giải thích Inflation Layer lan toả chi phí quanh vật cản. Đây là bài thực hành tinh chỉnh hai tham số quan trọng nhất của lớp này.

Khái niệm chính

inflation_layer:
  inflation_radius: 0.55   # mét
  cost_scaling_factor: 3.0
  • inflation_radius — bán kính vùng ảnh hưởng, quyết định lan toả rộng bao xa
  • cost_scaling_factor — tốc độ giảm chi phí theo khoảng cách, quyết định độ thận trọng đó giảm nhanh hay chậm

Nguyên lý hoạt động

inflation_radius đúng như đã nói ở bài Costmap: tối thiểu bằng bán kính robot (bài Footprint) cộng biên độ an toàn. Quá nhỏ, robot tính đường sát vật cản hơn mức an toàn thực tế cho phép; quá lớn, robot từ chối đi qua các không gian hẹp mà thực tế đủ rộng để lách qua.

Công thức chi phí trong vùng inflation:

cost = 253 × e^(-cost_scaling_factor × (khoảng_cách − bán_kính_vật_cản))

cost_scaling_factor càng lớn, chi phí giảm càng nhanh theo khoảng cách — robot "bớt thận trọng" nhanh hơn khi đi xa dần vật cản, sẵn sàng đi gần hơn. cost_scaling_factor càng nhỏ, chi phí giảm chậm, robot giữ khoảng cách "thận trọng" trên phạm vi rộng hơn quanh mỗi vật cản.

Tóm lại: Hai tham số phối hợp nhau — inflation_radius quyết định vùng ảnh hưởng rộng bao xa, cost_scaling_factor quyết định độ thận trọng đó giảm nhanh hay chậm trong vùng đó. Môi trường đông đúc, nhiều người qua lại nên ưu tiên cost_scaling_factor thấp hơn (thận trọng lâu hơn); môi trường tĩnh, nhiều lối đi hẹp nên ưu tiên giá trị cao hơn (bớt thận trọng nhanh, tận dụng được không gian hẹp).

Kiến thức kỹ thuật

Công thức

obstacle_range và raytrace_range — tầm ảnh hưởng của dữ liệu cảm biến:

obstacle_layer:
  scan:
    obstacle_range: 2.5    # chỉ đánh dấu vật cản trong phạm vi này
    raytrace_range: 3.0    # xoá dấu vết vật cản cũ trong phạm vi này khi không còn thấy
  • obstacle_range — giới hạn khoảng cách LiDAR được phép thêm ô "occupied" vào costmap — vật cản quá xa (dù LiDAR có tầm quét xa hơn, bài Chọn LiDAR) không cần đánh dấu ngay, tránh costmap "quá tải" thông tin không cần thiết cho việc né tránh tức thời
  • raytrace_range — giới hạn khoảng cách được phép xoá ô đã đánh dấu occupied trước đó nếu giờ tia laser đi xuyên qua không còn chạm gì — cơ chế "vật cản đã biến mất"

Thường đặt raytrace_range lớn hơn obstacle_range — dễ xoá dấu vết cũ hơn là thêm dấu vết mới, tránh costmap "dính" mãi một vật cản động đã di chuyển đi từ lâu.

Thông số

Môi trườngcost_scaling_factor đề xuấtLý do
Đông người, nhiều vật cản độngThấp hơn (VD: 2.0)Giữ khoảng cách thận trọng lâu hơn
Tĩnh, nhiều lối đi hẹpCao hơn (VD: 5.0)Bớt thận trọng nhanh, tận dụng không gian hẹp

Ứng dụng thực tế

Kiểm tra bằng RViz2, đúng như đã học ở bài RViz2: thêm Display cho topic /local_costmap/costmap — quan sát trực tiếp vùng màu (chi phí) lan toả quanh vật cản khi thay đổi từng tham số, thay vì chỉ đoán bằng công thức lý thuyết. Đây là cách hiệu quả nhất để tune costmap: sửa tham số, xem ngay hiệu ứng trực quan trong RViz2, lặp lại. Với kho hàng có cả khu vực đông người (đóng gói) và khu vực tĩnh (kệ lưu trữ), cân nhắc cấu hình cost_scaling_factor khác nhau theo khu vực (tương tự cách tiếp cận zone-based đã học ở bài Tuning Velocity) thay vì một giá trị thoả hiệp chung cho toàn bộ không gian.

Ví dụ thực tế

So sánh 2 cấu hình cho cùng inflation_radius = 0.55m,
vật thể cách vật cản 0.3m (trong vùng inflation):

cost_scaling_factor = 2.0 (thận trọng lâu):
cost = 253 × e^(-2.0 × 0.3) ≈ 253 × 0.549 ≈ 139 (chi phí còn khá cao)

cost_scaling_factor = 5.0 (bớt thận trọng nhanh):
cost = 253 × e^(-5.0 × 0.3) ≈ 253 × 0.223 ≈ 56 (chi phí giảm nhiều hơn)

Ở cùng khoảng cách 0.3m tới vật cản, cost_scaling_factor cao hơn khiến
robot "cảm thấy" an toàn hơn nhiều (chi phí thấp hơn), sẵn sàng đi qua
không gian đó dễ dàng hơn so với cost_scaling_factor thấp

Lỗi thường gặp

  • Đặt raytrace_range nhỏ hơn hoặc bằng obstacle_range — như đã nêu, ngược với khuyến nghị thông thường, khiến costmap khó xoá dấu vết vật cản động đã di chuyển đi, dễ "dính" chi phí cao ở vị trí không còn vật cản thực tế.
  • Chỉnh cost_scaling_factor mà không quan sát trực quan qua RViz2 — chỉ dựa vào công thức lý thuyết dễ chọn giá trị không phù hợp với cảm nhận thực tế về "robot có đủ thận trọng không" trong môi trường cụ thể.
  • Dùng cùng cost_scaling_factor cho mọi khu vực trong một không gian vận hành đa dạng — bỏ lỡ cơ hội tối ưu vừa an toàn (khu đông người) vừa hiệu quả (khu tĩnh, lối hẹp) như bảng Thông số đã gợi ý.
  • Đặt obstacle_range lớn hơn cần thiết — costmap phải xử lý nhiều dữ liệu vật cản xa không cần thiết cho việc né tránh tức thời, tốn tài nguyên tính toán không tương xứng lợi ích.

Kết luận

inflation_radius và cost_scaling_factor phối hợp nhau định hình toàn bộ "tính cách thận trọng" của robot khi đi gần vật cản — rộng bao xa và giảm nhanh hay chậm. Luôn tinh chỉnh kèm quan sát trực quan qua RViz2 thay vì chỉ tin vào công thức lý thuyết. Bài tiếp theo trong chuyên mục — Tuning Controller — tổng hợp lại toàn bộ tham số đã học thành một quy trình chỉnh sửa có hệ thống, khép lại chuyên mục Tuning Nav2.

Tuning Costmap: inflation_radius và cost_scaling_factor — Atlasbot