ROS下采用camera_calibration进行单目相机标定

参考:

  1. https://blog.csdn.net/learning_tortosie/article/details/79901255
  2. https://blog.csdn.net/learning_tortosie/article/details/82347694
  3. https://blog.csdn.net/X_kh_2001/article/details/89163659?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
  • 相机标定的原理及各个坐标系之间的关系可参见之前的博客,这里直接介绍工程实践部分。
  • 相机标定可通过 matlab、OpenCV、ROS 三种方式进行。使用 OpenCV 进行标定可参见之前的博客,这里直接介绍基于 ROS 的方式标定单目相机。
  • ROS 官方提供了camera_calibration 包,通过这个包可以使用棋盘标定板对单目双目相机进行标定。

一、准备工作:

  • 系统环境:Ubuntu16.04
  • 本教程是基于 usb_cam 包读取图像,因此需要提前安装 usb_cam 驱动,参见:https://github.com/ros-drivers/usb_cam
  • 安装 camera_calibration 功能包:sudo apt-get install ros-kinetic-camera-calibration
    (很多博客以及维基教程都是使用 rosdep install camera_calibration 来安装,但是我的出现 ERROR: Rosdep cannot find all required resources to answer your query 错误,经过一番搜索好像是因为 ros 环境变量中所有的路径都没有该功能包,而不是没有 source devel/setup.bash)
  • 准备一个已知尺寸的标定板,本实验使用的是 7X9(列X行),边长为 10cm 的棋盘标定板。由于标定过程使用的是棋盘内部的角点进行,所以实际上我们使用的是 8X10 的棋盘标定板 。
  • 一个通过ROS发布图像的单目相机。
    (以下步骤基本是ROS wiki教程的翻译,更多细节请移步官方教程。另外推荐一个标定工具 Kalibr ,可以实现Multiple camera calibration、Camera-IMU calibration、Rolling Shutter Camera calibration。)

二、相机标定:

  1. 启动摄像头驱动节点:
rosrun usb_cam usb_cam_node

!!!注意:确定你使用的video_id,可利用如下命令查看:

ls /dev/video*

一般笔记本电脑自带的摄像头id为0,外接的摄像头id为1。然后根据需要修改usb_cam/src/usb_cam/launch/usb_cam-test.launch里面的<param name="video_device" value="/dev/video1" />。每次修改完成后,先运行:

roslaunch usb_cam usb_cam-test.launch

查看启动的设备是否正确,若正确则关掉再运行:rosrun usb_cam usb_cam_node 打开驱动:
在这里插入图片描述
2. 查看图像是否发布:

rostopic list  #列出 topic 确保相机正在通过ROS发布图像

这会显示所有已发布的topic,检查是否有image_raw topic。以下是本实验的相机topic:

/usb_cam/camera_info
/usb_cam/image_raw
/usb_cam/image_raw/compressed
/usb_cam/image_raw/compressed/parameter_descriptions
/usb_cam/image_raw/compressed/parameter_updates
/usb_cam/image_raw/compressedDepth
/usb_cam/image_raw/compressedDepth/parameter_descriptions
/usb_cam/image_raw/compressedDepth/parameter_updates
  1. 新开一个终端,运行标定节点:
rosrun camera_calibration cameracalibrator.py --size 7x9 --square 0.1 image:=/usb_cam/image_raw camera:=/head_camera --no-service-check

此命令运行标定结点的python脚本,其中 :
(1)–size 7x9 为棋盘内部角点的个数,方格几列几行(需要减1),比如我的标定板方格是8X10,则siez为7x9。
(2)–square 0.1为每个棋盘格的边长
!!!注意:7x9中间不能用“*”,是字母“x”。ROS支持使用多个标定板来进行标定,请根据需要输入复数个–size和–square。
(3)image:=/usb_cam/image_raw 为当前订阅的图像来自名为/usb_cam/image_raw的topic
(4)camera:=/head_camera为摄像机名(我试过写camera:=/camera也可以,目前还不知道是什么原因…)
(5)加上–no-service-check是因为一开始运行后出现下面的错误,参考官网加上此参数后就可正常显示:

('Waiting for service', '/camera/set_camera_info', '...')
Service not found

这将打开标定窗口,如下图所示:
在这里插入图片描述
4. 移动标定板:

  • 为了达到良好的标定效果,需要在摄像机周围移动标定板,并完成以下基本需求:
    (1)移动标定板到画面的最左、右,最上、下方。
    (2)移动标定板到视野的最近和最远处。
    (3)移动标定板使其充满整个画面。
    (4)保持标定板倾斜状态并使其移动到画面的最左、右,最上、下方 。
  • 当标定板移动到画面的最左、右方时,此时,窗口的x会达到最小或满值。同理,y指示标定板的在画面的上下位置,size表示标定板在视野中的距离,也可以理解为标定板离摄像头的远近。skew为标定板在视野中的倾斜位置。每次移动之后,请保持标定板不动直到窗口出现高亮提示。
  • 直到条形变为绿色。当calibration按钮亮起时,代表已经有足够的数据进行摄像头的标定,此时请按下calibration并等待一分钟左右,标定界面会变成灰色,无法进行操作,属于正常情况。
    在这里插入图片描述
  1. 获得标定结果:
  • 在标定完成后,终端会输出校正结果。如下所示:
    在这里插入图片描述
    其中,K为相机内参矩阵,distortion为畸变系数矩阵。
    camera matrix:摄像头的内部参数矩阵
    distortion:畸变系数矩阵
    rectification:矫正矩阵,一般为单位阵
    projection:外部世界坐标到像平面的投影矩阵
  • 点击SAVE按钮。
    在这里插入图片描述
  • 如果对标定结果满意,点击COMMIT按钮将结果保存到默认文件夹,终端输出如下信息,说明标定结果已经保存在相应文件夹下。下次启动usb_cam节点时,会自动调用。
    ('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
    在这里插入图片描述
    其中ost.yaml文件即为相机内参的标定文件。

拓展(Autoware的相机内参标定):

上述操作均为使用官方的usb_cam驱动和camera_calibration包进行标定,获得的标定文件格式和使用Autoware得到的略有不同。因此,若后续还需利用Lidar和camera进行外参的联合标定,则建议使用Autoware中的相机内参标定程序来完成,步骤如下(Autoware的安装可参考之前的博客):

  1. 启动摄像头驱动节点:
rosrun usb_cam usb_cam_node

此时发布的图像topic为:/usb_cam/image_raw

  1. 运行Autoware的相机标定节点:
cd autoware.ai
source install/setup.bash
rosrun autoware_camera_lidar_calibrator cameracalibrator.py --size 7x9 --square 0.1 image:=/usb_cam/image_raw camera:=/camera --no-service-check 

在这里插入图片描述

  1. 标定完成后,点击SAVE按钮,标定结果会保存在home文件夹下,名称类似为20200809_1639_autoware_camera_calibration.yaml:
    在这里插入图片描述
  • 也可参考此博客利用SmartCAR中的工具进行标定。
  • 29
    点赞
  • 207
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ROS单目相机标定是一种通过使用ROS(机器人操作系统)来校准单目相机的方法。校准相机的目的是确定相机的内部参数(例如焦距和畸变系数),以便在图像处理和计算机视觉应用中正确地测量和估计物体的位置和大小。为了进行ROS单目相机标定,可以参考ROS Wiki提供的教程。首先,需要安装相应的ROS软件包,例如使用以下命令安装ROS Melodic版本的相机标定软件包: sudo apt-get install ros-melodic-camera-calibration 然后,确保相机已经通过ROS发布了图像,可以使用以下命令列出ROS主题以检查图像是否已发布: rostopic list 通过执行以上步骤,您就可以开始进行ROS单目相机标定了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ROS单目相机标定](https://blog.csdn.net/weixin_44709392/article/details/124169293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [1.ROS机器视觉:单目摄像头的调用与标定](https://blog.csdn.net/wzfafabga/article/details/127206880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值