文章目录
- 一、环境准备
- 二、摄像头标定
-
- [2.1 为什么要标定](#2.1 为什么要标定)
- [2.2 标定前准备](#2.2 标定前准备)
-
- [2.2.1 标定板](#2.2.1 标定板)
- [2.2.2 摄像头调焦](#2.2.2 摄像头调焦)
- [2.3 开始标定](#2.3 开始标定)
- [2.4 测试标定结果](#2.4 测试标定结果)
- 总结
- 参考资料
一、环境准备
安装usb_cam相机驱动
sudo apt-get install ros-noetic-usb-cam
安装标定功能包
sudo apt-get install ros-noetic-camera-calibration
usb_cam提供了一个launch文件,可以直接roslaunch运行,打开usb_cam_node 和 image_view节点。launch文件在/opt/ros/noetic/share/usb_cam/launch
文件夹下。直接在这个目录打开bash然后运行。执行这个命令:
roslaunch usb_cam usb_cam-test.launch
launch文件内容如下:
xml
<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="color_format" value="yuv422p" />
<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>
二、摄像头标定
2.1 为什么要标定
普通相机成像误差的主要来源有两部分,第一是相机感光元件制造产生的误差,比如成
像单元不是正方形、歪斜等;第二是镜头制造和安装产生的误差,镜头一般存在非线性的径
向畸变。
在对相机成像和三维空间中位置关系对应比较严格的场合(例如尺寸测量、视觉 SLAM等)就需要准确的像素和物体尺寸换算参数,这参数必须通过实验与计算才能得到,求解参数的过程就称之为相机标定。
2.2 标定前准备
2.2.1 标定板
在执行摄像头标定前,需要先准备一块标定板。
标定板有两种获得方法,第一种是采购成品的标定板,A4纸大小的标定板通常价格在300~400的样子。
如果不想采购,可以使用打印机将下面的文件按照1:1打印在A4纸上,然后贴在一块纯平的版上,例如亚克力板。
打印的标定板缺点在于,第一打印机的精度有限,边缘可能会产生模糊,另外就是在粘贴时很难做到极高的平整度,这两项都会对标定结果产生一定的影响,但是优点时便宜易得。
2.2.2 摄像头调焦
标定只针对手动对焦的相机,自动对焦的相机由于焦距变化,难以形成固定的标定参数。
相机在标定前,需要调整好焦距(拧镜头),使成像清晰,并将当前焦距固定住,防止焦距产生变化。
2.3 开始标定
准备标定板,可以使用这个网站生成标准的棋盘标定pdf,可以截图到平板上当成一块板子。
开始标定,bash中输入:
rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.02 image:=/usb_cam/image_raw
--size
是指这个标定板的内角点数量详细说明戳这
--square
是指每个小正方形的边长。
运行之后会出现下面这个窗口,然后用你的标定板缓慢各式各样的移动,会发现右边那几个进度条在变化,你要做的就是让这些血条变绿。X表示左右移动,Y表示上下,Size表示远近,Skew表示倾斜
全部绿了之后,会发现CALIBRATE按钮变颜色,然后点击,开始无尽的等待。直到控制台出现你的标定信息,就标定好了。如下图:
测试标定结果,再把标定板拿到镜头,右侧出现了一个数据,叫线性误差,通常这个值小于0.1或者显示acc都可以认为标定结果可用
除此之外,点击SAVE按钮后在/tmp
目录下,出现了一个压缩包,这个压缩包存放了标定结果和图片。其中的.yaml就是标定结果,后续会使用。
2.4 测试标定结果
打开你的ros工作目录,在src下创建一个功能包,在这个功能包下创建config和launch目录,config存放刚才的标定结果yaml文件,launch目录存放launch文件,来运行节点。
launch文件内容如下:
xml
<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"/>
<param name="camera_name" value="my_camera"/>
<param name="camera_info_url" type="string" value="file://$(find bingda_tutorials)/config/ost.yaml"/>
</node>
</launch>
重要的是后面两个参数,一个是摄像头名称,你自定义,一个是info_url,写你的yaml文件路径
接下来launch一下:
使用echo将camera_info话题输出,可以看到摄像头的标定参数已经加载在话题中了
rostopic echo /usb_cam/camera_info
矫正图像
如果需要使用标定参数矫正图像,可以使用image_proc这个功能包
首先通过apt方式安装
安装完成后运行它,这里加入ROS_NAMESPACE是由于usb_cam这个功能包中发布的话题都带有了/usb_cam这个命名空间,所以为了保证图像和摄像头参数话题能正常的被image_proc节点接收需要给它加上命名空间/usb_cam
ROS_NAMESPACE=usb_cam rosrun image_proc image_proc
再开启两个rqt_image_view
,直接终端输入就可以。
左边是校正了的,右边是原生图像。看不出什么区别,广角下就会比较明显
总结
在本实验中,操作了在Ubuntu 20.04上安装ROS并使用相机标定包对摄像头进行标定,了解了具体操作过程。通过进行标定,获取摄像头的内部参数和畸变系数,提高测量精度。