Tuning Costmap: inflation_radius và cost_scaling_factor
Atlasbot · 17/8/2026 · 11 phút đọc
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 xacost_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_radiusquyết định vùng ảnh hưởng rộng bao xa,cost_scaling_factorquyế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êncost_scaling_factorthấ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ờiraytrace_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ường | cost_scaling_factor đề xuất | Lý do |
|---|---|---|
| Đông người, nhiều vật cản động | Thấ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ẹp | Cao 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_rangenhỏ hơn hoặc bằngobstacle_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_factormà 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_factorcho 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_rangelớ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.