摄像头这种精密仪器对光学器件的要求较高,由于摄像头内部与外部的一些原因,生成的物体图像往往会发生畸变,为了避免数据源造成的误差,需要针对摄像头的参数进行标定。
ROS官方提供了用于双目和单目摄像头标定的功能包—camera_calibration
camera_calibration功能包
首先使用以下命令安装摄像头标定功能包camera_calibration:
sudo apt-get install ros-kinetic-camera-calibration
标定需要用到图所示棋盘格图案的标定靶,可以在本书配套源码中找到(robot_vision/doc/checkerboard.pdf),请你将该标定靶打印出来贴到平面硬纸板上以备使用。
启动标定程序
一切就绪后准备开始标定摄像头。首先使用以下命令启动USB摄像头:
roslaunch robot_vision usb_cam.launch
然后使用以下命令启动标定程序:
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/im
cameracalibrator.py标定程序需要以下几个输入参数。
1)size:标定棋盘格的内部角点个数,这里使用的棋盘一共有6行,每行有8个内部角点。
2)square:这个参数对应每个棋盘格的边长,单位是米。
3)image和camera:设置摄像头发布的图像话题。
根据使用的摄像头和标定靶棋盘格尺寸,相应修改以上参数,即可启动标定程序。
标定摄像头
标定程序启动成功后,将标定靶放置在摄像头视野范围内,应该可以看到如图所示的图形界面。
在没有标定成功前,右边的按钮都为灰色,不能点击。为了提高标定的准确性,应该尽量让标定靶出现在摄像头视野范围内的各个区域,界面右上角的进度条会提示标定进度。
1)X:标定靶在摄像头视野中的左右移动。
2)Y:标定靶在摄像头视野中的上下移动。
3)Size:标定靶在摄像头视野中的前后移动。
4)Skew:标定靶在摄像头视野中的倾斜转动。
不断在视野中移动标定靶,直到“CALIBRATE”按钮变色,表示标定程序的参数采集完成。点击“CALIBRATE”按钮,标定程序开始自动计算摄像头的标定参数,这个过程需要等待一段时间,界面可能会变成灰色无响应状态,注意千万不要关闭。
参数计算完成后界面恢复,而且在终端中会有标定结果的显示。
点击界面中的“SAVE”按钮,标定参数将被保存到默认的文件夹下,并在终端中看到该路径,如图所示。
点击“COMMIT”按钮,提交数据并退出程序。然后打开/tmp文件夹,就可以看到标定结果的压缩文件calibrationdata.tar.gz;解压该文件后的内容如下 图所示,从中可以找到ost.yaml命名的标定结果文件,将该文件复制出来,重新命名就可以使用了。
标定Kinect
除了一个RGB摄像头,Kinect还有一个红外深度摄像头,两个摄像头需要分别标定,方法与USB摄像头的标定相同。
启动Kinect后,分别使用以下命令
roslaunch robot_vision freenect.launch
rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.024
rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera
加载标定参数的配置文件
标定摄像头生成的配置文件是YAML格式的,可以在启动摄像头的launch文件中进行加载,例如加载摄像头标定文件的robot_vision/launch/usb_cam_with_calibration.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="1280" />
<param name="image_height" value="720" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
<param name="camera_info_url" type="string" value="file://$(find robot_vision)/
camera_calibration.yaml" />
</node>
</launch>
Kinect标定文件的加载方法相同,分别设置RGB摄像头和红外深度摄像头的标定文件即可,详见robot_vision/launch/freenect_with_calibration.launch:
<launch>
<!-- Launch the freenect driver -->
<include file="$(find freenect_launch)/launch/freenect.launch">
<arg name="publish_tf" value="false" />
<!-- use device registration -->
<arg name="depth_registration" value="true" />
<arg name="rgb_processing" value="true" />
<arg name="ir_processing" value="false" />
<arg name="depth_processing" value="false" />
<arg name="depth_registered_processing" value="true" />
<arg name="disparity_processing" value="false" />
<arg name="disparity_registered_processing" value="false" />
<arg name="sw_registered_processing" value="false" />
<arg name="hw_registered_processing" value="true" />
<arg name="rgb_camera_info_url"
value="file://$(find robot_vision)/kinect_rgb_calibration.yaml" />
<arg name="depth_camera_info_url"
value="file://$(find robot_vision)/kinect_depth_calibration.yaml" />
</include>
</launch>
启动加载了标定文件的传感器后,可能会看到如下图所示的警告信息。
这是因为标定文件中的camera_name参数与实际传感器的名称不匹配,按照警告提示的信息进行修改即可。比如根据上图日志中所示的警告,分别将两个标定文件中的camera_name参数修改为“rgb_A70774707163327A”、“depth_A70774707163327A”即可。