ROS单目相机标定

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
1920

height
1080

[narrow_stereo]

camera matrix
1635.873991 0.000000 949.118420
0.000000 1638.805293 527.129667
0.000000 0.000000 1.000000

distortion
0.032574 -0.118516 0.001411 0.006103 0.000000

rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000

projection
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 包

猜你喜欢

转载自blog.csdn.net/weixin_44709392/article/details/124169293