1. 程式人生 > >rosbag 記錄topic 資料,錄製子topic 資料

rosbag 記錄topic 資料,錄製子topic 資料

轉:https://www.jianshu.com/p/3599d2782683

這個教程要學習的是怎麼從一個執行的ROS系統中記錄一些資料存放在.bag檔案中,之後再回放這些資料製造一個相似的行為

1 記錄資料(建立一個bag檔案)

這一節會講怎麼從一個執行的ROS系統中記錄topic的資料。topic的資料會被累計儲存在一個bag檔案中。
首先,執行以下三條命令:

roscore
rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

這就是之前的小海龜和鍵盤控制的兩個node。

1.1 記錄所有釋出的topic

首先讓我們列舉出所有正在被髮布訊息的topic,開啟一個新視窗,輸入:
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

列表中,只有publish topic才能被記錄下來,換句話說,只有推送的message才能被記錄。topic /turtle1/cmd_vel 是teleop_turtle 推送的命令訊息,作為turtlesim 程序的輸入,messages /turtle1/color_sensor 和 /turtle1/pose 是輸出。
現在我們就要記錄推送資料了,開啟一個新視窗執行以下指令:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a

這裡我們建立了一個臨時資料夾去記錄資料,然後執行rosbag record ,並加上a選項,指定將所有釋出的topic資料都累加記錄下來。
回到 turtle_teleop 視窗並執行小海龜10秒左右。
然後在執行rosbag的視窗Ctrl+C退出,接下來就要測試紀錄的資料了。

2 檢查並播放bag檔案

我們可以通過rosbag info指令檢視bag檔案的內容,在bag檔案所在的目錄執行以下指令:
rosbag info <your bagfile>
bag檔案的名稱是由時間、字尾等內容組成的,如:
2017-03-12-10-28-01.bag
所以我應該執行:
rosbag info 2017-03-12-10-28-01.bag
然後會看到這個:

path:        2017-03-12-10-28-01.bag
version:     2.0
duration:    12:30s (750s)
start:       Mar 12 2017 10:28:01.76 (1489285681.76)
end:         Mar 12 2017 10:40:32.22 (1489286432.22)
size:        6.2 MB
messages:    93626
compression: none [7/7 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          122 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   46750 msgs    : turtlesim/Color    
             /turtle1/pose           46750 msgs    : turtlesim/Pose

這個會告訴我們topic的名字,型別,以及儲存在這裡的每個message topic的數目。
接下來我們就要回放記錄了。首先關掉之前讀取鍵盤的那個視窗,保留小海龜。
在新視窗中執行:
rosbag play <your bagfile>
後面這個還是要填你的檔名,比如我的是這樣的:

[email protected]:~/bagfiles$ rosbag play 2017-03-12-10-28-01.bag
[ INFO] [1489299953.329543310]: Opening 2017-03-12-10-28-01.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.
 [PAUSED]   Bag Time: 1489285990.443460   Duration: 308.684625 / 750.462410     
^C

中間按了空格鍵,它顯示了暫停,s表示一步一步執行。需要注意的是,可能你無法觀察到小海龜的運動,因為在看前面的教程時,你輸入了記錄的命令之後,它就開始記錄了,直到你按了鍵盤小烏龜才開始運動,前面這段時間小海龜是不動的,建議再重新做一次觀察。
其實如果一開始紀錄的內容就包含了讓小海龜執行的指令,而小海龜還沒開啟,那很可能就會錯過一些。這個時候可以使用-d選項讓重放延時一定時間。
如果你不想再來一遍,可以使用-s讓它從某個時間點開始。如果你不知道大概要多久,你可以試一下-r,就是rate,可以加快速度播放:
rosbag play -r 2 <your bagfile>
這樣的話速度會變快兩倍,速度太快可能會出現軌跡都發生了變化。

3 記錄一個數據的子集

當我們執行一個很複雜的系統時,把所有topic的資料存下來是不切實際的,比如攝像頭,可能會產生大量的資料。我們可以有選擇的儲存我們感興趣的topic資料。
首先如果小海龜和鍵盤檢測都關掉了,重新開啟他們:

rosrun turtlesim turtlesim_node 
rosrun turtlesim turtle_teleop_key

在你的bag檔案所在目錄,執行下面的指令:
rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
這個-O高速rosbag record記錄到subset.bag裡面,後面的引數是讓其值記錄這些主題的資料。現在使用鍵盤讓小海龜運動幾秒鐘,然後Ctrl+C停止記錄。
現在看一下剛剛記錄的bag的內容:
rosbag info subset.bag
你會看到如下內容,只記錄了兩個topic的內容。

path:        subset.bag
version:     2.0
duration:    22.8s
start:       Mar 12 2017 15:48:31.14 (1489304911.14)
end:         Mar 12 2017 15:48:53.97 (1489304933.97)
size:        119.6 KB
messages:    1470
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel     42 msgs    : geometry_msgs/Twist
             /turtle1/pose      1428 msgs    : turtlesim/Pose

可以再播放一下:
rosbag play subset.bag

4 rosbag record/play的侷限性

在前面我們也看到了,如果加速播放,小海龜的路徑都會出現問題。因為這個只是簡單的對資料的記錄和回放,如果節奏發生改變,很可能會引起接收端的一些錯誤,它並沒有與接收方進行任何的互動。就像是你說話的錄音,這個錄音雖然可以向別人傳遞訊息,但是至於那個人聽到了什麼它是不管的。所以有可能復現不出原來的行為。



作者:Savior2016
連結:https://www.jianshu.com/p/3599d2782683
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。