Wiki:http://wiki.ros.org/camera_calibration
普通相机:https://github.com/bosch-ros-pkg/usb_cam.git
单目教学:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
由于摄像头内部与外部的一些原因会给图像带来极大的失真,主要是径向变形和切向变形,导致直线变的弯曲,离图像中心越远的像素,失真越严重。为了避免数据源造成的误差,需要针对摄像头的参数进行标定。标定本质上是借助一个已知确定的空间关系(标定板),通过分析拍照的图片像素,逆向推出相机固有且真实的参数(内参)。
一个已知尺寸的大棋盘。本教程使用9x6棋盘格和20毫米正方形,标定的时候要展平。校准使用棋盘格的内部顶点,因此“10x7”棋盘使用内部顶点参数“9x6”,如下例所示。什么规格的标定板都可以,只不过改一下参数就好。空旷一点的区域,没有障碍物和标定板图案
通过 ROS 发布图像的单目相机
安装标定的功能包camera_calibration,docker终端输入,(出厂docker已经安装,不需要重新安装)
sudo apt install ros-humble-camera-calibration*
在标定之前启动相机,直到全部标定完毕再关闭相机,启动相机,Docker终端中输入,
xxxxxxxxxx
ros2 run usb_cam usb_cam_node_exe
使用以下命令查看话题,Docker终端中输入,
我们标定RGB彩色图像需要用到的话题是/image_raw.
运行标定的程序,Docker终端中输入,
xxxxxxxxxx
ros2 run camera_calibration cameracalibrator --size 9x6 --square 0.02 --ros-args --remap /image:=/image_raw
size:标定棋盘格的内部角点个数,例如9X6,角点一共六行九列。
square:棋盘格的边长,单位是米。
话题名字:/image_raw
X:棋盘格在摄像头视野中的左右移动
Y:棋盘格在摄像头视野中的上下移动
Size :棋盘格在摄像头视野中的前后移动
Skew:棋盘格在摄像头视野中的倾斜转动
如上图所示,需要通过上下前后左右左右翻转来采集图像,使得右边的X、Y、Size、Skew变成绿色,如下图所示,然后点击CALIBRATE,开始标定。
标定结束后,点击SAVE,如下图所示,
标定结果保存至【/tmp/calibrationdata.tar.gz】,保存的路径为标定程序启动的终端目录下。标定结束后,可以移动出来【/tmp/calibrationdata.tar.gz】文件看看内容
xxxxxxxxxx
sudo mv /tmp/calibrationdata.tar.gz ~
docker终端输入,
xxxxxxxxxx
cd ~
tar -xvf calibrationdata.tar.gz
会在终端目录下得到标定的png文件、ost.yaml和ost.txt文件
启动usb摄像头时是需要加载参数的,因此,标定后需要把参数替换原来的内置参数,把标定好的ost.yaml改名为camera_info.yaml,然后替换原来的camera_info.yaml,docker终端输入,
xxxxxxxxxx
#先把文件复制到/opt/ros/foxy/share/usb_cam/config
sudo cp ost.yaml /opt/ros/foxy/share/usb_cam/config
#切换至/opt/ros/foxy/share/usb_cam/config目录下
cd /opt/ros/foxy/share/usb_cam/config
#备份原来的camera_info.yaml
sudo mv camera_info.yaml camera_info_BK.yaml
#重命名ost.yaml为camera_info.yaml
sudo mv ost.yaml camera_info.yaml