Tuning Footprint: hình dạng robot ảnh hưởng costmap thế nào
Atlasbot · 17/8/2026 · 11 phút đọc
Bài Costmap đã nói Inflation Layer cần bán kính robot để tính chi phí lan toả quanh vật cản. Tham số đó tới từ đâu — footprint — là chủ đề bài này.
Khái niệm chính
Hai cách khai báo hình dạng robot:
local_costmap:
local_costmap:
ros__parameters:
# Cách 1: hình tròn đơn giản
robot_radius: 0.22
# Cách 2: đa giác chính xác (dùng thay vì robot_radius, không dùng cả 2)
footprint: "[[0.2, 0.15], [0.2, -0.15], [-0.2, -0.15], [-0.2, 0.15]]"
robot_radius— coi robot như một hình tròn, đơn giản, tính toán nhanh, nhưng lãng phí không gian nếu robot thực tế không tròn (ví dụ robot hình chữ nhật dài — hình tròn bao trọn nó sẽ rộng hơn nhiều so với kích thước thật theo chiều ngang)footprint— đa giác khai chính xác từng điểm góc robot, phản ánh đúng hình dạng thật, cho phép robot lách qua không gian hẹp mà hình tròn bao ngoài sẽ từ chối đi qua
Nguyên lý hoạt động
robot_radius phù hợp robot gần tròn hoặc gần vuông (Mecanum, differential có tỉ lệ dài/rộng gần 1) — đơn giản, đủ dùng. footprint cần thiết khi robot có hình dạng dài/lệch rõ rệt (robot chở pallet, robot có tay máy nhô ra một bên) — nếu dùng robot_radius cho robot dài, costmap sẽ coi cả phần "thừa" không có robot là cần né tránh, khiến robot không lách được qua không gian đủ rộng thực tế.
Footprint sai gây ra hai loại lỗi ngược nhau:
Footprint LỚN hơn robot thật:
→ robot từ chối đi qua không gian hẹp mà thực tế đủ rộng
→ planner tính đường vòng không cần thiết, hoặc báo "không tìm được đường"
Footprint NHỎ hơn robot thật:
→ robot tính đường đi sát vật cản hơn kích thước thật cho phép
→ nguy cơ va chạm thực tế dù Nav2 "nghĩ" là an toàn
Tóm lại: Footprint nhỏ hơn thực tế nguy hiểm hơn nhiều so với lớn hơn — luôn nên đo đạc chính xác kích thước vật lý robot (kể cả các phần nhô ra như bumper, cảm biến gắn cạnh) rồi cộng thêm một biên độ an toàn nhỏ, không nên "làm tròn xuống" để tiết kiệm không gian di chuyển.
Kiến thức kỹ thuật
Công thức
footprint_padding: 0.03 # thêm 3cm biên độ an toàn quanh footprint đã khai
Thay vì tự cộng thêm biên độ vào từng toạ độ điểm góc trong footprint, footprint_padding áp dụng biên độ đều quanh toàn bộ đa giác đã khai:
Diện_tích_hiệu_dụng_với_padding ≈ Diện_tích_footprint_gốc
+ Chu_vi_footprint × footprint_padding
VD: footprint chữ nhật 0.4m × 0.3m (chu vi 1.4m), padding 0.03m
Diện_tích_tăng_thêm ≈ 1.4 × 0.03 = 0.042 m² (~3.5% diện tích gốc 0.12m²)
Thông số
| Cách khai | Ưu điểm | Nhược điểm |
|---|---|---|
robot_radius | Đơn giản, tính toán nhanh | Lãng phí không gian nếu robot không tròn |
footprint (đa giác) | Chính xác hình dạng thật | Cần đo đạc kỹ, phức tạp hơn khai báo |
footprint_padding | Thêm biên an toàn không cần tính lại toạ độ | Chỉ áp dụng đều, không tinh chỉnh riêng từng cạnh |
Ứng dụng thực tế
Local costmap và global costmap dùng chung 1 footprint — không có khái niệm "footprint khác nhau cho local và global costmap". Hình dạng vật lý robot là một sự thật cố định, không đổi theo loại costmap (đã học ở bài Costmap) — chỉ có kích thước vùng phủ (3x3m cục bộ vs toàn bản đồ) là khác nhau giữa hai loại. Với AMR chở hàng (đã học ở bài Tính tải AMR), cần lưu ý footprint chỉ phản ánh kích thước khung robot, không tự động mở rộng theo kích thước hàng hoá đang chở — nếu hàng hoá nhô ra ngoài khung robot, cần điều chỉnh footprint tương ứng khi đang chở loại hàng đó, hoặc thiết kế cơ khí đảm bảo hàng luôn nằm gọn trong khung.
Ví dụ thực tế
So sánh footprint cho robot chữ nhật 0.4m (dài) x 0.25m (rộng):
Dùng robot_radius (phải bao trọn cả chiều dài):
robot_radius = 0.4/2 × √2 ≈ 0.28m (bán kính đường tròn ngoại tiếp)
→ khi robot xoay 45°, "vùng an toàn" tính theo hình tròn này
lớn hơn nhiều diện tích thực tế robot chiếm dụng
Dùng footprint đa giác chính xác:
footprint: "[[0.2, 0.125], [0.2, -0.125], [-0.2, -0.125], [-0.2, 0.125]]"
→ costmap phản ánh đúng 0.4m x 0.25m thực tế, không lãng phí không gian
Trong hành lang rộng 0.6m: robot_radius 0.28m coi như cần 0.56m bề rộng
tối thiểu ở MỌI hướng xoay — có thể từ chối đi qua dù thực tế đủ chỗ
khi robot giữ đúng hướng dọc theo hành lang
Lỗi thường gặp
- Dùng
robot_radiuscho robot có hình dạng dài/lệch rõ rệt — như ví dụ trên, gây lãng phí không gian đáng kể, robot từ chối đi qua không gian thực tế đủ rộng. - Đo footprint không tính các phần nhô ra (bumper, cảm biến gắn cạnh) — footprint nhỏ hơn kích thước vật lý thật, nguy cơ va chạm thực tế dù Nav2 tính toán "an toàn".
- Quên cập nhật footprint khi robot chở hàng nhô ra ngoài khung — như đã nêu ở phần Ứng dụng thực tế, footprint chỉ phản ánh khung robot, không tự động tính hàng hoá đang chở.
- Đặt
footprint_paddingquá lớn "cho chắc" — tương tự vấn đềinflation_radiusquá lớn (bài Costmap), khiến robot từ chối đi qua không gian hẹp thực tế đủ rộng để lách qua.
Kết luận
Footprint là nguồn dữ liệu gốc cho Inflation Layer tính vùng đệm an toàn — chọn đúng cách khai báo (hình tròn đơn giản hay đa giác chính xác) theo hình dạng thực tế robot, và luôn ưu tiên đo đạc chính xác thay vì "làm tròn xuống", vì footprint nhỏ hơn thực tế nguy hiểm hơn nhiều so với lớn hơn. Bài tiếp theo trong chuyên mục đi vào Tuning Costmap — hai tham số inflation_radius và cost_scaling_factor dùng chính footprint này để tính vùng chi phí.