1. 程式人生 > >ROS總結——錄製和回放資料

ROS總結——錄製和回放資料

https://blog.csdn.net/u010510350/article/details/72457758

ROS錄製和回放資料
本部落格將總結如何通過rosbag將ROS系統執行過程中的資料錄製到一個.bag檔案中,然後通過回放資料來重現相似的執行過程。 
1. 錄製資料 
本節將記錄ROS系統執行時的話題資料,記錄的話題資料將會累積儲存到bag檔案中。 
首先,在三個不同的視窗中分別執行一下命令產生資料:

$  roscore
1
$  rosrun turtlesim turtlesim_node 
1
$  rosrun turtlesim turtle_teleop_key
1
以上操作將會啟動兩個節點——一個turtlesim視覺化節點和一個turtlesim鍵盤控制節點。在執行turtlesim鍵盤控制節點的終端視窗中,按下鍵盤上的方向可以讓turtl運動起來。 
1.1 錄製釋出的話題 
首先讓檢檢視當前系統中釋出的所有話題:

$  rostopic list -v

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 3 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber
1
2
3
4
5
6
7
8
9
10
11
12
上面所釋出話題部分列出的話題訊息是唯一可以被錄製儲存到檔案中的的話題訊息,因為只有訊息已經發布了才可以被錄製。/turtle1/cmd_vel話題是teleop_turtle節點所釋出的命令訊息並作為turtlesim節點的輸入。而/turtle1/color_sensor和/turtle1/pose是turtlesim節點發布出來的話題訊息。 
另開啟一個新視窗,執行以下命令開始錄製:

$  mkdir ~/bagfiles
$  cd ~/bagfiles
$  rosbag record -a
1
2
3
在這裡先建立一個用於錄製的臨時目錄,然後在該目錄下執行rosbag record命令,並附加-a選項,該選項表示將當前釋出的所有話題資料都錄製儲存到一個bag檔案中。然後回到turtle_teleop節點所在的終端視窗並控制turtle隨處移動10秒鐘左右。在執行rosbag record命令的視窗中按Ctrl-C退出該命令。現在檢視~/bagfiles目錄中的內容,會看到一個以年份、日期和時間命名並以.bag作為字尾的檔案。這個就是bag檔案,它包含rosbag record執行期間所有節點發布的話題。

$  cd ~/bagfiles
$  ls
2017-05-18-09-11-04.bag
1
2
3
1.2 檢查回放bag檔案 
已經使用rosbag record命令錄製了一個bag檔案,接下來可以使用rosbag info檢檢視內容,使用rosbag play命令回放出來。

$  rosbag info <your bagfile> 這裡<your bagfile>為2017-05-18-09-11-04.bag,如下:

$  rosbag info 2017-05-18-09-11-04.bag
path:        2017-05-18-09-11-04.bag
version:     2.0
duration:    38.9s
start:       May 18 2017 09:11:05.04 (1495069865.04)
end:         May 18 2017 09:11:43.92 (1495069903.92)
size:        362.6 KB
messages:    5037
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                    4 msgs    : rosgraph_msgs/Log   (2 connections)
             /turtle1/cmd_vel         210 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   2412 msgs    : turtlesim/Color    
             /turtle1/pose           2411 msgs    : turtlesim/Pose
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
這些資訊展示bag檔案中所包含話題的名稱、型別和訊息數量。 
1.3 回放bag檔案 
回放bag檔案可以再現系統執行過程。首先在turtle_teleop_key節點執行時所在的終端視窗中按Ctrl+C退出該節點。讓turtlesim節點繼續執行。在終端中bag檔案所在目錄下執行以下命令:

$  rosbag play <your bagfile> 這裡<your bagfile>為2017-05-18-09-11-04.bag,如下:
$  rosbag play 2017-05-18-09-11-04.bag

[ INFO] [1495071397.806231953]: Opening 2017-05-18-09-11-04.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [RUNNING]  Bag Time: 1495069903.888952   Duration: 38.851875 / 38.883754     
Done.
1
2
3
4
5
6
7
8
9
10
預設模式下,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 3 <your bagfile>這裡<your bagfile>為2017-05-18-09-11-04.bag,如下:
[ INFO] [1495071648.180428463]: Opening 2017-05-18-09-11-04.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [RUNNING]  Bag Time: 1495069903.889155   Duration: 38.852078 / 38.883754     
Done.
1
2
3
4
5
6
7
8
將會看到turtle的運動軌跡有點不同了,這時的軌跡應該是相當於當以三倍的速度通過按鍵釋出控制命令時產生的軌跡。

2. 錄製資料子集 
當執行一個複雜的系統時,會有幾百個話題被髮布,有些話題會發布大量資料(比如包含攝像頭影象流的話題)。在這種系統中,要想把所有話題都錄製儲存到硬碟上的單個bag檔案中是不切實際的。rosbag record命令支援只錄制某些特別指定的話題到單個bag檔案中,這樣就允許使用者只錄制感興趣的話題。 
如果還有turtlesim節點在執行,先退出,然後重新啟動(relaunch)鍵盤控制節點相關的啟動檔案(launch file):

$  rosrun turtlesim turtlesim_node 
1
$  rosrun turtlesim turtle_teleop_key
1
在bag檔案所在目錄下執行以下命令:

$  cd bagfiles/
$  rosbag record -O subset /turtle1/command_velocity /turtle1/pose
1
2
上述命令中-O引數告訴rosbag record將資料記錄儲存到名為subset.bag的檔案中,同時後面的話題引數告訴rosbag record只能錄製這兩個指定的話題。然後通過鍵盤控制turtle隨處移動幾秒鐘,最後按Ctrl+C退出rosbag record命令。 
檢檢視bag檔案中的內容:

$  rosbag info subset.bag
path:        subset.bag
version:     2.0
duration:    35.2s
start:       May 18 2017 09:47:21.16 (1495072041.16)
end:         May 18 2017 09:47:56.31 (1495072076.31)
size:        172.2 KB
messages:    2198
compression: none [1/1 chunks]
types:       turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/pose   2198 msgs    : turtlesim/Pose
1
2
3
4
5
6
7
8
9
10
11
3. rosbag record/play 命令的侷限性 
在前面實驗過程會發現turtle的路徑可能並沒有完全地對映到原先通過鍵盤控制時產生的路徑上(整體形狀應該是差不多的,但沒有完全一樣)。造成該問題的原因是turtlesim的移動路徑對系統定時精度的變化非常敏感。rosbag受制於其本身的效能無法完全複製錄製時的系統執行行為,rosplay也一樣。對於像turtlesim這樣的節點,當處理訊息的過程中系統定時發生極小變化時也會使其行為發生微妙變化,使用者不應該期望能夠完美的模仿系統行為。 
現到這裡ROS的入門基本已經總結完,接下來總結學習一下如何使用 roswtf來檢查系統故障。