【ROS】usb_cam相机标定

2023-11-19

1. 唠叨两句

当我们要用相机做测量用途时,就需要做相机标定了,不然得到的计算结果会有很大误差,标定的内容包括三部分:内参,外参还有畸变参数。所以标定的过程就是要求得上面这些参数。
以前弄这个事估计挺麻烦,需要做实验和计算才能得到,现在通过ros的开源包几分钟就能完成相机标定,感激!
具体的内外参和畸变系数的说明,可以看看Reference里面的第一个链接,写得很详细。

2. 准备工作

要准备三样东西:

  • usb_cam的ROS启动包
  • 相机标定的ROS包
  • 还有一个用于标定的棋盘格

1)usb_cam启动包
使用我上传的usb_cam版本,不知道为什么用GitHub下载的版本不行,这个usb_cam版本也是别人发的,很奇怪,之后有时间可以研究一下,看看有什么不同,它们两个包都可以打开摄像头,就是用GitHub的版本打开后,apriltag_ros不输出正确的数值。下载点这里

下载解压后,放到对应的work space中src文件里面,例如catkin_ws
然后用catkin_make编译
然后用ls /dev/video*看看usb摄像头的编号,如果

will@will-Dell-G15-5511:~/omni_ws$ ls /dev/video*
/dev/video0  /dev/video1  /dev/video2  /dev/video3

我的笔记本上有webcam又连了一个外接的摄像头,实际是两个摄像头有四个编号,其实只用0和2就行,分别对应webcam和usb cam,其他两个用不了,然后修改 usb_cam/launch/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>

主要就是修改里面的 <param name="video_device" value="/dev/video0" />这一项就行,默认是0,改成/dev/video2就行

然后启动roslaunch usb_cam usb_cam-test.launch

有图像出来就成功了。
usb_cam

2)ROS的相机标定包
很方便,直接apt-get就能下载使用:
sudo apt-get install ros-melodic-camera-calibration

3)打印棋盘格
可以到Google或Baidu上搜一个,像下面这样的
chess box
然后弄清楚两个事情就行:
第一个,就是这个棋盘格的size,比如上图这个是一个4x6的,就数四个格子的交点一行有几个,和一列有几个就行
第二个,确定格子的大小,要根据打印出来的结果进行测量,上面这张图,我用A4纸打印,打印出来的格子边长是0.026m,也就是2.6cm,还要量一下格子的长宽,看看是不是真的是正方形。
确定上面这两点很重要,后面的输入会用到

3. 开始标定

先启动相机,再启动标定程序
roslaunch usb_cam usb_cam-test.launch
rosrun camera_calibration cameracalibrator.py --size 4x6 --square 0.026 image:=/usb_cam/image_raw camera:=/usb_cam
上面第二条指令就是启动标定程序的,里面需要输入棋盘的size和square对应的就是上面提到的两个数值

然后就会看到如下的界面:
UI在标定程序的界面能看到右侧有X Y Size Skew 还有CALIBRATE, SAVE 和COMMIT的标识
X:表示标定板在视野中的左右位置
Y:表示标定板在视野中的上下位置
Size:表示标定板在视野中的尺寸大小,其实就是离相机的远近
Skew:表示标定板在视野中的倾斜角度

打开程序后,就可以开始调整标定板的位置,让它在相机视野中各个位置移动和转动,让X Y Size和Skew这四个值下面的长条变成绿色,然后就可以看到CALIBRATE这个按钮变成青色,点击就会开始计算相机的参数,这个过程需要等一会,耐心等待
calibrate
当计算完毕,就可以在terminal中看到如下数据
terminal
然后SAVE按钮也会变成青色,点击SAVE按钮就会把数据保存到默认的目录下.
save
这个目录在/tmp/calibrationdata.tar.gz

path
打开这个压缩包,里面有刚刚采集的图片,还有保存相机的参数,如下:
zip
把里面的这个ost.yaml解压放到usb_cam的src目录下,然后改下名字,比如camera_calibration20220531.yaml,我喜欢把这些配置文件放到一个文件夹里,然后记下路径

然后就是最后一步了,打开launch文件,加多一行导入相机参数:

<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video2" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_info_url" value="package://usb_cam/camera_info/camera_calibration20220531.yaml"/>
    <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>

之后照常用roslaunch启动usb cam就可以了,然后可以对比一下标定前后的测量结果,会发现精度有了很大提升。

Reference

  1. Step1:模型 16个相机参数(内参、外参、畸变参数):
    https://blog.csdn.net/weixin_43206570/article/details/84797361
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ROS】usb_cam相机标定 的相关文章

随机推荐

  • 高可用集群(1)- Pacemaker+Corosync实现负载均衡和高可用

    1 问题引入 计算机集群可用于提供高可用性服务或资源 多台机器的冗余是用来防止多种类型的故障 集群将使用Pacemaker和Corosync提供资源管理和消息传递 下面将介绍所需的包和对其配置文件的修改 以及使用Pacemaker命令行工具
  • 循环的断点调试,指定第几次循环

    循环的断点调试 指定第几次循环 右击断点添加条件 断点要设置在条件之后 例如本次 想要i 3的时候的循环 条件要设到i后边 令i 3 回车 再按F5即可
  • CSS 学习笔记(基础)

    用来控制网页表现的语言 CSS Cascading Style Sheet 层叠样式表 然后我们继续看看 W3C 标准 结构 HTML 表现 CSS 行为 JavaScript CSS导入方式 选择器 属性 由于网页的框架结构是由HTML实
  • pydantic学习与使用 ------ 基本模型(BaseModel)使用

    前言 在 pydantic 中定义对象的主要方法是通过模型 模型继承 BaseModel pydantic主要是一个解析库 而不是验证库 验证是达到目的的一种手段 建立一个符合所提供的类型和约束的模型 换句话说 pydantic保证输出模型
  • Google FlatBuffers——开源、跨平台的新一代序列化工具

    前段时间刚试用了一个序列化工具cereal 请看 cereal C 实现的开源序列化库 打算再总结下我对google proto buf序列化库的使用呢 结果还没动手 大Google又出了一个新的 开源 跨平台的序列化工具 FlatBuff
  • ubuntu14 扩容的痛苦经历,在这里为大家献上我的过程(附带有gparted-live-0.25.0-3-i686下载地址)

    参考文档 https www linuxidc com Linux 2015 08 121674 htm VMware11下对虚拟机Ubuntu14 10系统所在分区sda1进行磁盘扩容 http www nxpic org module
  • CSS 语法

    CSS 规则集 rule set 由选择器和声明块组成 选择器指向您需要设置样式的 HTML 元素 声明块包含一条或多条用分号分隔的声明 每条声明都包含一个 CSS 属性名称和一个值 以冒号分隔 多条 CSS 声明用分号分隔 声明块用花括号
  • 提高情商6步法

    目录 1 识别与洞察 2 自制与表达 3 共情与共鸣 4 尊重与善意 5 认同与化解 戈尔曼把情商概括为以下五个方面的能力 认识自身情绪的能力 妥善管理情绪的能力 自我激励的能力 认识他人情绪的能力 管理人际关系的能力 1 识别与洞察 感知
  • Linux环境 Mysql安装详解

    Linux环境 Mysql安装详解 前言 mysql作为被广泛使用的数据库 安装的必要性是无需质疑的 而本人在多次安装中遇到了情况各异的问题 所以想以这篇文章记录一下安装配置的过程 并且尽量详细介绍每一步的原因 如果再遇到问题 知其然且知其
  • Inno打包后开始运行前检查文件是否存在

    Code function FileDoesNotExist file string Boolean begin if FileExists file then begin Result False end else begin Resul
  • Javascript高级程序设计——4.运算符

    运算符 1 一元运算符 2 算术运算符 3 关系运算符 4 相等运算符 全等运算符 5 逻辑运算符 6 位运算符 省略 不详细介绍 7 赋值运算符 8 其他运算符 9 运算符优先级 在ECMAScript与众不同之处在于 运算符可以适用于很
  • Centos7——MHA部署

    目录 基础操作 master操作 slave1操作 slave2操作 manager操作 测试 MHA 故障转移 连续漂移 实现主宕机 从切换为主 保证业务正常运行 环境准备 CentOS Linux release 7 5 1804 Co
  • TSI系统测量参数之:轴向振动

    一 TSI系统测量参数 1 轴向位移 2 盖振或瓦振 3 偏心 4 键相 5 零转速 6 轴向振动 7 相对热膨胀 胀差 8 绝对热膨胀 缸胀 二 各参数作用 2 轴向振动 测量的是大轴相对于轴瓦的X向振动和Y向振动 反馈电压量程为 4V至
  • TikTok已达万粉,开通基金仍失败?--TK领航社TIKTOK运营变现最新干货分享

    播神定期分享TikTok运营技巧 教你从零快速掌握TikTok运营和商业变现 今天与大家探讨下 TikTok已达万粉 创作者基金依旧开通失败 是为什么 TK领航社 国内最大TIKTOK社群 运营变现圈子 TikTok 创作者基金是为回馈优质
  • 如何简单快速的探测民用无人机?

    前言 最近俄乌冲突搞得火热 其中以DJI 无人机为代表的民用无人机表现尤为引人注意 这不禁让人思考 在此类无人机战争中步兵班应如何有效快速的感知民用无人机的存在 提高生存能力 一 民用无人机在冲突中的优势 从目前能搜集到的信息来看有以下几个
  • 软件测试-金融银行项目怎么测?系统业务测试总结分析...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • 计算机的保护模式与实模式

    一 背景 80386开始 CPU有三种工作方式 实模式 保护模式和虚拟8086模式 只有在刚刚启动的时候是real mode 等到操作系统运行起来以后就切换到protected mode 实模式只能访问地址在1M以下的内存称为常规内存 我们
  • java ssm常遇见的问题_ssm增删改查出现的问题总结

    1 org springframework beans factory BeanCreationException Error creating bean with name org mybatis spring mapper Mapper
  • python 多进程进行文件处理(一)

    在文件处理的时候 经常会遇见大文件数据 单进程处理速度太慢 可以通过多进程来提升效率 应用场景一 同时并行处理多个小文件 处理完成后 写回多个文件 def read wiki data infile outfile param1 单个文件的
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro