錄製與回放數據
錄製數據(通過創建一個bag文件)
-
本小節將教你如何記錄ROS系統運行時的話題數據,記錄的話題數據將會累積保存到bag文件中。
-
首先,執行以下命令:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
- 以上操作將會啓動兩個節點——一個turtlesim可視化節點和一個turtlesim鍵盤控制節點。
- 在運行turtlesim鍵盤控制節點的終端窗口中你應該會看到如下類似信息:
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
- 這時按下鍵盤上的方向鍵應該會讓turtle運動起來。
- 需要注意的是要想控制turtle運動你必須先選中啓動turtlesim鍵盤控制節點時所在的終端窗口而不是顯示虛擬turtle所在的窗口。
錄製所有發佈的話題
- 首先讓我們來檢查看當前系統中發佈的所有話題。
- 要完成此操作請打開一個新終端並執行:
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 publisher
Subscribed topics:
* /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
* /rosout [roslib/Log] 1 subscriber
-
上面所發佈話題部分列出的話題消息是唯一可以被錄製保存到文件中的的話題消息,因爲只有消息已經發布了纔可以被錄製。/turtle1/command_velocity話題是teleop_turtle節點所發佈的命令消息並作爲turtlesim節點的輸入。
-
而/turtle1/color_sensor和/turtle1/pose是turtlesim節點發布出來的話題消息。
-
現在我們開始錄製。
-
打開一個新的終端窗口,在終端中執行以下命令:
mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a
-
在這裏我們先建立一個用於錄製的臨時目錄,然後在該目錄下運行rosbag record命令,並附加-a選項,該選項表示將當前發佈的所有話題數據都錄製保存到一個bag文件中。
-
然後回到turtle_teleop節點所在的終端窗口並控制turtle隨處移動10秒鐘左右。
-
在運行rosbag record命令的窗口中按Ctrl-C退出該命令。
-
現在檢查看~/bagfiles目錄中的內容,你應該會看到一個以年份、日期和時間命名並以.bag作爲後綴的文件。
-
這個就是bag文件,它包含rosbag record運行期間所有節點發布的話題。
檢查並回放bag文件
- 現在我們已經使用rosbag record命令錄製了一個bag文件,接下來我們可以使用rosbag info檢查看它的內容,使用rosbag play命令回放出來。
- 接下來我們首先會看到在bag文件中都錄製了哪些東西。
- 我們可以使用info命令,該命令可以檢查看bag文件中的內容而無需回放出來。
- 在bag文件所在的目錄下執行以下命令:
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命令查看到的五個已公告的話題中,其實只有其中的四個在我們錄製過程中發佈了消息。
-
因爲我們帶-a參數選項運行rosbag record命令時系統會錄製下所有節點發布的所有消息。
-
下一步是回放bag文件以再現系統運行過程。
-
首先在turtle_teleop_key節點運行時所在的終端窗口中按Ctrl+C退出該節點。
-
讓turtlesim節點繼續運行。
-
在終端中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秒)後才真正開始發佈bag文件中的內容。
-
等待一段時間的過程可以通知消息訂閱器消息已經公告了消息數據可能會馬上到來。
-
如果rosbag play在公告消息後立即發佈,訂閱器可能會接收不到幾條最先發布的消息。
-
等待時間可以通過-d選項來指定。
-
最終/turtle1/command_velocity話題將會被髮布,同時在turtuelsim虛擬畫面中turtle應該會像之前你通過turtle_teleop_key節點控制它一樣開始移動。
-
從運行rosbag play到turtle開始移動時所經歷時間應該近似等於之前在本教程開始部分運行rosbag record後到開始按下鍵盤發出控制命令時所經歷時間。
-
你可以通過-s參數選項讓rosbag play命令等待一段時間跳過bag文件初始部分後再真正開始回放。
-
最後一個可能比較有趣的參數選項是-r選項,它允許你通過設定一個參數來改變消息發佈速率。
-
如果你執行:
rosbag play -r 2 <your bagfile>
- 你應該會看到turtle的運動軌跡有點不同了,這時的軌跡應該是相當於當你以兩倍的速度通過按鍵發佈控制命令時產生的軌跡。
錄製數據子集
-
當運行一個複雜的系統時,比如PR2軟件系統,會有幾百個話題被髮布,有些話題會發布大量數據(比如包含攝像頭圖像流的話題)。
-
在這種系統中,要想把所有話題都錄製保存到硬盤上的單個bag文件中是不切實際的。
-
rosbag record命令支持只錄制某些特別指定的話題到單個bag文件中,這樣就允許用戶只錄制他們感興趣的話題。
-
如果還有turtlesim節點在運行,先退出他們,然後重新啓動(relaunch)鍵盤控制節點相關的啓動文件(launch file):
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
- 在bag文件所在目錄下執行以下命令:
rosbag record -O subset /turtle1/command_velocity /turtle1/pose
-
上述命令中的-O參數告訴rosbag record將數據記錄保存到名爲subset.bag的文件中,同時後面的話題參數告訴rosbag record只能錄製這兩個指定的話題。
-
然後通過鍵盤控制turtle隨處移動幾秒鐘,最後按Ctrl+C退出rosbag record命令。
-
現在檢查看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的移動路徑對系統定時精度的變化非常敏感。
-
rosbag受制於其本身的性能無法完全複製錄製時的系統運行行爲,rosplay也一樣。
-
對於像turtlesim這樣的節點,當處理消息的過程中系統定時發生極小變化時也會使其行爲發生微妙變化,用戶不應該期望能夠完美的模仿系統行爲。
-
現在你已經學會了如何錄製和回放數據,接下來我們開始學習如何使用 roswtf來檢查系統故障