在之前博文中,我们使用usb_cam包读入并发布了图像消息,但是图像没有被标定,因此存在畸变
这是自己在ROS下做的一个单目摄像机的标定
(1)usb_cam
这是USB摄像头的驱动包
下载地址:
https://github.com/bosch-ros-pkg/usb_cam
(2)标定功能包camera_calibration
下载地址:
https://github.com/ros-perception/image_pipeline
这是ROS下用于标定相机的包,本文是参照此包的教程进行相机标定。没有kinetic版本,亲测indigo版本可用。
教程地址:
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
1)首先驱动USB摄像头
可参阅 ROS上安装usb_cam驱动运行USB摄像头
2)查看发布的话题
rostopic list
3)运行相机标定的节点
首先要编译
启动标定程序
rosrun camera_calibration cameracalibrator.py --size 9x7 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
注::size 是指棋盘内部角点个数,我是用的标定板公有12x8个角点(即12列8行),”x”是字母,而不是乘号…square指方形的边长,我使用的标定板方形边长为108mm,image为输出图像的话题,usb_cam为相机的名称(即在/image_raw前面部分)
出错:如下
(‘Waiting for service‘, ‘/camera/set_camera_info‘, ‘…‘)
Service not found
运行如下语句: 角点数 棋盘格大小 topic映射
rosrun camera_calibration cameracalibrator.py --size 9x7 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam --no-service-check
其中参数size 9x7 注意是字母x,他是棋盘内部角点个数,如下图所示。square为棋盘正方形边长,注意刚刚开始标定的时候,CALIBRATE按钮是灰色的。
运行后会弹出标定使用的GUI
在出现上述窗口后,拿标定板在窗口中移动,
我们从图1中可以看到,在GUI的右侧有X,Y,Size,Skew这几个标志条
它们的含义是:
(1)x:标定板在图像中的左右位置,从左到右x由小变大。
(2)y:标定板在图像中的上下位置,从上到下y由小变大。
(3)Size:标定板在图像中的大小,由远及近,Size由小变大。
(4)Skew:标定板在图像中倾斜的角度大小
操作过程:
(1)为了得到尽量丰富的x,y值:标定的过程中要尽量缓慢移动标定板,使标定板的位置出现在图像中的各个地方(上中下左右)。
(2)为了得到丰富的Size值缓慢移动标定板,使标定板由远及近,采集到丰富的尺寸信息,最好有一张,标定板占据视野绝大部分的图像。
(3)为了得到丰富的Skew信息,缓慢移动标定板,使标定板的俯仰,偏航,滚动变化。
注:在操作的过程中,标定板移动不要过快,并且,每移动到一个位置要停顿下,如果发现这四标志条都变绿了说明采集到了足够的信息。并且如果可以执行标定,CALIBRATE就会变亮。
CALIBRATE选项变亮后,就可以点击,执行标定(最好各标志条也都变绿),此时图像会变灰,等待几分钟,标定完成后,再把标定板拿到摄像机前会出现如下画面:
1、报错[usb_cam-test.launch] is not a launch file name
运行完roslaunch usb_cam-test.launch后报错说usb_cam-test.launch不是一个launch文件,这是因为没有cd到catkin_ws/src/usb_cam/launch文件夹下,系统找不到这个launch文件
或者如果事先source了该工作空间,可以在任意目录下运行roslaunch usb_cam usb_cam-test.launch都行
2、对于有些节点没有跑起来的情况,可以从下载的catkin_ws/src/usb_cam中找到相应的.py文件然后用cp命令复制到opt/ros/hydro/的相应文件夹下
3、如果出现报错“sh: 1: v4l2-ctl: not found”则需要安装v4l2
运行:
sudo apt-get install v4l-utils
4 警告:
unknown control 'focus_auto'
head_camera.yaml not found
可以忽略.