ROS+SLAM學習日誌(3)獲取影象與視訊
在ROS中,一般會有一個節點用於展示攝像頭採集到的影象。這是一個包含複雜資料的topic,一般最好用特殊的工具來顯示與分析。因為這裡根據攝像頭裝置的不同需要不同的launch檔案來啟動攝像頭,我這裡用的是自己機器人的檔案,或者也可以用網上的例程用自己筆記本攝像頭實驗,用 rostopic hz XXX 可以看到視屏的幀率,其中XXX是topic的名稱。
圖片的獲取不能直接使用 rostopic echo XXX指令來獲取,這樣得到的圖片資訊是text格式的,顯示出來十分龐大而且我們也無法識別。我們可以用一下指令來獲取單張圖片
$ rosrun image_view image_view image: =XXX
這個image_view結點是ROS自帶用於展示主題中圖片。用這種方法我們可以看到釋出的主題中的每一張圖片,甚至還可以通過網路訪問的方式來檢視。在開啟的視窗上還可以右鍵來儲存當前幀,一般會儲存在 ./ros資料夾下。
topic與幀之間有什麼關係呢,所有的topic必須有一個幀。一個鐳射固定的位置代表機器人的base link(一般位於方向輪的中間)。如果我們用鐳射與掃描與檢測障礙物,那必須傳遞鐳射與base link的資訊。在ROS中資訊都會表上一個frame_id的標籤,不同於時間戳,它基於每一幀專屬的名字。這種型別的幀本身沒有什麼意義,我們需要對幀做轉化,才能被視覺化。
那麼要怎麼才能儲存這些資料呢,這裡有個強有力的工具可以解決這個問題。ROS可以儲存任何釋出在topic上的message。它可以建立一個bag檔案,這個檔案包含於其他節點通訊的message以及相應的時間戳。另外,這bag可以離線重現實驗,重現之前真實環境下的資訊傳遞(包括延遲)。
所有的message都有時間戳,不僅包括標頭檔案的,還有資料包內部的。不同之處在於,頭部的時間戳在訊息被記錄時才建立的,而內部的是有釋出者設定的。
資料是以二進位制格式儲存在bag檔案中的,這種方式可以是記錄更加高效。先用rosrun指令啟動一個節點,然後用以下指令來記錄bag,其中XXX為之間啟動的node通訊用的topic名稱。
$ rosbag record XXX
之後便開始記錄message,按ctrl+c可以停止記錄。如果想在節點開始時就記錄,那麼可以在launch檔案上新增如下
<node pkg="rosbag" type="record" name="bag_record"
args="/temp /accel"/>
在記錄之後可以使用 rosbag info 指令來顯示bag檔案的基本資訊
可以看出我儲存的就是攝像頭的圖片資訊,以及檔案大小,時間等資訊。還有一種辦法可以更好的看到檔案的內容,那就是使用rqt_bag這個GUI,是在命令輸入 rqt_bag即可啟動該程式,然後開啟想要檢視的bag檔案。這裡右鍵可以選擇檢視不同檔案型別。如圖
除了使用GUI工具之外,我們還可以自己從bag檔案中提取圖片,這裡需要建立launch檔案
<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>
其中/camera/image_raw可以改成自己需要獲取的topic。第一個node是將bag的內容進行回放到topic,第二個node才是從topic中提出原始資料。
當然如果儲存足夠的話可以直接從topic中提取,也就是說,第一個node就不用了。這樣在你的./ros下就可以看到圖片了,如果想自定義資料夾,那麼在執行launch檔案之間,先export ROS_HOME=XXX,XXX就是你想要的路徑。
想要直接獲取視訊可以用image_view中的video_record,直接用命令列如下
rosrun image_view video_recorder image:=/camera_node/image_raw