ROS外接usb摄像头标定方法
usb_cam官方文档:http://wiki.ros.org/camera_calibration
camera_calibrate官方文档:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
棋盘格也在上面的链接中下载。
摄像头标定的目的是消除相机畸变,具体畸变原理可以参考之前的文章【相机模型与去畸变方法详解】。usb摄像头在ros系统标定过程大致可以分成几个步骤。①安装usb_camera驱动包;② 运行usb_cam读取usb摄像头图像;③下载打印棋盘格并进行摄像头标定。
1. 安装usb_camera驱动包
- 进入工作空间的src目录(这里工作空间目录可能都不一样,自行修改)
- 下载usb_cam源代码
- 编译安装
1 | cd ~/catkin_ws/src |
2. 运行usb_cam读取摄像头图像
首先打开一个终端,运行roscore
然后再打开一个终端,运行usb_cam-test.launch
启动文件(由于刚才下载的源代码中由测试文件,因此可以直接启动)
1 | cd ~/catkin_ws/src/usb_cam/launch |
默认情况下开启的是电脑自带摄像头,如果需要启动外置摄像头,则修改一下launch文件,将参数第一行的value改为value="/dev/video1"
,然后重新编译一下。
如果更改后启动报错,那么执行
ls /dev/video*
命令看看外界摄像头是那个,再将launch文件改为对应的video2或video3。
比如我的usb摄像头就是 /dev/video2
1 | <param name="video_device" value="/dev/video1" /> |
如果出现如下错误
ERROR: cannot launch node of type [usb_cam/usb_cam_node]: usb_cam
ROS path [0]=/opt/ros/kinetic/share/ros
ROS path [1]=/opt/ros/kinetic/share
首先进入工作空间目录
3. 进行摄像头标定
再次打开一个终端(前两个分别运行roscore
和usb_cam-test
)
① 查看主题名称
输入rostopic list
查看ros中的主题,检查是否有/usb_cam/camera_info
和/usb_cam/image_raw
两个主题。(主题名可能会不一样,有可能是/usb_cam_node记住自己的这两个主题的名字)
如果出现 ImportError: No module named cv2的问题,请参考下面这篇文章
文章链接:【ImportError: No module named cv2问题的解决方法(修改python默认版本)】
② 执行命令启动标定程序
1 | rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.03 image:=/usb_cam/image_raw camera:=/usb_cam |
其中的8x6是指的棋盘格内部角点的个数,如下图我下载的棋盘格内部角点是8x6的。如果你是11x8角点的棋盘格,那么命令里面的8x6替换成11x8即可。
③ 变换角度使程序记录样本
拿着棋盘格纸多变幻几个角度,离远离近,边边角角都采集一些样本,当命令行里看到sample接近50的时候,标定按钮calibrate就会变亮了。
④ 进行标定并保存
点击CALIBRATE按钮进行标定,等待一小段时间后,就可以在命令行中看到标定的结果。
标定没有问题的花,点击COMMIT按钮就可以保存了,保存之后,下次再启动usb_camera就会自动使用标定的参数,可以发现摄像头不再畸变了。