基于ROS环境的相机标定教程

一、参考资料

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_nodeimage_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:标定板在相机视野中的倾斜转动;
    基于ROS环境的相机标定教程_第1张图片

2.4 计算CALIBRATE标定

所有条形控件变为绿色,CALIBRATE 按钮由灰色变为深绿色,则标定完成,点击 CALIBRATE 开始标定计算,过程大约1-2分钟。标定成功后,右边三个按钮全量(全部变为绿色),此时终端会显示相机的各个参数。
基于ROS环境的相机标定教程_第2张图片

2.5 保存SAVE标定数据

点击SAVE 按钮,标定结果保存路径为:/tmp/calibrationdata.tar.gz

2.6 查看标定数据

解压并打开 calibrationdata.tar.gz,可以看到标定的图片和标定好的数据文件ost.txtost.yamlost.yaml 文件可以提取出来改名为任意名称,例如 left.yamlright.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_widthimage_height:表示图片的长宽;
  • camera_name:相机名称;
  • camera_matrix:相机内参矩阵;
  • distortion_model:指定畸变模型的类型;
  • distortion_coefficients:畸变系数矩阵;
  • rectification_matrix:矫正矩阵,一般为单位阵;
  • projection_matrix:世界坐标到像平面的投影矩阵;

4. 图像去畸变

有了校正数据后,可以使用 image_proc 包提供的功能来对相机图像进行去畸变。image_proc 会从指定的 topic 上提取相机校正参数,这个topic默认为 /xxx_cam/camera_infoxxx_cam 是名字空间,可以指定,例如:

ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

image_proc 会将处理后的图像发布到 /xxx_camera/image_rectimage_rect_colorimage_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校正参数文件并发布。

5. 总结

  1. 当标定板(棋盘格)上出现彩色线条时,表明当前画面被有效捕捉;
  2. 当标定板差不多占满相机界面时,捕捉图像成功率最高;
  3. 每次移动之后,请保持标定板不动直到窗口出现高亮提示;
  4. 为了得到一个好的标定结果,应该让标定板尽量出现在相机视野的各个位置。让标定板在视野的左边、右边、上边、下边、倾斜、水平等,多移动标定板。

你可能感兴趣的:(ROS,ROS,相机标定)