ros2 bag — ghi lại và phát lại dữ liệu robot
Atlasbot · 17/8/2026 · 11 phút đọc
Một lỗi SLAM chỉ xuất hiện khi robot đi qua đúng một góc hành lang cụ thể ngoài thực địa — quay lại hiện trường để tái hiện lỗi mỗi lần debug là không thực tế. ros2 bag ghi lại toàn bộ dữ liệu topic (LiDAR, odometry, TF...) của lần chạy đó thành file, sau này phát lại y hệt ngay tại bàn làm việc, bao nhiêu lần cũng được.
Khái niệm chính
ros2 bag record -o test_hanh_lang /scan /odom /tf /tf_static
-o test_hanh_lang đặt tên thư mục output. Chỉ nên ghi đúng những topic cần debug — ghi -a (tất cả topic) dễ tạo file khổng lồ không cần thiết nếu hệ thống có topic ảnh/video nặng.
ros2 bag play test_hanh_lang
Lệnh này phát lại đúng dữ liệu đã ghi, publish lại lên đúng các topic gốc theo đúng timing đã ghi — với các node đang subscribe (ví dụ slam_toolbox), dữ liệu bag trông y hệt dữ liệu robot thật đang chạy, không cần biết nguồn là bag hay robot.
Tóm lại:
ros2 bagbiến một lỗi khó tái hiện ngoài thực địa thành một file có thể phát lại vô hạn lần ở bàn làm việc — đây là công cụ quan trọng nhất để debug SLAM/Nav2 một cách có hệ thống.
Nguyên lý hoạt động
Xem thông tin bag đã ghi:
ros2 bag info test_hanh_lang
Files: test_hanh_lang_0.db3
Duration: 47.3s
Messages: 14208
Topic information:
/scan : 473 msgs @ 10.0 Hz
/odom : 4730 msgs @ 100.0 Hz
/tf : 9005 msgs
Đọc nhanh: nếu /scan chỉ ghi được 5Hz thay vì tần số LiDAR thực tế 10Hz, khả năng cao là chính lúc ghi bag máy đã quá tải (CPU không đọc kịp), một manh mối quan trọng cần biết trước khi kết luận bug nằm ở thuật toán SLAM.
Phát lại chậm hoặc lặp để debug kỹ:
ros2 bag play test_hanh_lang --rate 0.5 # phát chậm một nửa tốc độ
ros2 bag play test_hanh_lang --loop # lặp lại liên tục
Kiến thức kỹ thuật
Công thức
Dung lượng file bag ước lượng bằng đúng công thức băng thông đã học ở bài Topic, nhân với thời lượng ghi:
Dung lượng bag ≈ Σ (băng thông mỗi topic) × thời lượng ghi
VD: ghi /scan (~60KB/s, đã tính ở bài Topic) + /odom (nhỏ, ~5KB/s) trong 5 phút (300s)
Dung lượng ≈ (60 + 5) × 300 ≈ 19.500 KB ≈ ~19MB
Nếu thêm topic camera (VD: ~2MB/s không nén) trong cùng 5 phút:
Dung lượng thêm ≈ 2000 × 300 = 600.000 KB ≈ ~600MB
Chênh lệch rất lớn giữa có/không có topic ảnh giải thích trực tiếp lời khuyên "chỉ ghi đúng topic cần thiết" đã nói ở phần Khái niệm chính.
Thông số
| Thông số | Giá trị |
|---|---|
| Định dạng lưu trữ mặc định | SQLite3 (.db3) |
| Định dạng thay thế (hiệu năng cao hơn, phổ biến ở distro mới) | MCAP |
| Cờ ghi mọi topic | -a (tránh dùng nếu có topic ảnh/point cloud nặng) |
Ứng dụng thực tế
Ngoài việc tái hiện lỗi, ros2 bag còn là công cụ chuẩn để so sánh công bằng nhiều cấu hình SLAM khác nhau: ghi 1 lần dữ liệu thực địa, sau đó chạy thử nhiều bộ tham số SLAM Toolbox/Cartographer khác nhau trên đúng cùng 1 bag — đảm bảo mọi lần so sánh đều dùng chung 1 nguồn dữ liệu đầu vào giống hệt nhau, loại bỏ hoàn toàn yếu tố nhiễu do chạy robot thật nhiều lần không bao giờ đi đúng 100% cùng 1 quỹ đạo. Đây là cách tiếp cận benchmark chuẩn khi cần đánh giá khách quan thuật toán nào cho kết quả bản đồ tốt hơn.
Ví dụ thực tế
$ ros2 bag record -o test_hanh_lang /scan /odom /tf /tf_static --max-bag-size 500000000
Output:
[INFO] [rosbag2_recorder]: Recording...
[INFO] [rosbag2_recorder]: Subscribed to topic '/scan'
[INFO] [rosbag2_recorder]: Subscribed to topic '/odom'
[INFO] [rosbag2_recorder]: Subscribed to topic '/tf'
[INFO] [rosbag2_recorder]: Subscribed to topic '/tf_static'
--max-bag-size 500000000 (byte, ~500MB) tự động chia file bag thành nhiều phần khi vượt ngưỡng — hữu ích cho phiên ghi dài để tránh 1 file duy nhất quá lớn khó xử lý hoặc dễ hỏng nếu quá trình ghi bị ngắt giữa chừng.
Lỗi thường gặp
- Ghi
-avới topic ảnh/point cloud nặng làm đầy ổ đĩa nhanh — như tính toán ở mục Công thức, chênh lệch dung lượng giữa có/không topic ảnh rất lớn — luôn chọn lọc đúng topic cần thiết, đặc biệt khi ghi trong thời gian dài. - Quên ghi
/tf_statickhi ghi bag — dữ liệu transform tĩnh (vị trí lắp cảm biến, đã học ở bài TF2) chỉ publish 1 lần lúc khởi động — nếu bắt đầu ghi bag sau thời điểm đó mà không ghi riêng/tf_static, phát lại bag sẽ thiếu các transform quan trọng này, gây lỗi lookup TF khi debug. - Phát lại bag trong khi node thật vẫn đang publish cùng topic — 2 nguồn dữ liệu (bag + robot thật) cùng gửi vào 1 topic gây dữ liệu trộn lẫn khó hiểu — luôn tắt driver thật (hoặc dùng namespace/remap riêng) trước khi phát bag để debug.
- Không đồng bộ
use_sim_timekhi phát lại bag cho node cần thời gian mô phỏng — một số node (đặc biệt trong Nav2/SLAM) cần biết đang chạy với "thời gian giả" từ bag thay vì đồng hồ hệ thống thật — quên bậtuse_sim_timekhiến timestamp không khớp, gây lỗi TF ngoại suy tương tự đã nói ở bài TF2.
Kết luận
ros2 bag chuyển đổi một lỗi khó tái hiện ngoài thực địa thành dữ liệu có thể phát lại nhiều lần, đồng thời là công cụ chuẩn để benchmark công bằng nhiều cấu hình thuật toán trên cùng 1 bộ dữ liệu. Luôn chọn lọc đúng topic cần ghi và nhớ /tf_static để tránh thiếu dữ liệu khi phát lại. Bài tiếp theo trong chuyên mục, cũng là bài cuối, nói về RViz2 — công cụ trực quan hoá dữ liệu robot, thường dùng song song với bag để "nhìn thấy" chứ không chỉ đọc số liệu thô.