ROS 摄像头标定-camera_calibration

56 篇文章 49 订阅
17 篇文章 6 订阅

摄像头这种精密仪器对光学器件的要求较高,由于摄像头内部与外部的一些原因,生成的物体图像往往会发生畸变,为了避免数据源造成的误差,需要针对摄像头的参数进行标定。

ROS官方提供了用于双目和单目摄像头标定的功能包—camera_calibration

camera_calibration功能包

首先使用以下命令安装摄像头标定功能包camera_calibration:

sudo apt-get install ros-kinetic-camera-calibration

标定需要用到图所示棋盘格图案的标定靶,可以在本书配套源码中找到(robot_vision/doc/checkerboard.pdf),请你将该标定靶打印出来贴到平面硬纸板上以备使用。

在这里插入图片描述

启动标定程序

一切就绪后准备开始标定摄像头。首先使用以下命令启动USB摄像头:

roslaunch robot_vision usb_cam.launch

然后使用以下命令启动标定程序:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/im

cameracalibrator.py标定程序需要以下几个输入参数。

1)size:标定棋盘格的内部角点个数,这里使用的棋盘一共有6行,每行有8个内部角点。

2)square:这个参数对应每个棋盘格的边长,单位是米。

3)image和camera:设置摄像头发布的图像话题。

根据使用的摄像头和标定靶棋盘格尺寸,相应修改以上参数,即可启动标定程序。

标定摄像头

标定程序启动成功后,将标定靶放置在摄像头视野范围内,应该可以看到如图所示的图形界面。

在这里插入图片描述
在没有标定成功前,右边的按钮都为灰色,不能点击。为了提高标定的准确性,应该尽量让标定靶出现在摄像头视野范围内的各个区域,界面右上角的进度条会提示标定进度。

1)X:标定靶在摄像头视野中的左右移动。
2)Y:标定靶在摄像头视野中的上下移动。
3)Size:标定靶在摄像头视野中的前后移动。
4)Skew:标定靶在摄像头视野中的倾斜转动。

不断在视野中移动标定靶,直到“CALIBRATE”按钮变色,表示标定程序的参数采集完成。点击“CALIBRATE”按钮,标定程序开始自动计算摄像头的标定参数,这个过程需要等待一段时间,界面可能会变成灰色无响应状态,注意千万不要关闭。

参数计算完成后界面恢复,而且在终端中会有标定结果的显示。

在这里插入图片描述
点击界面中的“SAVE”按钮,标定参数将被保存到默认的文件夹下,并在终端中看到该路径,如图所示。

在这里插入图片描述

点击“COMMIT”按钮,提交数据并退出程序。然后打开/tmp文件夹,就可以看到标定结果的压缩文件calibrationdata.tar.gz;解压该文件后的内容如下 图所示,从中可以找到ost.yaml命名的标定结果文件,将该文件复制出来,重新命名就可以使用了。

在这里插入图片描述

标定Kinect

除了一个RGB摄像头,Kinect还有一个红外深度摄像头,两个摄像头需要分别标定,方法与USB摄像头的标定相同。

启动Kinect后,分别使用以下命令

roslaunch robot_vision freenect.launch
rosrun camera_calibration cameracalibrator.py image:=/camera/rgb/image_raw camera:=/camera/rgb --size 8x6 --square 0.024
rosrun camera_calibration cameracalibrator.py image:=/camera/ir/image_raw camera:=/camera

在这里插入图片描述

加载标定参数的配置文件

标定摄像头生成的配置文件是YAML格式的,可以在启动摄像头的launch文件中进行加载,例如加载摄像头标定文件的robot_vision/launch/usb_cam_with_calibration.launch:

<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="1280" />
<param name="image_height" value="720" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
<param name="camera_info_url" type="string" value="file://$(find robot_vision)/
camera_calibration.yaml" />
</node>
</launch>

Kinect标定文件的加载方法相同,分别设置RGB摄像头和红外深度摄像头的标定文件即可,详见robot_vision/launch/freenect_with_calibration.launch:

<launch>
<!-- Launch the freenect driver -->
<include file="$(find freenect_launch)/launch/freenect.launch">
<arg name="publish_tf" value="false" />
<!-- use device registration -->
<arg name="depth_registration" value="true" />
<arg name="rgb_processing" value="true" />
<arg name="ir_processing" value="false" />
<arg name="depth_processing" value="false" />
<arg name="depth_registered_processing" value="true" />
<arg name="disparity_processing" value="false" />
<arg name="disparity_registered_processing" value="false" />
<arg name="sw_registered_processing" value="false" />
 <arg name="hw_registered_processing" value="true" />
<arg name="rgb_camera_info_url"
value="file://$(find robot_vision)/kinect_rgb_calibration.yaml" />
<arg name="depth_camera_info_url"
value="file://$(find robot_vision)/kinect_depth_calibration.yaml" />
</include>
</launch>

启动加载了标定文件的传感器后,可能会看到如下图所示的警告信息。

在这里插入图片描述
这是因为标定文件中的camera_name参数与实际传感器的名称不匹配,按照警告提示的信息进行修改即可。比如根据上图日志中所示的警告,分别将两个标定文件中的camera_name参数修改为“rgb_A70774707163327A”、“depth_A70774707163327A”即可。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海聊智造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值