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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。