1.查看.bag中包含的信息 : rosbag info
2.0回放.bag中包含的信息: rosbag play
2.1以某一頻率發佈消息 : rosbag play -r 2
2.2從某一時間節點開始發佈消息 : rosbag play -s 2
3.1記錄所有topic信息: rosbag record -a
3.2記錄部分信息 : rosbag record -o subset /turtle1/cmd_vel /turtle1/pose
產生一個名爲subset.bag的文件。
4.將.bag記錄的圖像數據輸出爲圖片或視頻。
a.創建文件 export.luach 並寫入一下內容
<launch>
<node pkg="rosbag" type="play" name="rosbag" args="-d 2 $(find image_view)/test.bag"/>
<node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/camera/image_raw"/>
</node>
</launch>
$(find image_view)/test.bag" 其中image_view表示package名字,此處改爲你的.bag文件所處的package的名字即可,同時test改爲對應的名字。
<remap from="image" to="/camera/image_raw"/> 此處表示需將你記錄的topic名字覆蓋掉/image 這個原始的topic。
b.運行launch文件,即
roslaunch export.launch
此時數據將被分離成一組圖片,並存在“.ros”文件夾中。
c.創建文件夾 /source
將/.ros中的圖片轉移到/source中,即
mv ~/.ros/frame*.jpg source/
d.轉換視頻
cd ~/source
jpeg2yuv -I p -f 15 -j frame%04d.jpg -b 1 > tmp.yuv
//其中-f 15 表示頻率, -b 1 表示起始圖片的編號。
如果要產生.ogv文件:
ffmpeg2theora --optimize --videoquality 10 --videobitrate 16778 -o output.ogv tmp.yuv
如果要產生mpg文件:
mencoder "mf://*.jpg" -mf type=jpg:fps=15 -o output.mpg -speed 1 -ofps 30 -ovc lavc -lavcopts vcodec=mpeg2video:vbitrate=2500 -oac copy -of mpeg
在本步驟中可能會需要安裝部分package,按提示安裝即可:
sudo apt-get install packeage-name
二、用ros工具從bag文件中提取圖片
1). 首先需要安裝一些圖片處理依賴的包: MJPEG, ffmpeg
$ sudo apt-get install mjepgtools $ sudo apt-get install ffmpeg
2). 新建文件夾用於儲存提取後的圖片,並執行:
$ rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE> # <IMAGETOPICINBAGFILE>爲bag文件中儲存圖片的topic
PS:如果輸出的圖片數量與rosbag info
命令查詢得到的數量不符,可以減少_sec_per_frame參數的值。
3). 打開另一個終端,導向崗新建的文件夾,然後執行:
$ rosbag play <BAGFILE> # <BAGFILE>爲bag文件的路徑
三. 將提取的圖片轉換成視頻
PS:這部分並不涉及ros的操作,可以跳過。
這無非就是將圖片壓成視頻,可以用FFMPEG包或者Mencoder包來執行。
1). 首先決定文件的fps。用rosscore info
來確認視頻的圖片數,然後除以持續的時間即可。
# 用mencoder壓制 $ mencoder -nosound mf://*.jpg -mf w=<WIDTH>:h=<HEIGHT>:type=jpg:fps=<FPS> \ -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=<BITRATE>\ :mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o\ <OUTPUT>.avi # <WIDTH>爲圖片的寬度,<HEIGHT>爲圖片的長度。<FPS>就是每秒所需的圖片張數。<BITRATE>決定視頻的質量,越大越高,一般1800KBits以上就可以。 # 用FFMPEG壓制 $ ffmpeg -r <FPS> -b <BITRATE> -i frame%04d.jpg <OUTPUT>.avi
7. 提取bag文件中的數據並保存爲csv格式
對於非圖片數據,大部分情況下都可用csv文件存儲。從section 5中我們就可以指導用rostopic echo即可打印topic中的數據。
$ rostopic echo -b <BAGFILE> -p <TOPIC> > <output>.csv # <BAGFILE>是bag文件,<TOPIC>爲數據所在的topic
參考:
https://coderwall.com/p/qewf6g/how-to-extract-images-from-a-rosbag-file-and-convert-them-to-video
http://www.clearpathrobotics.com/guides/ros/Practical%20Example.html
http://answers.ros.org/question/9102/how-to-extract-data-from-bag