camera_calibration/Tutorials/MonocularCalibration - ROS Wiki
说明:本文介绍使用camera_calibration的cameracalibrator.py节点在 ROS 上使用原始图像校准单目相机。
1. 在开始之前
确保您具备以下条件:
-
具有已知尺寸的棋盘。本文使用 16.2 毫米正方形的 9x6 棋盘。校准使用棋盘的内部顶点,因此“10x7”棋盘使用内部顶点参数“9x6”.
- 一个光线充足区域,没有障碍物并检查板图案
- 通过 ROS 发布图像的单目相机
USB相机驱动
安装usbcam
sudo apt-get install ros-noetic-usb-cam
查看接入的USB摄像头的设备号
ls /dev/video*
修改launch文件,设置USB摄像头的编号
roscd usb_cam
cd launch
sudo gedit usb_cam-test.launch
修改相关参数:
<param name="video_device" value="/dev/video2" />
<param name="image_width" value="1920" />
<param name="image_height" value="1080" />
启动摄像头
roslaunch usb_cam usb_cam-test.launch
2.相机内参标定
首先获取依赖项并编译驱动程序。
rosdep install camera_calibration
确保您的单目相机通过 ROS 发布图像。让我们列出主题以检查图像是否已发布:
rostopic list
这将显示所有已发布的主题,检查是否有image_raw主题。我使用的ROS 相机驱动程序提供的默认主题是:
/usb_cam/camera_info
/usb_cam/image_raw
如果您有多个摄像头或在其自己的命名空间中运行驱动程序,您的主题名称可能会有所不同。
运行校准节点
要开始校准,您需要加载将要校准的图像主题:
注意参数设置(根据实际情况修改):--size 9x6 --square 0.016 image:=/usb_cam/image_raw camera:=/usb_cam
rosrun camera_calibration cameracalibrator.py --size 9x6 --square 0.016 image:=/usb_cam/image_raw camera:=/usb_cam
这将打开校准窗口,该窗口将突出显示棋盘:
如果它没有打开窗口,请尝试以下参数:
--no-service-check
3.1 双棋盘
New in D
从 Diamondback 开始,您将能够使用多种尺寸的棋盘格来校准相机。
要使用多个棋盘格,请为其他棋盘提供多个--size和--square选项。确保电路板具有不同的尺寸,以便校准系统可以区分它们。
4. 移动棋盘
为了获得良好的校准,您需要在相机框架中移动棋盘格,以便:
- 相机视野左侧、右侧、顶部和底部的棋盘格
- X 条 - 视野中的左/右
- Y 条 - 视野中的顶部/底部
- 尺寸栏 - 朝向/远离和倾斜相机
- 棋盘格填满整个视野
- 棋盘向左、右、上和下倾斜(倾斜)
在每一步,保持棋盘静止,直到图像在校准窗口中突出显示。
当您四处移动棋盘时,您会看到校准侧边栏上的三个条形长度增加。当CALIBRATE按钮亮起时,您有足够的数据进行校准,可以单击CALIBRATE查看结果。
校准可能需要大约一分钟。窗户可能是灰色的,但请稍等,它正在工作。
校准结果
校准完成后,您将在终端中看到校准结果,在校准窗口中看到校准后的图像:
成功的校准将导致现实世界中的直边在校正后的图像中显得笔直。
校准失败通常会导致空白或无法识别的图像,或不保留直边的图像。
校准成功后,您可以使用校准窗口顶部的滑块来更改校正图像的大小。比例为 0.0 意味着图像的大小使校正后的图像中的所有像素都有效。校正后的图像没有边框,但原始图像中的一些像素被丢弃。比例为 1.0 意味着原始图像中的所有像素都是可见的,但校正后的图像具有黑色边框,原始图像中没有输入像素。
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
D = [0.03257360705000341, -0.11851634449448158, 0.0014113553036914411, 0.00610340762583152, 0.0]
K = [1635.8739906276044, 0.0, 949.1184202585939, 0.0, 1638.805293346875, 527.1296666414235, 0.0, 0.0, 1.0]
R = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P = [1630.2681884765625, 0.0, 958.9767602878273, 0.0, 0.0, 1646.3248291015625, 527.5539122417395, 0.0, 0.0, 0.0, 1.0, 0.0]
# oST version 5.0 parameters[image]width
1920height
1080[narrow_stereo]camera matrix
1635.873991 0.000000 949.118420
0.000000 1638.805293 527.129667
0.000000 0.000000 1.000000distortion
0.032574 -0.118516 0.001411 0.006103 0.000000rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000projection
1630.268188 0.000000 958.976760 0.000000
0.000000 1646.324829 527.553912 0.000000
0.000000 0.000000 1.000000 0.000000
如果您对校准感到满意,请单击COMMIT将校准参数发送到相机进行永久存储。GUI 退出,您应该在控制台中看到“将校准数据写入...”。('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
创建一个 yml 文件
Camera Calibration Parser帮助您创建一个 yml 文件,您可以使用camera_info_url参数加载几乎所有 ros 相机驱动程序。
打开并解压校准参数文件,解压calibrationdata.tar.gz文件后,可以查看图像文件(*.png)和记录了校准中使用的校准参数的ost.txt文件。
cd /tmp
tar -xvzf calibrationdata.tar.gz
修改校准参数文件,把ost.txt文件改名为ost.ini,并使用camera_calibration_parsers功能包
的convert节点创建相机参数文件(camera.yaml)。创建完成后,将其保存在~/.ros/camera_info/目录中,则ROS中使用的相机相关功能包会引用此信息。
mv ost.txt ost.ini #修改名字
rosrun camera_calibration_parsers convert ost.ini camera.yaml #转换成相机引用信息
sudo mkdir ~/opt/ros/noetic/camera_info #创建相机信息文件夹
sudo mv camera.yaml ~/opt/ros/noetic/camera_info/ #移动到该文件下
重新运行相机节点,打印标定信息:
roslaunch usb_cam usb_cam-test.launch
rostopic echo usb_cam/camera_info
校正图像
简单地加载校准文件并不能纠正图像。要进行整改,请使用image_proc 包。