ROS 中 rosbag 相關命令介紹


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 重新索引一個或多個包文件。

與例子無關的題外話

回放數據包時,如果想用 Rviz 可視化數據, 可能會遇到時間不匹配的問題,出現如下錯誤信息:
... Message removed because it is too old (frame=..., stamp=...)
這是由於 ROS tf 的發布時間晚於 topic 的時間,Rviz 在做 msg 的 tf 變換時,默認把過時的 msg 丟掉。為了解決這一問題,可以讓系統以 msg 對應的 simulated time 運行,而不是實際的 wall-clock time. 步驟如下:
1.啟動 ROS master
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.

  1. 進行其他操作,例如 launch tf 文件,啟動 Rviz 等
  2. 回放 rosbag 並發布 simulated time
rosbag play --clock <bagfile>

 



作者:isl_qdu
鏈接:https://www.jianshu.com/p/6dd2c08d688e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


作者:isl_qdu
鏈接:https://www.jianshu.com/p/6dd2c08d688e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM