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

2023-05-16

参考:

  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中的工具进行标定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS下采用camera_calibration进行单目相机标定 的相关文章

  • 如何使用Keras fit和fit_generator(动手教程)

    写在前面 被Adrian Rosebrock圈粉后 xff0c 就一直期待他的更新 xff0c 作者每周一更新 xff0c 考虑到时差问题 xff08 作者在美国 xff09 xff0c 一般北京时间周二才能看到 作者根据读者留言中的问题写
  • CMake 的常用命令

    目录 0 CMake常用的命令或函数 xff1a 1 定义项目 project 2 多个目录 add subdirectory 3 常用命令 add executable add library 4 常用命令 改变最终目标文件输出位置 5
  • Libcurl的编译_HTTP/HTTPS客户端源码示例

    HTTP HTTPS客户端源码示例 环境 zlib 1 2 8 openssl 1 0 1g curl 7 36 Author Kagula LastUpdateDate 2016 05 09 阅读前提 xff1a CMake工具的基本使用
  • CNN卷积神经网络原理详解(上)

    CNN卷积神经网络原理详解 xff08 上 xff09 前言卷积神经网络的生物背景我们要让计算机做什么 xff1f 卷积网络第一层全连接层训练 前言 卷积网络 xff08 convolutional network 也叫作卷积神经网络 xf
  • 啥也不会照样看懂交叉熵损失函数

    啥也不会照样看懂交叉熵损失函数 什么是损失函数损失函数的作用有哪些损失函数交叉熵 xff08 Cross Entroy 损失函数 什么是损失函数 损失函数 loss function 是用来估量模型的预测值与真实值的不一致程度 xff0c
  • 可变形卷积从概念到实现过程

    可变形卷积从概念到实现过程 什么是可变形卷积 xff1f 为什么要可变形卷积 xff1f 可变形卷积结构形式 xff1f 可变形卷积的学习过程 xff1f 可变形卷积如何实现 xff1f 上期回顾 卷积神经网络进阶用法 残差网络如何解决梯度
  • 导航定位系统的原理解析(一个小白写给另一个小白)

    导航定位系统的原理解析 xff08 写给小白 xff09 前言 三星 定位基本原理 xff08 导航定位的原理 xff09 传输误差后记 前言 无人驾驶是这几年大火的一个研究方向 xff0c 研究无人驾驶需要了解的知识非常多 xff0c 但
  • 一张图详细说明自动驾驶车辆如何搭建硬件系统

    一张图详细说明自动驾驶车辆如何搭建硬件系统 文章结构说明第一部分 xff08 1 xff09 一图展示自动驾驶硬件系统的总体架构 xff08 2 xff09 庖丁解牛说内容1 线控模块2传感器模块 第二部分 xff08 1 xff09 传感
  • Tensorflow安装教程详解(图文详解,深度好文)

    Tensorflow安装教程详解 xff08 图文详解 xff0c 深度好文 xff09 前言安装前的准备工作关于python关于Anaconda 开始使用Tensorflow系统内配置Anaconda使用路径Anaconda Naviga
  • 二级指针 *(unsigned char**)(buf+0) = (unsigned char*)(buf+1)

    RTT里面的代码 1 rt err t rt mp init struct rt mempool mp 2 const char name 3 void start 4 rt size t size 5 rt size t block si
  • 子类以private方式继承父类

    子类以private方式继承父类 xff0c 则父类的pubic protected接口在子类变为private接口 xff0c 而父类的private接口在子类变为不可访问的接口 xff0c 而且不存在子类到父类的转换 所以子类以priv
  • CNN实战之如何分析影评-好看又有趣的讲解

    CNN实战之如何分析影评 好看又有趣的讲解 前言认识影评数据集了解TextCNN模型获取影评数据生成文本数据集生成TextCNN模型评估模型 前言 话说老王买了两张电影票打算请女神小丽去看电影 xff0c 老王希望看完电影趁着热度可以和小丽
  • 无人驾驶时代的室外组网技术研究

    无人驾驶时代的室外组网技术研究 车载自组网车载自组网简介车载自组网特点车载自组网组成及建构 主流自组网通信方式ZigBeeWIFIBlue ToothWiMAXDSRC4G 5G 参考文献 车载自组网 车辆通信网络就是在汽车上装载移动通信设
  • 这本关于机器学习的书---牛XXX

    机器学习好书推荐 如图所示 xff0c 这是一本可读性非常强 xff0c 非常有趣的一本介绍机器学习概率论的书 xff0c 让人看了会上瘾 看到这里 xff0c 作者摊牌了 本书作者即本人
  • ROS下运行rqt报错

    解决方案 xff1a 从上面可以看到ROS是通过python2 7编译 xff0c 查看自己python版本 xff0c 修改为对应版本即可成功运行rqt和rqt graph
  • zed2相机SDK安装及ROS安装

    一 安装相机SDK 相机SDK即相机的软件开发工具包 1 查看CUDA版本 xff1a nvcc version 2 相机SDK xff08 Software Development Kit xff09 下载网址 xff1a ZED SDK
  • zed2相机标定

    一 标定相机 1 刷新ros工作空间 source devel setup bash 2 打开相机ros节点 roslaunch zed wrapper zed2 launch 3 准备棋盘格标定板 xff0c 修改标定板checkboar
  • zed2相机标定(IMU)

    二 IMU标定 陀螺仪模型 xff1a 其中 xff0c 为陀螺仪测量值 xff1b 为陀螺仪真实值 xff1b 为陀螺仪零偏 xff08 也叫偏置 xff09 xff1b 为陀螺随机噪声项 xff08 包括白噪声和随机游走噪声 xff09
  • zed2相机标定(相机+imu)

    相机和imu单独标定请参考前面的博客 1 准备文件 checkboard yaml相机标定文件camera calibration yamlimu标定文件imu calibration yaml IMU标定文件格式需要改为如下 xff1a
  • Opencv中三个光流跟踪函数

    在slam里 xff0c 光流跟踪判断图像中某一物体的动态性 xff0c 主要包括3个函数 xff1a 1 goodFeaturesToTrack函数 作用 xff1a 提取输入图像中像素级别的角点 xff0c 支持harris角点和Shi

随机推荐

  • 算法:二分查找

    给定一个n个元素有序的 xff08 升序 xff09 整型数组 nums 和一个目标值 target xff0c 写一个函数搜索 nums 中的 target xff0c 如果目标值存在返回下标 xff0c 否则返回 1 1 条件 查找的数
  • 一行代码解决selenium进入抖音出现验证滑块

    我正常从浏览器进入抖音是不出现验证滑块的 xff0c 然后用selenium进入抖音网站发现会出现滑块验证 如下如这是原代码 xff1a 运行代码后就会发现浏览器出现验证滑块 xff0c 这是是因为网站识别出你是使用selenium 这个时
  • 激光点云有关目标检测与目标跟踪的消息定义

    1 jsk recognition msgs BoundingBoxArray msg 安装jsk recognition msgs xff1a sudo apt get install ros melodic jsk recognitio
  • Linefit_ground_segmention文章梳理及代码阅读

    2013年专门针对地面分割的文章 xff1a Fast segmentation of 3D point clouds for ground vehicles 代码链接 xff1a https github com lorenwel lin
  • 使用MFC+GDI编写地图编辑器补充

    使用MFC 43 GDI编写地图编辑器补充 小宝乱猜 在编写MapEdit时我遇到一个问题 xff0c 那就是在程序开始时一切正常 xff0c 但在打开一个地图文件后 xff0c 程序就会因找不到资源文件而画面混乱 调试了半天才发现是相对路
  • 基于select模型的TCP服务器

    之前的一篇博文是基于TCP的服务器和客户机程序 xff0c 今天在这我要实现一个基于select模型的TCP服务器 xff08 仅实现了服务器 xff09 socket套接字编程提供了很多模型来使服务器高效的接受客户端的请求 xff0c s
  • 路由器端口介绍

    路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它需要连接各种网络 xff0c 这样 xff0c 它的接口也就必须多种多样 对于这些 xff0c 不要
  • 光流(Optical Flow)

    光流的概念 光流是一种描述像素随时间在图像之间运动的方法 随着时间流逝 同一个像素会在图像中运动 我们希望追踪他的运动过程 稀疏光流 计算部分像素 稠密光流 计算全部像素 稀疏光流以Lucas Kanade光流为代表 简称LK光流 光流的两
  • 模块化程序 点与圆的关系 类中成员函数的声明和实现分开写入头文件和源文件中

    64 TOC 模块化程序 点和圆的关系 在黑马程序员课程4 1 3成员属性设置为私有 课后案例 点和圆的关系中 谈到了文件的封装 此案例是判断点与圆的关系 xff0c 重点是以另外一个类作为本类中的成员 xff1b 在比较大的开发中 xff
  • c++模板类/模板函数的声明与定义应该放在头文件里

    如果函数模板按照普通的函数声明放在头文件的 xff0c 定义放在 cpp文件 xff0c 会出现错误 xff1a 模板函数声明 定义 引用有什么要注意的问题么 xff1f xff1f mylib h template lt class T
  • checksum-8位和16位校验和代码示例

    span class hljs comment linux 系统编译通过 span span class hljs comment gcc filename c o filename span span class hljs comment
  • 安卓鉴权方式的总结

    HTTP Basic Authentication 这种授权方式是浏览器遵守http协议实现的基本授权方式 HTTP协议进行通信的过程中 xff0c HTTP协议定义了基本认证认证允许HTTP服务器对客户端进行用户身份证的方法 效果 xff
  • 手把手教你使用Vue搭建注册登录界面及前端源码

    文章目录 一 前言二 概况三 搭建注册页面四 改造登录页面四 整体效果动画演示五 前端源码下载六 后续 一 前言 本文将在vue admin template模板基础上完成搭建注册与登录页面 文末处有完整的前端源码下载 环境准备 浏览器 x
  • 从传感器和算法原理讲起,机器人是如何避障的

    导语 xff1a 本文内容来自大道智创CTO邢志伟在雷锋网硬创公开课的分享 xff0c 由雷锋网旗下栏目 新智造 整理 编者按 xff1a 本文内容来自大道智创CTO邢志伟在雷锋网 公众号 xff1a 雷锋网 硬创公开课的分享 xff0c
  • or1200处理器中的特殊寄存器

    以下内容摘自 步步惊芯 软核处理器内部设计分析 一书 OR1200中的寄存器分为两类 xff1a 通用寄存器r0 r31 特殊寄存器 特殊寄存器又分为11组 xff0c 在本书第1 3 3节简单地列出了所有的特殊寄存器组 从列表中可以发现除
  • 基础面试题 :大端、小端及转换方式

    理解网络中大端和小端往往是一道基础面试题 xff0c 这里作为记录和整理 xff0c 希望能帮到大家 目录 前言 一 字节序 二 什么小端顺序 三 什么大端顺序 四 处理器体系所属网络字节顺序 五 大小端转换 1 大端整形转换为小端 2 小
  • RS485——A与B波形与电路分析

    一 理论知识 发送端 AB间的电压差 xff0b 2 xff5e xff0b 6v 逻辑1 xff0d 2 xff5e xff0d 6v 逻辑0 xff1b 接收端 AB间的电压差 大于 xff0b 200mv 逻辑1 小于 xff0d 2
  • vsCode软件安装code runner插件,运行shell脚本,terminal终端不显示运行结果数据

    问题 vsCode软件安装code runner插件 xff0c 运行shell脚本 xff0c terminal终端不显示运行结果数据 原因分析 运行shell脚本 xff0c 没有指定运行的bash环境 解决办法 在Code runne
  • Microsoft Visual C++ Redistributable 与 Visual C++ 的区别与联系?

    Visual Studio xff1a 是一款开发软件 xff0c 即我们俗称的 IDE xff0c 有很多版本 xff0c 如 Visual Studio 2010 Visual C 43 43 xff1a Visual C 43 43
  • ROS下采用camera_calibration进行单目相机标定

    参考 xff1a https blog csdn net learning tortosie article details 79901255https blog csdn net learning tortosie article det