參見wiki教程
Description: 本教程將教你如何將ROS系統(tǒng)運行過程中的數據錄制到一個.bag文件中套才,然后通過回放數據來重現(xiàn)相似的運行過程。
Keywords: data, rosbag, record, play, info, bag
Tutorial Level: BEGINNER
本小節(jié)將教你如何記錄ROS系統(tǒng)運行時的話題數據,記錄的話題數據將會累積保存到bag文件中胞皱。
首先祠够,執(zhí)行以下命令:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
以上操作將會啟動兩個節(jié)點——一個turtlesim可視化節(jié)點和一個turtlesim鍵盤控制節(jié)點。在運行turtlesim鍵盤控制節(jié)點的終端窗口中你應該會看到如下類似信息:
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
這時按下鍵盤上的方向鍵應該會讓turtle運動起來牵囤。需要注意的是要想控制turtle運動你必須先選中啟動turtlesim鍵盤控制節(jié)點時所在的終端窗口而不是顯示虛擬turtle所在的窗口。
錄制所有發(fā)布的話題
首先讓我們來檢查看當前系統(tǒng)中發(fā)布的所有話題娶牌。要完成此操作請打開一個新終端并執(zhí)行:
rostopic list -v
這應該會生成以下輸出:
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
* /rosout [roslib/Log] 2 publishers
* /rosout_agg [roslib/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1
publisherSubscribed topics:
* /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
* /rosout [roslib/Log] 1 subscriber
上面所發(fā)布話題部分列出的話題消息是唯一可以被錄制保存到文件中的的話題消息奔浅,因為只有消息已經發(fā)布了才可以被錄制。/turtle1/command_velocity話題是teleop_turtle節(jié)點所發(fā)布的命令消息并作為turtlesim節(jié)點的輸入诗良。而/turtle1/color_sensor和/turtle1/pose是turtlesim節(jié)點發(fā)布出來的話題消息汹桦。
現(xiàn)在我們開始錄制。打開一個新的終端窗口鉴裹,在終端中執(zhí)行以下命令:
mkdir ~/bagfilescd ~/bagfilesrosbag record -a
在這里我們先建立一個用于錄制的臨時目錄舞骆,然后在該目錄下運行rosbag record命令,并附加-a選項径荔,該選項表示將當前發(fā)布的所有話題數據都錄制保存到一個bag文件中督禽。
然后回turtle_teleop節(jié)點所在的終端窗口并控制turtle隨處移動10秒鐘左右。
在運行rosbag record命令的窗口中按Ctrl-C退出該命令∽艽Γ現(xiàn)在檢查看~/bagfiles目錄中的內容狈惫,你應該會看到一個以年份、日期和時間命名并以.bag作為后綴的文件鹦马。這個就是bag文件胧谈,它包含rosbag record運行期間所有節(jié)點發(fā)布的話題。
檢查并回放bag文件
現(xiàn)在我們已經使用rosbag record命令錄制了一個bag文件荸频,接下來我們可以使用rosbag info檢查看它的內容菱肖,使用rosbag play命令回放出來。接下來我們首先會看到在bag文件中都錄制了哪些東西旭从。我們可以使用info命令稳强,該命令可以檢查看bag文件中的內容而無需回放出來。在bag文件所在的目錄下執(zhí)行以下命令:
rosbag info <your bagfile>
你應該會看到如下類似信息:
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
這些信息告訴你bag文件中所包含話題的名稱和悦、類型和消息數量退疫。我們可以看到,在之前使用rostopic命令查看到的五個已公告的話題中鸽素,其實只有其中的四個在我們錄制過程中發(fā)布了消息蹄咖。因為我們帶-a參數選項運行rosbag record命令時系統(tǒng)會錄制下所有節(jié)點發(fā)布的所有消息。
下一步是回放bag文件以再現(xiàn)系統(tǒng)運行過程付鹿。首先在turtle_teleop_key節(jié)點運行時所在的終端窗口中按Ctrl+C退出該節(jié)點澜汤。讓turtlesim節(jié)點繼續(xù)運行。在終端中bag文件所在目錄下運行以下命令:
rosbag play <your bagfile>
在這個窗口中你應該會立即看到如下類似信息:
Hit space to pause.
[ INFO] 1260210510.566003000: Sleeping 0.200 seconds after advertising /rosout...
[ INFO] 1260210510.766582000: Done sleeping.
[ INFO] 1260210510.872197000: Sleeping 0.200 seconds after advertising /turtle1/pose...
[ INFO] 1260210511.072384000: Done sleeping.
[ INFO] 1260210511.277391000: Sleeping 0.200 seconds after advertising /turtle1/color_sensor...
[ INFO] 1260210511.477525000: Done sleeping.
默認模式下舵匾,rosbag play命令在公告每條消息后會等待一小段時間(0.2秒)后才真正開始發(fā)布bag文件中的內容俊抵。等待一段時間的過程可以通知消息訂閱器消息已經公告了消息數據可能會馬上到來。如果rosbag play在公告消息后立即發(fā)布坐梯,訂閱器可能會接收不到幾條最先發(fā)布的消息徽诲。等待時間可以通過-d選項來指定。
最終/turtle1/command_velocity話題將會被發(fā)布吵血,同時在turtuelsim虛擬畫面中turtle應該會像之前你通過turtle_teleop_key節(jié)點控制它一樣開始移動谎替。從運行rosbag play到turtle開始移動時所經歷時間應該近似等于之前在本教程開始部分運行rosbag record后到開始按下鍵盤發(fā)出控制命令時所經歷時間。你可以通過-s參數選項讓rosbag play命令等待一段時間跳過bag文件初始部分后再真正開始回放蹋辅。最后一個可能比較有趣的參數選項是-r選項钱贯,它允許你通過設定一個參數來改變消息發(fā)布速率。如果你執(zhí)行:
rosbag play -r 2 <your bagfile>
你應該會看到turtle的運動軌跡有點不同了侦另,這時的軌跡應該是相當于當你以兩倍的速度通過按鍵發(fā)布控制命令時產生的軌跡秩命。
錄制數據子集
當運行一個復雜的系統(tǒng)時,比如PR2軟件系統(tǒng)褒傅,會有幾百個話題被發(fā)布弃锐,有些話題會發(fā)布大量數據(比如包含攝像頭圖像流的話題)。在這種系統(tǒng)中殿托,要想把所有話題都錄制保存到硬盤上的單個bag文件中是不切實際的霹菊。rosbag record命令支持只錄制某些特別指定的話題到單個bag文件中,這樣就允許用戶只錄制他們感興趣的話題支竹。
如果還有turtlesim節(jié)點在運行旋廷,先退出他們,然后重新啟動(relaunch)鍵盤控制節(jié)點相關的啟動文件(launch file):
rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key
在bag文件所在目錄下執(zhí)行以下命令:
rosbag record -O subset /turtle1/command_velocity /turtle1/pose
上述命令中的-O參數告訴rosbag record將數據記錄保存到名為subset.bag的文件中唾戚,同時后面的話題參數告訴rosbag record只能錄制這兩個指定的話題柳洋。然后通過鍵盤控制turtle隨處移動幾秒鐘,最后按Ctrl+C退出rosbag record命令叹坦。
現(xiàn)在檢查看bag文件中的內容(rosbag info subset.bag)熊镣。你應該會看到如下類似信息,里面只包含錄制時指定的話題:
bag: subset.bag
version: 1.2
start_time: 3196900000000
end_time: 3215400000000
length: 18500000000
topics:
- name: /turtle1/command_velocity
count: 8
datatype: turtlesim/Velocity
md5sum: 9d5c2dcd348ac8f76ce2a4307bd63a13 - name: /turtle1/pose
count: 1068
datatype: turtlesim/Pose
md5sum: 863b248d5016ca62ea2e895ae5265cf9
rosbag record/play 命令的局限性
在前述部分中你可能已經注意到了turtle的路徑可能并沒有完全地映射到原先通過鍵盤控制時產生的路徑上——整體形狀應該是差不多的募书,但沒有完全一樣绪囱。造成該問題的原因是turtlesim的移動路徑對系統(tǒng)定時精度的變化非常敏感。rosbag受制于其本身的性能無法完全復制錄制時的系統(tǒng)運行行為莹捡,rosplay也一樣鬼吵。對于像turtlesim這樣的節(jié)點,當處理消息的過程中系統(tǒng)定時發(fā)生極小變化時也會使其行為發(fā)生微妙變化篮赢,用戶不應該期望能夠完美的模仿系統(tǒng)行為