在 ROS 系統中,可以使用 bag 文件來保存和恢復系統的運行狀態,比如錄製雷達和相機話題的 bag 包,然後回放用來進行聯合外參標定。
這裏記錄下我學習官方的 rosbag 教程的筆記:ROS rosbag
我常用的幾個操作
雖然命令很多,但是我目前在工作中常用的命令就如下幾個:
1. 錄包
錄製所有話題:
rosbag record -a
錄製指定話題,設置 bag 包名:
rosbag record -O bag_name.bag /topic1_name /topic2_name /xxx
有時候我錄製包不設置名稱,默認按照錄制結束時間命名:
rosbag record /topic1_name /topic2_name /xxx
2. 回放
我常用的是以暫停的方式啓動,防止跑掉數據:
rosbag play --pause record.bag
你也可以直接回放:
rosbag play record.bag
我建圖過程中有時會設置以 0.5 倍速回放,也就是以錄製頻率的一半回放:
rosbag play -r 0.5 record.bag
回放完後,我一般會用 rostopic list
查看下發布的主題,確保是我需要的:
rostopic list
3. 修復
之前在我們小車的 Intel NUC 上錄包拷到臺式機上回放會報錯,提示需要 reindex,執行一下即可,不過數據好像會少一些:
rosbag reindex xxx.bag
下面是完整的 rosbag 用法,需要的可以查找下。
一、rosbag 基本作用
rosbag 工具可以錄製一個包、從一個或多個包中重新發布消息、查看一個包的基本信息、檢查一個包的消息定義,基於 Python 表達式過濾一個包的消息,壓縮和解壓縮一個包以及重建一個包的索引。
rosbag 目前常用的命令如下(fix 和 filter 暫時沒有用到):
record
:用指定的話題錄製一個 bag 包info
:顯示一個 bag 包的基本信息,比如包含哪些話題play
:回放一個或者多個 bag 包check
:檢查一個 bag 包在當前的系統中是否可以回放和遷移compress
:壓縮一個或多個 bag 包decompress
:解壓縮一個或多個 bag 包reindex
:重新索引一個或多個損壞 bag 包
我在目前項目的使用中,用的最多的就是 record、info 以及 play 功能,先錄製想要的話題包,錄製完畢檢查下包的信息,最後再回放作爲算法的輸入,下面就詳細學習下上面命令的用法。
二、rosbag record
使用 record 訂閱指定主題並生成一個 bag 文件,其中包含有關這些主題的所有消息,常見用法如下。
用指定的話題 topic_names 來錄製 bag 包:
rosbag record <topic_names>
比如錄製 rosout
、tf
、cmd_vel
3 個話題,錄製的 bag 包以時間命名:
rosbag recoed rosout tf cmd_vel
錄製完保存 bag 包名稱爲 session1 + 時間戳.bag
格式:
rosbag record -o session1 /chatter
錄製完保存爲指定文件名 session2_090210.bag
:
rosbag record -O session2_090210.bag /chatter
錄製系統中所有的話題:
rosbag record -a
使用 -h
查看 record 使用方法,很多命令都可以用這個:
rosbag record -h
三、rosbag info
rosbag info 顯示包文件內容的可讀摘要,包括開始和結束時間,主題及其類型,消息計數、頻率以及壓縮統計信息,常見用法如下:
顯示一個 bag 包的信息:
rosbag info name.bag
$ rosbag info foo.bag
path: foo.bag
version: 2.0
duration: 1.2s
start: Jun 17 2010 14:24:58.83 (1276809898.83)
end: Jun 17 2010 14:25:00.01 (1276809900.01)
size: 14.2 KB
messages: 119
compression: none [1/1 chunks]
types: geometry_msgs/Point [4a842b65f413084dc2b10fb484ea7f17]
topics: /points 119 msgs @ 100.0 Hz : geometry_msgs/Point
查看常用命令:
rosbag info -h
輸出 YAML 格式的信息:
rosbag info -y name.bag
輸出 bag 中指定域的信息,比如只顯示持續時間:
rosbag info -y -k duration name.bag
四、rosbag play
rosbag play 讀取一個或多個 bag 文件的內容,並以時間同步的方式回放,時間同步基於接收消息的全局時間。回放開始後,會根據相對偏移時間發佈消息。
如果同時回放兩個單獨的 bag 文件,則根據時間戳的間隔來播放。比如我先錄製一個 bag1 包,等待一個小時,然後錄製另一個 bag2 包,那我在一起回放 bag1 和 bag2 時,在回放的中間會有 1 個小時的停滯期,也就是先回放 bag1,然後需要等待 1 個小時才能回放 bag2。
在回放過程中按空格暫停,常見用法如下,回放單個 bag:
rosbag play record.bag
回放多個 bag,基於全局時間間隔播放:
rosbag play record1.bag record2.bag
開始播放立刻暫停,按空格繼續:
rosbag play --pause record.bag
以錄製的一半頻率回放:
rosbag play -r 0.5 --pause record.bag
指定回放頻率,默認 100HZ:
rosbag play --clock --hz=200 record.bag
循環播放:
rosbag play -l record.bag
五、rosbag check
檢查一個 bag 在當前系統中是否可以回放:
rosbag check xxx.bag
六、rosbag compress
如果錄製的 bag 很大,我們可以壓縮它,默認的壓縮格式是 bz2:
rosbag compress xxx.bag
你也可以添加 -j
手動指定壓縮格式爲 bz2:
rosbag compress -j xxx.bag
也可以使用 LZ4 來壓縮數據:
rosbag compress --lz4 xxx.bag
七、rosbag decompress
壓縮完後,使用需要解壓縮:
rosbag decompress xxx.bag
八、rosbag reindex
如果回放遇到問題,提示 reindex 的話,直接執行即可,這個會自動生成一個原 bag 的備份:
rosbag reindex xxx.bag