当前位置:网站首页>【ROS】usb_cam相机标定
【ROS】usb_cam相机标定
2022-07-06 08:22:00 【Will_Ye】
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摄像头的编号,如果
[email protected]:~/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
有图像出来就成功了。
2)ROS的相机标定包
很方便,直接apt-get就能下载使用:sudo apt-get install ros-melodic-camera-cibration
3)打印棋盘格
可以到Google或Baidu上搜一个,像下面这样的
然后弄清楚两个事情就行:
第一个,就是这个棋盘格的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对应的就是上面提到的两个数值
然后就会看到如下的界面:在标定程序的界面能看到右侧有X Y Size Skew 还有CALIBRATE, SAVE 和COMMIT的标识
X:表示标定板在视野中的左右位置
Y:表示标定板在视野中的上下位置
Size:表示标定板在视野中的尺寸大小,其实就是离相机的远近
Skew:表示标定板在视野中的倾斜角度
打开程序后,就可以开始调整标定板的位置,让它在相机视野中各个位置移动和转动,让X Y Size和Skew这四个值下面的长条变成绿色,然后就可以看到CALIBRATE这个按钮变成青色,点击就会开始计算相机的参数,这个过程需要等一会,耐心等待
当计算完毕,就可以在terminal中看到如下数据
然后SAVE按钮也会变成青色,点击SAVE按钮就会把数据保存到默认的目录下.
这个目录在/tmp/calibrationdata.tar.gz
打开这个压缩包,里面有刚刚采集的图片,还有保存相机的参数,如下:
把里面的这个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
- Step1:模型 16个相机参数(内参、外参、畸变参数):
https://blog.csdn.net/weixin_43206570/article/details/84797361
边栏推荐
- China vanadium battery Market Research and future prospects report (2022 Edition)
- Hcip day 16
- sys.argv
- leetcode刷题 (5.29) 哈希表
- Pyqt5 development tips - obtain Manhattan distance between coordinates
- Wincc7.5 download and installation tutorial (win10 system)
- Introduction to number theory (greatest common divisor, prime sieve, inverse element)
- Sort according to a number in a string in a column of CSV file
- How to use information mechanism to realize process mutual exclusion, process synchronization and precursor relationship
- Colorlog combined with logging to print colored logs
猜你喜欢
On the day of resignation, jd.com deleted the database and ran away, and the programmer was sentenced
[research materials] 2021 Research Report on China's smart medical industry - Download attached
Golang DNS 随便写写
Golang DNS write casually
2022.02.13 - NC003. Design LRU cache structure
Summary of phased use of sonic one-stop open source distributed cluster cloud real machine test platform
Yyds dry goods inventory three JS source code interpretation eventdispatcher
MySQL learning records 12jdbc operation transactions
NFT smart contract release, blind box, public offering technology practice -- contract
Configuring OSPF load sharing for Huawei devices
随机推荐
Erc20 token agreement
leetcode刷题 (5.29) 哈希表
[2022 广东省赛M] 拉格朗日插值 (多元函数极值 分治NTT)
Introduction to backup and recovery Cr
堆排序详解
wincc7.5下载安装教程(Win10系统)
【刷题】牛客网面试必刷TOP101
2022.02.13 - NC003. Design LRU cache structure
MFC sends left click, double click, and right click messages to list controls
Colorlog combined with logging to print colored logs
从 SQL 文件迁移数据到 TiDB
1202 character lookup
Personalized online cloud database hybrid optimization system | SIGMOD 2022 selected papers interpretation
JVM performance tuning and practical basic theory - Part 1
Tidb backup and recovery introduction
IoT -- 解读物联网四层架构
2022 Inner Mongolia latest construction tower crane (construction special operation) simulation examination question bank and answers
ESP系列引脚說明圖匯總
China Light conveyor belt in-depth research and investment strategy report (2022 Edition)
指针和数组笔试题解析