一、参考资料
ROS学习——利用电脑相机标定
二、安装usb_cam驱动包
usb_cam - ROS Wiki
GitHub - ros-drivers/usb_cam: A ROS Driver for V4L USB Cameras
usb_cam包用于读取图像。
1. 源码安装usb_cam
usb_cam用于实时SLAM,配合ROS平台使用。
1.1 下载usb_cam源码
cd catkin_ws/src
git clone https://github.com/ros-drivers/usb_cam.git
或者
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make
source ~/catkin-ws/devel/setup.bash
1.2 编译安装usb_cam
cd usb_cam
mkdir build
cd build
cmake ..
make
2. apt安装usb_cam
安装相机标定包camera_calibration
,把kinetic改成自己的ros版本。
sudo apt-get install ros-kinetic-usb-cam
安装好 usb_cam
包后,在 /opt/ros/kinetic/share/usb_cam/launch
中会存在 usb_cam-test.launch
文件,在该文件中启动两个ROS节点,usb_cam_node
和 image_view
。
3. usb_cam-test.launch
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<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>
参数解释
-
/dev/video0
是默认摄像头的编号,可以根据具体情况更改。查看摄像头的指令:
ls /dev/video*
。
2. 启动usb_cam相机驱动节点
rosrun usb_cam usb_cam_node
4. 启动相机
运行usb_cam中的launch文件,如果可以成功运行,且能看到图像则安装成功。
roslaunch usb_cam usb_cam-test.launch
如果成功启动后,会发布一系列的topic:
rostopic list
# 输出
/usb_cam/camera_info
/usb_cam/image_raw
/usb_cam/image_raw/compressed
/usb_cam/image_raw/compressed/parameter_descriptions
/usb_cam/image_raw/compressed/parameter_updates
/usb_cam/image_raw/compressedDepth
/usb_cam/image_raw/compressedDepth/parameter_descriptions
/usb_cam/image_raw/compressedDepth/parameter_updates
/usb_cam/image_raw/theora
/usb_cam/image_raw/theora/parameter_descriptions
/usb_cam/image_raw/theora/parameter_updates
其中,usb_cam
是一个名字空间。
5. 显示相机图像
rosrun image_view image_view image:=/usb_cam/image_raw
三、相机标定(单目)
单目标定:How to Calibrate a Monocular Camera
双目标定:How to Calibrate a Stereo Camera
camera_calibration - ROS Wiki
Camera Calibration and 3D Reconstruction
ROS&OpenCV下单目和双目摄像头的标定与使用
ROS官方提供了用于单目、双目标定的 camera_calibration 包,这个包是使用opencv里的张正友标定法。
1. 安装camera_calibration
安装相机标定包camera_calibration
,把kinetic改成自己的ros版本。
rosdep install camera_calibration
或者
sudo apt-get install ros-kinetic-camera-calibaration
rostopic list
# 输出
/camera/camera_info
/camera/image_raw
2. 相机标定关键步骤
2.1 准备标定板
calib.io
2.2 启动相机标定包
camera_calibration
cameracalibrator.py
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0254 image:=/usb_cam/image_raw camera:=/usb_cam
参数解释
–size
:表示内角点的size;–square
:指定方格的尺寸,我们使用的是A4纸打印的黑白格,尺寸为25.4 mm=0.0254 m;image
:表示使用的是来哪个Topic的图像数据。
2.3 移动标定板
标定开始后,在GUI屏幕的右侧,可以看到标有X、Y、Size和Skew的条形控件。不停地移动标定板,当条形控件被绿色填满,意味着校准完成。在校准过程中,需要将棋盘对着相机视野,朝着左/右/上/下/前/后移动,还需要倾斜棋盘。
X控件
:表示标定板在相机视野中的左右移动;Y控件
:表示标定板在相机视野中的上下移动;Size控件
:表示标定板在相机视野中的前后移动,可以理解为标定板离相机的远近;skew
:标定板在相机视野中的倾斜转动;
2.4 计算CALIBRATE
标定
所有条形控件变为绿色,CALIBRATE
按钮由灰色变为深绿色,则标定完成,点击 CALIBRATE
开始标定计算,过程大约1-2分钟。标定成功后,右边三个按钮全量(全部变为绿色),此时终端会显示相机的各个参数。
2.5 保存SAVE
标定数据
点击SAVE
按钮,标定结果保存路径为:/tmp/calibrationdata.tar.gz
。
2.6 查看标定数据
解压并打开 calibrationdata.tar.gz
,可以看到标定的图片和标定好的数据文件ost.txt
和 ost.yaml
。ost.yaml
文件可以提取出来改名为任意名称,例如 left.yaml
或 right.yaml
。
3. 解析ost.yaml
ost.yaml
是相机内参的标定文件,又称为校正数据文件。
image_width: 640
image_height: 480
camera_name: camera
camera_matrix:
rows: 3
cols: 3
data: [ 581.88585, 0. , 314.2472 ,
0. , 592.27138, 210.27091,
0. , 0. , 1. ]
camera_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [0.221666, -0.575455, -0.014215, 0.003895, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [ 1., 0., 0.,
0., 1., 0.,
0., 0., 1.]
projection_matrix:
rows: 3
cols: 4
data: [ 591.88599, 0. , 315.96148, 0. ,
0. , 603.39893, 205.72873, 0. ,
0. , 0. , 1. , 0. ]
参数解释
image_width
、image_height
:表示图片的长宽;camera_name
:相机名称;camera_matrix
:相机内参矩阵;distortion_model
:指定畸变模型的类型;distortion_coefficients
:畸变系数矩阵;rectification_matrix
:矫正矩阵,一般为单位阵;projection_matrix
:世界坐标到像平面的投影矩阵;
4. 图像去畸变
有了校正数据后,可以使用 image_proc
包提供的功能来对相机图像进行去畸变。image_proc
会从指定的 topic 上提取相机校正参数,这个topic默认为 /xxx_cam/camera_info
,xxx_cam
是名字空间,可以指定,例如:
ROS_NAMESPACE=usb_cam rosrun image_proc image_proc
image_proc
会将处理后的图像发布到 /xxx_camera/image_rect
和 image_rect_color
,image_rect
是灰度图像,image_rect_color
是彩色图像。
如何将yaml校正数据文件发布到 /xxx_camera/camera_info
话题?对于单目相机比较简单,在启动 usb_cam
时,为其指定 camera_info_url
参数即可,camera_info_url
参数则指向yaml校正数据文件。修改 usb_cam-test.launch
文件,在其中添加如下:
<param name="camera_info_url" type="string" value="file://$(find usb_cam)/ost.yaml" />
<!-- param name="camera_info_url" type="string" value="file:///home/yoyo/ost.yaml" / -->
这样在 usb_camera
启动时会加载该相机的yaml校正数据文件。其实,usb_camera
是调用了 camera_info_manager
包提供的 CameraInfoManager
类来读取yaml校正参数文件并发布。
5. 总结
- 当标定板(棋盘格)上出现彩色线条时,表明当前画面被有效捕捉;
- 当标定板差不多占满相机界面时,捕捉图像成功率最高;
- 每次移动之后,请保持标定板不动直到窗口出现高亮提示;
- 为了得到一个好的标定结果,应该让标定板尽量出现在相机视野的各个位置。让标定板在视野的左边、右边、上边、下边、倾斜、水平等,多移动标定板。