【ROS實踐入門(八)ROS使用USB視覺傳感器相機】
本內容經官網實例以及一些參考書總結而成,歡迎留言評論交流~
聯繫方式:ziyuanw#foxmail.com(#換成@)
ROS對許多傳感器諸如:遊戲杆,遊戲手柄,IMU,激光測距儀,Kinect(RGBD)傳感器,USB視覺相機等都提供了支持,本文只探討USB相機的使用方式包括:ROS下USB相機驅動安裝, 相機節點編譯執行,單目相機標定方式。
ROS對於圖像處理和計算機視覺提供了攝像機標定過程,畸變矯正,顏色解碼,等其他一些底層操作,更加複雜的圖像處理任務可以藉助OpenCV,cv_bridge和Image_transport庫通過建立連接,訂閱和發佈圖像主題進行交互,另外還提供了物體識別,增強現實,視覺里程計等算法功能包。
一、ROS下USB相機驅動
- 準備設備:USB相機一個(某寶買一個能用即可)
- 準備ROS版本USB攝像機驅動:(建議從ROS官網給出的USB驅動源碼進行編譯安裝)
https://github.com/ros-drivers/usb_cam
因爲當我們在使用USB相機時需要對其參數進行自行修改,此時從源碼進行安裝就能夠非常方便設定,一般情況不需要對其源碼進行修改。
-
注意:下面所有步驟都是在我創建好的catkin_ws工作空間裏面進行的,usb_cam驅動下載至catkin_ws/src文件夾下。若不知道如何創建該工作空間可參考我前面的第二篇博客。
1.源碼安裝usb_cam驅動包。
//1.克隆遠程倉庫
git clone https://github.com/ros-drivers/usb_cam
//2.切換至usb_cam文件夾中
cd usb_cam/
//3.檢查所有分支
git branch -av
//4.在本地建立一個master分支並保持與遠程(remote)master倉庫分支同步(該步驟可選)
git checkout -b master origin/master
//5.檢查此時分支
git branch -av
//6.重新切換至develop分支
git checkout develop
//7.檢查此時分支
git branch -av
2.修改launch文件。(使用筆記本電腦自帶相機之外的usb相機時需要修改)
默認是第三行:"/dev/video0",我的usb相機設備號是2所以將其修改爲video2。(根據個人設備號修改,0爲電腦自帶相機設備號,外置usb相機設備號一般爲1,或2.)
或者查看設備號(把usb相機插拔前後看看哪個設備號變化了):
ls /dev/video*
查看一下usb_cam內部結構,並使用vim編輯launch文件:
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video2" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
3.usb_cam相機驅動編譯:
切換至catkin_ws工作空間,並編譯:
ziyuan@zyub:~/catkin_ws/src/usb_cam$ cd ~/catkin_ws/
ziyuan@zyub:~/catkin_ws$ catkin_make
編譯成功如下:(成功建立相機節點:usb_cam_node)
4.啓動相機節點:
(同樣,和之前博客提到的一樣,source devel/setup.bash更新一下環境配置)
- 打開第一個終端:
roscore
- CTRL+Shift+T打開第二個終端:
執行相機usb_cam-test.launch文件(不熟悉launch文件啓動方式可以參考上一篇博客):
source devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
彈出一個小窗,效果如下:
如果相機啓動時如下警告:(那是由於相機沒有進行標定,因此會出警告。)
[ INFO] [1569724530.848204371]: Unable to open camera calibration file [/home/ziyuan/.ros/camera_info/head_camera.yaml]
[ WARN] [1569724530.848223218]: Camera calibration file /home/ziyuan/.ros/camera_info/head_camera.yaml not found.
下面對其進行標定。
二、相機標定方法
在ROS中已經集成了對相機完成標定以及畸變矯正的整個流程,用起來非常方便。通常使用張正友相機標定方法,即利用平面座標的單應性關係,流程簡潔。
1.準備黑白棋盤格:
在網上可以找到黑白相機棋盤格的pdf文檔,這裏給一個Matlab官方相機標定黑白棋盤格鏈接:
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/pattern.pdf
下載之後將其打印在A3或者A4紙張上,然後量出其方格邊長即可(自己量多少就寫多少,單位換爲國際單位m)。我這裏使用的A3紙張,最終尺子量出來是0.03m,A4的是0.028m。
黑白棋盤格是由9×7的黑白格組成,但是使用時僅僅用到內部交點數即8×6的角點。
2.啓動相機:
roscore
roslaunch usb_cam usb_cam-test.launch
3.啓動標定程序:
rosrun camera_calibration cameracalibrator.py –size 8×6 –square 0.03 image:=/usb_cam/image_raw
注意標定過程中左右,上下,前後,對角方向前後傾斜標定板,這樣使得右邊X,Y,Size,Skew變成綠色後,CALIBRATE按鈕變爲藍色,然後點擊(等上半分鐘左右)變爲下面三個按鈕都可以點擊,依次點擊SAVE(保存)和COMMIT(提交)到相機配置文件中。即可將標定結果保存至本地。
點擊SAVE之後:('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
如果第三步點擊COMMIT出現:
raise ServiceException("service [%s] unavailable"%self.resolved_name)
rospy.service.ServiceException: service [/camera/set_camera_info] unavailable
那麼只能自行將標定參數移動至:~/.ros/camera_info
1.cd /tmp
2.tar -zxvf calibrationdata.tar.gz
3.將ost.yaml複製到~/.ros/camera_info
4.打開並重命名爲head_camera.yaml
camera_name:head_camera
再次打開相機節點就不會出現如下警告:
[ INFO] [1569724530.848204371]: Unable to open camera calibration file [/home/ziyuan/.ros/camera_info/head_camera.yaml]
[ WARN] [1569724530.848223218]: Camera calibration file /home/ziyuan/.ros/camera_info/head_camera.yaml not found.
至此相機使用過程以及完成,後面將會實踐ORB-SLAM的ROS版本。
上一篇:【ROS實踐入門(七)launch文件和動態參數使用】
下一篇:【ROS實踐入門(九)ROS編譯ORB-SLAM2運行】
參考資料:
【1】ROS官網
【2 】ROS上基於usb_cam相機使用: https://blog.csdn.net/pengrui18/article/details/88958487
【3】ROS機器人高效編程。