rosbag 既可以指命令行中數據包相關命令,也可以指 c++/python 的 rosbag 庫。這里的 rosbag 是指前者。
rosbag 主要用於記錄、回放、分析 rostopic 中的數據。它可以將指定 rostopic 中的數據記錄到 .bag
后綴的數據包中,便於對其中的數據進行離線分析和處理。
對於 subscribe 某個 topic 的節點來說,它無法區分這個 topic 中的數據到底是實時獲取的數據還是從 rosbag 中回放的數據。這就有助於我們基於離線數據快速重現曾經的實際場景,進行可重復、低成本的分析和調試。
本文以簡單的 turtlesim 為例,介紹如何用 rosbag 相關命令記錄和回放 rostopic 。
錄制數據
啟動與 turtlesim 相關的兩個 ros node
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
前者打開 turtle simulation 的平面仿真環境,后者是一個鍵盤操作節點。
在開始記錄 rostopic 之前,放了方便起見,先創建一個專門的文件夾,存放數據包
mkdir ~/bagfiles
然后進入該文件夾,開始錄制數據包:
cd ~/bagfiles
rosbag record -a
其中-a
選項表示將當前發布的所有 topic 數據都錄制保存到一個 rosbag 文件中。
也可以只記錄某些感興趣的 topic,命令如下:
rosbag record /topic_name1 /topic_name2 /topic_name3
上述命令錄制的數據包名字為日期加時間。如果要指定生成數據包的名字,則用-O /-o
參數,如下:
rosbag record -O filename.bag /topic_name1
其中 -O
(大寫的 O) 后跟錄制數據包的名字。如果用 -o
(小寫的 o),則只是給數據包的名字加前綴。
如果在 launch 文件中使用 rosbag record 命令,如下
<node pkg="rosbag" type="record" name="bag_record" args="/topic1 /topic2"/>
默認存放路徑是 ~/.ros 中。
上邊命令開啟了數據記錄,然后回到turtle_teleop
節點所在的終端窗口,控制 turtle 隨處移動10秒鍾左右。
在運行rosbag record
命令的窗口中按Ctrl-C
退出該命令,即結束數據記錄。
現在在~/bagfiles
目錄中應該會看到一個以日期和時間命名並以.bag
作為后綴的 rosbag 文件,它包含rosbag record
運行期間發布的 topic。
檢查和回放
rosbag info
指令可以顯示數據包中的信息:
rosbag info filename.bag
bag: 2009-12-04-15-02-56.bag version: 1.2 start_time: 1259967777871383000 end_time: 1259967797238692999 length: 19367309999 topics: - name: /rosout count: 2 datatype: roslib/Log md5sum: acffd30cd6b6de30f120938c17c593fb - name: /turtle1/color_sensor count: 1122 datatype: turtlesim/Color md5sum: 353891e354491c51aabe32df673fb446 - name: /turtle1/command_velocity count: 23 datatype: turtlesim/Velocity md5sum: 9d5c2dcd348ac8f76ce2a4307bd63a13 - name: /turtle1/pose count: 1121 datatype: turtlesim/Pose md5sum: 863b248d5016ca62ea2e895ae5265cf9
這些信息包括 topic 的名稱、類型和 message 數量。
接下來回放數據包中的 topic。
首先在turtle_teleop_key
所在的終端窗口中按Ctrl+C
退出該鍵盤控制節點。保留turtlesim
節點繼續運行。在終端中bag
文件所在目錄下運行以下命令:
rosbag play <bagfile>
就能夠回放出 bag 中包含的 topic 內容了。
如果想改變消息的發布速率,可以用下面的命令
rosbag play -r 2 <bagfile>
這時的軌跡相當於以兩倍的速度通過按鍵發布控制命令時產生的軌跡。 -r
后面的數字對應播放速率。
如果希望 rosbag 循環播放,可以用命令
rosbag play -l <bagfile> # -l == --loop
如果只播放感興趣的 topic ,則用命令
rosbag play <bagfile> --topic /topic1
在上述播放命令執行期間,空格鍵可以暫停播放。
rosbag的命令
rosbag 常用命令列表如下:
命令 | 作用 |
---|---|
check | 確定一個包是否可以在當前系統中進行,或者是否可以遷移。 |
decompress | 壓縮一個或多個包文件。 |
filter | 解壓一個或多個包文件。 |
fix | 在包文件中修復消息,以便在當前系統中播放。 |
help | 獲取相關命令指示幫助信息 |
info | 總結一個或多個包文件的內容。 |
play | 以一種時間同步的方式回放一個或多個包文件的內容。 |
record | 用指定主題的內容記錄一個包文件。 |
reindex | 重新索引一個或多個包文件。 |
與例子無關的題外話
... Message removed because it is too old (frame=..., stamp=...)
roscore
2.指定系統以 simulated time 運行
rosparam set /use_sim_time true
官方的解釋如下:
This basically tells nodes on startup to use simulated time (ticked here by rosbag) instead of wall-clock time (as in a live system). It avoids confusing time-dependent components like tf, which otherwise would wonder why messages are arriving with timestamps far in the past.
- 進行其他操作,例如 launch tf 文件,啟動 Rviz 等
- 回放 rosbag 並發布 simulated time
rosbag play --clock <bagfile>
作者:isl_qdu
鏈接:https://www.jianshu.com/p/6dd2c08d688e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:isl_qdu
鏈接:https://www.jianshu.com/p/6dd2c08d688e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。