基于ROS环境的相机标定教程

news2025/1/10 1:51:24

一、参考资料

ROS学习——利用电脑相机标定

二、安装usb_cam驱动包

usb_cam - ROS Wiki
GitHub - ros-drivers/usb_cam: A ROS Driver for V4L USB Cameras

usb_cam包用于读取图像。

1. 源码安装usb_cam

usb_cam用于实时SLAM,配合ROS平台使用。

1.1 下载usb_cam源码

cd catkin_ws/src

git clone https://github.com/ros-drivers/usb_cam.git
或者
git clone https://github.com/bosch-ros-pkg/usb_cam.git

cd ..
catkin_make
source ~/catkin-ws/devel/setup.bash

1.2 编译安装usb_cam

cd usb_cam
mkdir build
cd build
cmake ..
make

2. apt安装usb_cam

安装相机标定包camera_calibration,把kinetic改成自己的ros版本。

sudo apt-get install ros-kinetic-usb-cam

安装好 usb_cam 包后,在 /opt/ros/kinetic/share/usb_cam/launch 中会存在 usb_cam-test.launch 文件,在该文件中启动两个ROS节点,usb_cam_nodeimage_view

3. usb_cam-test.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="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  </node>
</launch>

参数解释

  • /dev/video0 是默认摄像头的编号,可以根据具体情况更改。

    查看摄像头的指令:ls /dev/video*

2. 启动usb_cam相机驱动节点

rosrun usb_cam usb_cam_node

4. 启动相机

运行usb_cam中的launch文件,如果可以成功运行,且能看到图像则安装成功。

roslaunch usb_cam usb_cam-test.launch

如果成功启动后,会发布一系列的topic:

rostopic list

# 输出
/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
/usb_cam/image_raw/theora
/usb_cam/image_raw/theora/parameter_descriptions
/usb_cam/image_raw/theora/parameter_updates

其中,usb_cam 是一个名字空间。

5. 显示相机图像

rosrun image_view image_view image:=/usb_cam/image_raw

三、相机标定(单目)

单目标定:How to Calibrate a Monocular Camera
双目标定:How to Calibrate a Stereo Camera

camera_calibration - ROS Wiki
Camera Calibration and 3D Reconstruction
ROS&OpenCV下单目和双目摄像头的标定与使用

ROS官方提供了用于单目、双目标定的 camera_calibration 包,这个包是使用opencv里的张正友标定法。

1. 安装camera_calibration

安装相机标定包camera_calibration,把kinetic改成自己的ros版本。

rosdep install camera_calibration
或者
sudo apt-get install ros-kinetic-camera-calibaration
rostopic list

# 输出
/camera/camera_info
/camera/image_raw

2. 相机标定关键步骤

2.1 准备标定板

calib.io

2.2 启动相机标定包

camera_calibration
cameracalibrator.py

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0254  image:=/usb_cam/image_raw camera:=/usb_cam

参数解释

  • –size:表示内角点的size;
  • –square:指定方格的尺寸,我们使用的是A4纸打印的黑白格,尺寸为25.4 mm=0.0254 m;
  • image:表示使用的是来哪个Topic的图像数据。

2.3 移动标定板

标定开始后,在GUI屏幕的右侧,可以看到标有X、Y、Size和Skew的条形控件。不停地移动标定板,当条形控件被绿色填满,意味着校准完成。在校准过程中,需要将棋盘对着相机视野,朝着左/右/上/下/前/后移动,还需要倾斜棋盘。

  • X控件:表示标定板在相机视野中的左右移动;
  • Y控件:表示标定板在相机视野中的上下移动;
  • Size控件:表示标定板在相机视野中的前后移动,可以理解为标定板离相机的远近;
  • skew:标定板在相机视野中的倾斜转动;
    在这里插入图片描述

2.4 计算CALIBRATE标定

所有条形控件变为绿色,CALIBRATE 按钮由灰色变为深绿色,则标定完成,点击 CALIBRATE 开始标定计算,过程大约1-2分钟。标定成功后,右边三个按钮全量(全部变为绿色),此时终端会显示相机的各个参数。
在这里插入图片描述

2.5 保存SAVE标定数据

点击SAVE 按钮,标定结果保存路径为:/tmp/calibrationdata.tar.gz

2.6 查看标定数据

解压并打开 calibrationdata.tar.gz,可以看到标定的图片和标定好的数据文件ost.txtost.yamlost.yaml 文件可以提取出来改名为任意名称,例如 left.yamlright.yaml

3. 解析ost.yaml

ost.yaml 是相机内参的标定文件,又称为校正数据文件

image_width: 640
image_height: 480
camera_name: camera
camera_matrix:
  rows: 3
  cols: 3
  data: [ 581.88585,    0.     ,  314.2472 ,
            0.     ,  592.27138,  210.27091,
            0.     ,    0.     ,    1.     ]
camera_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [0.221666, -0.575455, -0.014215, 0.003895, 0.000000]
rectification_matrix:
  rows: 3
  cols: 3
  data: [ 1.,  0.,  0.,
          0.,  1.,  0.,
          0.,  0.,  1.]
projection_matrix:
  rows: 3
  cols: 4
  data: [ 591.88599,    0.     ,  315.96148,    0.     ,
            0.     ,  603.39893,  205.72873,    0.     ,
            0.     ,    0.     ,    1.     ,    0.     ]

参数解释

  • image_widthimage_height:表示图片的长宽;
  • camera_name:相机名称;
  • camera_matrix:相机内参矩阵;
  • distortion_model:指定畸变模型的类型;
  • distortion_coefficients:畸变系数矩阵;
  • rectification_matrix:矫正矩阵,一般为单位阵;
  • projection_matrix:世界坐标到像平面的投影矩阵;

4. 图像去畸变

有了校正数据后,可以使用 image_proc 包提供的功能来对相机图像进行去畸变。image_proc 会从指定的 topic 上提取相机校正参数,这个topic默认为 /xxx_cam/camera_infoxxx_cam 是名字空间,可以指定,例如:

ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

image_proc 会将处理后的图像发布到 /xxx_camera/image_rectimage_rect_colorimage_rect 是灰度图像,image_rect_color 是彩色图像。

如何将yaml校正数据文件发布到 /xxx_camera/camera_info 话题?对于单目相机比较简单,在启动 usb_cam 时,为其指定 camera_info_url 参数即可,camera_info_url 参数则指向yaml校正数据文件。修改 usb_cam-test.launch 文件,在其中添加如下:

<param name="camera_info_url" type="string" value="file://$(find usb_cam)/ost.yaml" />
<!-- param name="camera_info_url" type="string" value="file:///home/yoyo/ost.yaml" / -->

这样在 usb_camera 启动时会加载该相机的yaml校正数据文件。其实,usb_camera 是调用了 camera_info_manager 包提供的 CameraInfoManager 类来读取yaml校正参数文件并发布。

5. 总结

  1. 当标定板(棋盘格)上出现彩色线条时,表明当前画面被有效捕捉;
  2. 当标定板差不多占满相机界面时,捕捉图像成功率最高;
  3. 每次移动之后,请保持标定板不动直到窗口出现高亮提示;
  4. 为了得到一个好的标定结果,应该让标定板尽量出现在相机视野的各个位置。让标定板在视野的左边、右边、上边、下边、倾斜、水平等,多移动标定板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1020433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux初阶】信号入门 | 信号基本概念+信号产生+核心转储

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;Linux信号的基本概念&#xff08;生活信号、技术信号、信号生命周期、信号的保存位置和发送本质&#xff09;&…

Pytorch-MLP-CIFAR10

文章目录 model.pymain.py参数设置注意事项运行图 model.py import torch.nn as nn import torch.nn.functional as F import torch.nn.init as initclass MLP_cls(nn.Module):def __init__(self,in_dim3*32*32):super(MLP_cls,self).__init__()self.lin1 nn.Linear(in_dim,1…

RFID自动识别技术在数控工具系统的应用

RFID是一种自动识别技术&#xff0c;最早是应用在二战中进行敌我侦察机的识别&#xff0c;但是随着民用通信技术的放开&#xff0c;近年来网络通信技术以及信息安全技术都取得了重大的发展&#xff0c;RFID技术也逐渐在民用领域应用。 RFID自动识别技术在数控工具系统的应用 1、…

浅谈PDM与MES系统集成

摘要&#xff1a; 目前MES在制造行业变得炙手可热&#xff0c;然而很多企业都忽视了数据的源头&#xff0c;MES作为生产执行的信息化系统&#xff0c;我们该如何让其在企业中成功的实施&#xff0c;发挥更大的作用&#xff0c;这还需要PDM系统的支撑。本文就PDM与MES集成进行简…

css前端面试题(三)

文章目录 1、可继承属性和不可继承属性字体系列属性文本系列属性元素可见性列表布局属性光标属性 2、link和import的区别3、css优化4、 CSS预处理器/后处理器是什么&#xff1f;为什么要使用它们&#xff1f;5、单行、多行文本溢出隐藏6、实现一个扇形7、实现一个自适应的正方形…

【Axure高保真原型】人物卡片多条件搜索案例

今天和大家分享人物卡片多条件搜索的原型模板&#xff0c;我们可以输入姓名或者选择部门、岗位来快速筛选出对应的人物信息卡片。那这个模板是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要在中继器表格导入图片和填写对应内容&#xff0c;即可自动生成交互效…

1600*A. LCM Challenge(数论 || 找规律)

解析&#xff1a; n<3&#xff0c;特判 n为奇数&#xff0c;则n、n-1、n-2必定互质&#xff0c;所以结果即为三者之和。 n为偶数&#xff0c; 不会严格证明原因&#xff0c;但是找找规律&#xff0c;是这样的...... #include<bits/stdc.h> using namespace std; #de…

ros----发布者和订阅者模型

话题模型&#xff1a; 如何自定义话题消息 1.定义msg文件 2.在package.xml中添加功能包依赖 <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>3.在CMakeList.txt文件中添加编译选项 4.编译生成语言的相…

网络工程师是干什么的?常见岗位有哪些?

网络工程师是做什么工作&#xff1f; 网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。一般来说&#xff0c;分硬件网络工程师和软件网络工程师两大类&#xff0c;硬件网络工程师以负责网络硬件等物理设备的维护和通信&#xff1b;软件网络工程师负责系统软件…

LeetCode(力扣)509. 斐波那契数Python

LeetCode509. 斐波那契数 题目链接代码 题目链接 https://leetcode.cn/problems/fibonacci-number/ 代码 class Solution:def fib(self, n: int) -> int:if n 0:return 0dp [0] * (n 1)dp[0] 0dp[1] 1for i in range(2, n 1):dp[i] dp[i - 1] dp[i - 2]return d…

IM即时通讯系统[SpringBoot+Netty]——梳理(总)

文章目录 一、为什么要自研一套即时通讯系统1、实现一个即时通讯系统有哪些方式1.1、使用开源产品做二次开发或直接使用1.2、使用付费的云服务商1.3、自研 2、如何自研一套即时通讯系统2.1、早期即时通讯系统是如何实现2.2、一套即时通讯系统的基本组成2.3、当下的即时通讯系统…

【milkv】st7735驱动

前言 本文介绍milkv-duo加载st7735的lcd屏幕&#xff0c;以及屏幕显示log。 参考文章&#xff1a; 记录为Linux配置spi屏幕&#xff08;st7735s&#xff09; https://community.milkv.io/t/milk-v-duo-spi-st7789/131 一、电路图 1.1 pin设置 打开spi2的引脚 duo-buildroot…

@Transactional失效场景/原因

文章目录 1.Transactional注解在非public方法上2.Transactional使用propagation设置错误&#xff08;有3种会失效&#xff09;3.Transactional使用rollbackFor设置错误4.A方法没有使用Transactional调用了B&#xff08;有被注解&#xff09;方法5.try catch了异常6.数据库引擎不…

AI绘制流程图

1、工具&#xff1a; 使用https://chat.openai.com/c/45a81a53-cced-43f7-be3e-e5e80f1e994fFlowchart Maker & Online Diagram Software 2、使用plantuml的过程&#xff1a; 复制代码&#xff0c;打开diagram.net&#xff0c;点击加号→高级→ plantUML&#xff0c;替换掉…

已解决 Go Error: cannot use str (type string) as type int in assignment

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

【openKylin】OpenKylin1.0 x86_64 VMWare安装手册

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型

9月13日-9月14日 Gartner全球应用创新及商业解决方案峰会在伦敦举行 本届峰会以“重塑软件交付&#xff0c;驱动业务价值”为主题&#xff0c;全球1000多位业内专家交流最新的企业应用、软件工程、解决方案架构、集成与自动化、API等企业IT战略和新兴技术热门话题。 9月13日…

【结构体类型——详细讲解】

结构体 1.结构体类型声明 1.1结构体的概念 结构体是⼀些值的集合&#xff0c;这些值称为成员变量。结构体的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list; }variable-list;例如描述⼀个学⽣&#xff1a; struct Stu { char name[20]; //名字 i…

337.打家劫舍III

337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个…

SpringSecurity 入门

文章目录 Spring Security概念快速入门案例环境准备Spring配置文件SpringMVC配置文件log4j配置文件web.xmlTomcat插件 整合SpringSecurity 认证操作自定义登录页面关闭CSRF拦截数据库认证加密认证状态记住我授权注解使用标签使用 Spring Security概念 Spring Security是Spring…