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:/rosout
和rosout_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