跳至主要内容

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 都依照「錄製時間」而不是「目前系統時間」運作,就必須同時滿足兩個條件:

  1. 有來源發布 /clock,例如使用 ros2 bag play --clock,或由 Simulator 發布。
  2. 所有需要跟隨 Simulated Time 的 Node,都必須將 use_sim_time Parameter 設為 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 流程沒有如預期運作時,可以依照系統化檢查流程逐步排查。