ROS学习——利用电脑相机标定
usb_cam - ROS Wiki
GitHub - ros-drivers/usb_cam: A ROS Driver for V4L USB Cameras
usb_cam包用于读取图像。
usb_cam用于实时SLAM,配合ROS平台使用。
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
cd usb_cam
mkdir build
cd build
cmake ..
make
安装相机标定包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
。
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*
。
rosrun usb_cam usb_cam_node
运行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
是一个名字空间。
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里的张正友标定法。
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
calib.io
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的图像数据。标定开始后,在GUI屏幕的右侧,可以看到标有X、Y、Size和Skew的条形控件。不停地移动标定板,当条形控件被绿色填满,意味着校准完成。在校准过程中,需要将棋盘对着相机视野,朝着左/右/上/下/前/后移动,还需要倾斜棋盘。
X控件
:表示标定板在相机视野中的左右移动;Y控件
:表示标定板在相机视野中的上下移动;Size控件
:表示标定板在相机视野中的前后移动,可以理解为标定板离相机的远近;skew
:标定板在相机视野中的倾斜转动;CALIBRATE
标定所有条形控件变为绿色,CALIBRATE
按钮由灰色变为深绿色,则标定完成,点击 CALIBRATE
开始标定计算,过程大约1-2分钟。标定成功后,右边三个按钮全量(全部变为绿色),此时终端会显示相机的各个参数。
SAVE
标定数据点击SAVE
按钮,标定结果保存路径为:/tmp/calibrationdata.tar.gz
。
解压并打开 calibrationdata.tar.gz
,可以看到标定的图片和标定好的数据文件ost.txt
和 ost.yaml
。ost.yaml
文件可以提取出来改名为任意名称,例如 left.yaml
或 right.yaml
。
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
:世界坐标到像平面的投影矩阵;有了校正数据后,可以使用 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" />
这样在 usb_camera
启动时会加载该相机的yaml校正数据文件。其实,usb_camera
是调用了 camera_info_manager
包提供的 CameraInfoManager
类来读取yaml校正参数文件并发布。