利用ROS工具從bag文件中提取圖片


bag文件是ROS常用的數據存儲格式,因此要從bag文件中提取數據就需要了解一點ROS的背景知識。

1. 什么是ROS及其優勢

ROS全稱Robot Operating System,是BSD-licensed系統用於從PC上控制機器人組件。ROS系統由一系列的獨立node組成,彼此間通過publish/subscribe消息傳遞模式相互溝通。比如某個傳感器驅動由某個node執行,將該傳感器數據用message stream的形式publish,而這些message則可以在數據處理或者日志節點被使用。

因為ROS的node不需要一定在相同的系統或構架上,也就是說不同的node可以部署到不同平台的機器上(比如傳感器publish數據,PC處理數據,Android智能機執行操作),故ROS非常靈活可以適應各種需求。還有一個原因就是ROS是開源的,可以免費使用和修改。

2. ROS的結構

下圖舉了一個ROS系統的結構:

ROS從ROS master開始,任何node都需要在master進行注冊,從而方便node之間進行消息傳遞。這里,camera node與相機進行交流,publish名為/image_data的主題,其他節點都subscribe這個主題用於獲取消息;而機器人上面的計算機有一個processing node對subscribe的圖像數據進行處理;而在另一台PC上,有一個image display node對subscribe的數據進行展示。

3. ROS工具的安裝

目前ros工具提供c++和python兩種API,而正式支持的操作系統只有Ubuntu和Debian(linux大發好,退win保平安)。
1). 設置sources.list
允許本機接受來自packages.ros.org的包,ros kenetic值支持Ubuntu 15.10和16.04以及Debian 8。

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

2). 設置key

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

3). 安裝

$ sudo apt-get update
# 由於ros有許多庫和工具可供選擇,一般默認選這個版本:Desktop-Full Install: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception
$ sudo apt-get install ros-kinetic-desktop-full

4).初始化rosdep
在使用ros之前需要初始化rosdep,rosdep可以使安裝編譯源所依賴的包變得很方便,也是一些ROS運行一些核心組件所需的。

$ sudo rosdep init
$ rosdep update

5).環境設置
將ROS環境變量添加到環境變量中

# 將命令添加到~/.bashrc文件中可以使每次啟動新的session都加載ros變量,非常方便
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

6).安裝rosinstall
rosinstall 是在ROS中經常用到的命令行工具。

$ sudo apt-get install python-rosinstall

7).測試安裝
在終端中輸入rosbag/rostopic --help等命令看是否報錯

4. ROS工具使用實例

1). 啟動ROS master
只有在啟動master之后才能開始ros的其他操作,而由於roscore一直運行,所以執行其他ros命令時需要在另一個終端中進行。

$ roscore

2). rostopic命令
a. 查看當前master下的topic

$ rostopic list # 列出topic名稱,具體可用其他rostopic命令進行查看等操作。

PS:在開始的時候都會有以下兩個topic:/rosoutrosout_agg。前者用於報道系統的debug消息后者用於整合debug消息。
b. 發布新的topic

$ rostopic pub /hello std_msgs/String “Hello Robot" # /hello 是新的topic名稱;后者為topic的類型;最后引號內的"Hello Robot"是具體的消息數據。

c. 輸出topic中的數據

$ rostopic echo /hello

d. 查看topic中的數據

$ rostopic info /hello

3).查看正在發布消息的node

$ rosnode list

4).查看node的具體信息

$ rosnode info /rostopic_.... # ...為數字

5. 用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文件的路徑

6. 將提取的圖片轉換成視頻

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

參考:

  1. http://wiki.ros.org/ROS/Tutorials
  2. https://coderwall.com/p/qewf6g/how-to-extract-images-from-a-rosbag-file-and-convert-them-to-video
  3. http://www.clearpathrobotics.com/guides/ros/Practical Example.html
  4. http://answers.ros.org/question/9102/how-to-extract-data-from-bag/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM