1. 程式人生 > >ROS學習筆記21(錄製與回放資料)

ROS學習筆記21(錄製與回放資料)

1 錄製資料(通過建立一個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所在的視窗。

1.1 錄製所有釋出的話題

首先讓我們來檢檢視當前系統中釋出的所有話題。要完成此操作請開啟一個新終端並執行:

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執行期間所有節點發布的話題。

2 檢查並回放bag檔案ros

現在我們已經使用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的運動軌跡有點不同了,這時的軌跡應該是相當於當你以兩倍的速度通過按鍵釋出控制命令時產生的軌跡。

3 錄製資料子集

當執行一個複雜的系統時,比如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)。你應該會看到如下類似資訊,裡面只包含錄ro制時指定的話題:

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

4 rosbag record/play 命令的侷限性

在前述部分中你可能已經注意到了turtle的路徑可能並沒有完全地對映到原先通過鍵盤控制時產生的路徑上——整體形狀應該是差不多的,但沒有完全一樣。造成該問題的原因是turtlesim的移動路徑對系統定時精度的變化非常敏感。rosbag受制於其本身的效能無法完全複製錄製時的系統執行行為,rosplay也一樣。對於像turtlesim這樣的節點,當處理訊息的過程中系統定時發生極小變化時也會使其行為發生微妙變化,使用者不應該期望能夠完美的模仿系統行為。

現在你已經學會了如何錄製和回放資料,接下來我們開始學習如何使用 roswtf來檢查系統故障