在 ROS 系統中,可使用 bag 文件來保存和恢復系統的運行狀態,好比錄製雷達和相機話題的 bag 包,而後回放用來進行聯合外參標定。算法
這裏記錄下我學習官方的 rosbag 教程的筆記:ROS rosbagshell
雖然命令不少,可是我目前在工做中經常使用的命令就以下幾個:session
錄製全部話題:工具
rosbag record -a
錄製指定話題,設置 bag 包名:學習
rosbag record -O bag_name.bag /topic1_name /topic2_name /xxx
有時候我錄製包不設置名稱,默認按照錄制結束時間命名:spa
rosbag record /topic1_name /topic2_name /xxx
我經常使用的是以暫停的方式啓動,防止跑掉數據:code
rosbag play --pause record.bag
你也能夠直接回放:教程
rosbag play record.bag
我建圖過程當中有時會設置以 0.5 倍速回放,也就是以錄製頻率的一半回放:索引
rosbag play -r 0.5 record.bag
回放完後,我通常會用 rostopic list
查看下發布的主題,確保是我須要的:rem
rostopic list
以前在咱們小車的 Intel NUC 上錄包拷到臺式機上回放會報錯,提示須要 reindex,執行一下便可,不過數據好像會少一些:
rosbag reindex xxx.bag
下面是完整的 rosbag 用法,須要的能夠查找下。
rosbag 工具能夠錄製一個包、從一個或多個包中從新發布消息、查看一個包的基本信息、檢查一個包的消息定義,基於 Python 表達式過濾一個包的消息,壓縮和解壓縮一個包以及重建一個包的索引。
rosbag 目前經常使用的命令以下(fix 和 filter 暫時沒有用到):
record
:用指定的話題錄製一個 bag 包info
:顯示一個 bag 包的基本信息,好比包含哪些話題play
:回放一個或者多個 bag 包check
:檢查一個 bag 包在當前的系統中是否能夠回放和遷移compress
:壓縮一個或多個 bag 包decompress
:解壓縮一個或多個 bag 包reindex
:從新索引一個或多個損壞 bag 包我在目前項目的使用中,用的最多的就是 record、info 以及 play 功能,先錄製想要的話題包,錄製完畢檢查下包的信息,最後再回放做爲算法的輸入,下面就詳細學習下上面命令的用法。
使用 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 顯示包文件內容的可讀摘要,包括開始和結束時間,主題及其類型,消息計數、頻率以及壓縮統計信息,常見用法以下:
顯示一個 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 讀取一個或多個 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
檢查一個 bag 在當前系統中是否能夠回放:
rosbag check xxx.bag
若是錄製的 bag 很大,咱們能夠壓縮它,默認的壓縮格式是 bz2:
rosbag compress xxx.bag
你也能夠添加 -j
手動指定壓縮格式爲 bz2:
rosbag compress -j xxx.bag
也可使用 LZ4 來壓縮數據:
rosbag compress --lz4 xxx.bag
壓縮完後,使用須要解壓縮:
rosbag decompress xxx.bag
若是回放遇到問題,提示 reindex 的話,直接執行便可,這個會自動生成一個原 bag 的備份:
rosbag reindex xxx.bag