Rosbag
ros2 bag 可以用來記錄與回放 ROS 2 資料。本頁會介紹如何記錄、檢查與播放 Bag、如何有目的地選擇 Topic、如何透過 /clock 與 use_sim_time 使用 Simulated Time、調整 Playback Rate、儲存空間注意事項,以及安全回放已錄製 TF Data 的方式。
概述
Rosbag 是一組從一個或多個 Topic 記錄下來、帶有 Timestamp 的 Message Sequence。
透過錄製,你可以先完整記下一次實際執行,再重複回放,用於開發、除錯或展示。例如 Manipulation 中使用的 Recorded Demo,就是透過回放 /joint_states 與 /tf,而不需要實體硬體。
為什麼重要
Recorded Data 讓你在沒有連接 Live Sensor 或 Robot 的情況下,仍然可以反覆進行 Perception、Planning 或 Visualization 的開發,也能把一個可重現的場景分享給其他人。
Rosbag 同時也有一些常見風險:錄製過多資料可能快速用滿磁碟空間,而錯誤回放 TF 則可能造成斷裂或重複的 Frame Tree。可參考 TF2。
核心概念
預設儲存格式
ros2 bag record 會建立一個 Bag 目錄,而不是單一檔案。
該目錄中會包含 Metadata,以及由 rosbag2 Storage Plugin 管理的一個或多個資料檔案,例如 SQLite3 或 MCAP。
預設使用的 Storage Backend 會依 ROS 2 Distribution 與目前安裝的 rosbag2 Package 而異。請使用目前 Distribution 提供的 rosbag2 CLI 工具檢查實際設定或已安裝的 Storage Plugin,而不要直接假設一定使用某一種 Backend。
/clock 與 use_sim_time
預設情況下,Node 使用的是 System Time(Wall-clock Time)。
當系統需要使用 Simulated Time 時,例如回放 Bag,並希望所有 Node 都依照「錄製時間」而不是「目前系統時間」運作,就必須同時滿足兩個條件:
- 有來源發布
/clock,例如使用ros2 bag play --clock,或由 Simulator 發布。 - 所有需要跟隨 Simulated Time 的 Node,都必須將
use_sim_timeParameter 設為true。
如果 /clock 正在發布,但某個 Node 的 use_sim_time 為 false,該 Node 仍會繼續使用 System Time。
如果 use_sim_time 為 true,但系統中沒有 /clock Source,ROS Time 將無法正常前進,可能導致 Timer 或其他與時間相關的處理無法如預期運作。
Playback Rate
ros2 bag play 支援播放倍率調整,因此可以放慢較快的 Recording 以方便仔細觀察,也可以加速較長的 Recording:
ros2 bag play my_bag --rate 0.5 # half speed
ros2 bag play my_bag --rate 2.0 # double speed
Rate 會影響相對於 Wall-clock 的播放速度;如果其他 Node 依賴 /clock,其執行節奏也會隨 Playback Rate 一起改變。
實作步驟
1. 錄製指定 Topic
通常不建議直接錄製所有資料。優先使用明確的 Topic List,可以讓 Bag Size 更容易控制,也更容易理解實際記錄了哪些資料:
ros2 bag record -o my_bag /tutorial_chatter /tf /tf_static
-o my_bag用來指定輸出目錄名稱。如果省略,ros2 bag會自動使用帶有 Timestamp 的名稱。- 只列出實際需要的 Topic;如果後續發現缺少資料,再加入其他 Topic。
若要錄製目前所有可用 Topic,可使用:
ros2 bag record -o my_bag_all -a
這種方式適合一次性的探索性錄製,但不建議作為日常固定做法。
2. 不播放,直接檢查 Bag
ros2 bag info my_bag
這個指令會顯示 Duration、各 Topic 的 Message Count 與 Type、Storage Format,以及 Start / End Time。
在回放不熟悉的 Bag 之前,建議先執行這個指令確認內容。
3. 回放 Bag
ros2 bag play my_bag
可以搭配 Subscriber 一起觀察,例如 Publisher/Subscriber 中的 simple_subscriber,或使用:
ros2 topic echo /tutorial_chatter
4. 使用 Simulated Time 回放
ros2 bag play my_bag --clock
任何需要跟隨 Simulated Time 的 Node,都必須將 use_sim_time Parameter 設為 true。
Launch File 可以在啟動時設定這個 Parameter,也可以對正在執行中的 Node 使用:
ros2 param set <node_name> use_sim_time true
預期成果
ros2 bag info my_bag 應該會列出每一個已錄製 Topic 的 Message Type 與 Message Count。
回放期間,ros2 topic echo /tutorial_chatter(或你實際錄製的對應 Topic)應該會以指定的 Playback Rate,顯示與錄製時相同的 Message Sequence。
常用指令
ros2 bag record -o <name> <topic1> <topic2> ... # record specific topics
ros2 bag record -o <name> -a # record everything (use sparingly)
ros2 bag info <bag_path> # inspect without playing
ros2 bag play <bag_path> # play back
ros2 bag play <bag_path> --rate 0.5 # half-speed playback
ros2 bag play <bag_path> --clock # publish /clock for simulated time
ros2 bag play <bag_path> --topics /a /b # replay only a subset of recorded topics
ros2 bag play <bag_path> --loop # loop playback
儲存空間注意事項
- 高頻率 Topic,例如 Raw Camera Image 或 Point Cloud,會非常快速地增加 Bag Size;如果只需要近似資料,可以考慮錄製 Compressed 或 Downsampled Version。
- 只要是預計保留或分享的 Bag,建議使用明確的 Topic List,而不是
-a。這不僅能表示錄製意圖,也能避免不小心錄到無關且容量很大的 Topic。 - Bag Directory 可能很大,建議放在 Source Control 之外,並定期清理已不再需要的探索性 Recording。
- 如果 Disk Space 有限制,建議使用
ros2 bag record --help檢查目前 Storage Plugin 支援的 Compression Option,而不是預設全部以未壓縮方式錄製。
Playback 時的 TF
不要讓多個 Authority 同時發布相同 Transform
如果 Recorded TF 與 Live Node(例如 robot_state_publisher)產生的 Transform 有重疊,Playback 期間必須確保每一個 Child Frame 只有一個有效的 TF Authority。
如果 Bag 中已經包含 Robot 的完整 Link TF Tree,請選擇以下其中一種方式:
-
直接回放 Recorded TF — 回放已錄製的
/tf與/tf_static,不要同時使用robot_state_publisher產生相同 Robot Link 的 Transform。 -
從 Joint State 重新產生 Robot Link TF — 回放
/joint_states,並使用對應的 URDF 執行robot_state_publisher,同時避免播放會與其產生結果重疊的 Recorded Transform。
若只想回放 /joint_states,排除 Recorded TF Topic:
ros2 bag play my_bag --topics /joint_states
常見問題
- Playback 正常執行,但沒有任何 Subscriber 收到資料 — 使用
ros2 bag info確認 Bag 中的 Topic Name 是否與 Subscriber 預期一致,並確認 Playback Terminal 與 Subscriber Terminal 使用相同的ROS_DOMAIN_ID。可參考 ROS 2 Domain ID。 - Playback 時 Node 沒有使用
/clock— 可能是ros2 bag play沒有加上--clock,或接收端 Node 的use_sim_time沒有設為true。這兩個條件都必須成立。 - RViz 中 Robot Model 卡住或跳動 — 很可能是 Duplicate TF Authority 問題。檢查 Bag 與
robot_state_publisher是否同時在為相同 Robot 發布/tf,並參考上方提示。 - Bag Directory 大得異常 — 使用
-a錄製時,可能不小心包含高頻率 Image 或 Point Cloud Topic。建議改用明確 Topic List 重新錄製。 ros2 bag play回報 Unknown Storage Format — 錄製 Bag 時使用的 Storage Plugin 沒有安裝在目前的 Playback Environment。先使用ros2 bag info確認 Storage Format,再查看ros2 bag play --help所列的可用 Plugin。
重點整理
- 除非特別需要完整探索性錄製,否則應優先使用明確的 Topic List,而不是錄製全部資料。
- 在執行
ros2 bag play前先執行ros2 bag info,先了解 Bag 中實際包含哪些內容。 - 若要使用 Simulated Time,Rosbag Player 的
--clock與所有相關 Node 的use_sim_time=true兩者都必須同時設定。 - 不要在 Live
robot_state_publisher為同一個 Robot 產生相同 Transform 的同時,又回放 Recorded/tf//tf_static。
下一步
接著前往 Troubleshooting,當 Recording、Playback 或其他 ROS 2 流程沒有如預期運作時,可以依照系統化檢查流程逐步排查。