Ubuntu20.04在ROS中使用摄像头标定


一、ROS中使用摄像头

在ROS中使用摄像头的前提是,摄像头在Linux系统下是可识别的,通常来说UVC协议的USB摄像头都可以正常使用,大部分笔记本电脑自带的摄像头都是UVC协议的,所以也是可以直接使用的。
对于一些具有CSI或者MIPI接口的嵌入式板卡,在接入对应接口的摄像头后可能也可以使用,但不是绝对的。
例如树莓派接入CSI摄像头后启用bcm2835-v4l2驱动可以正常使用,但是JetsonNano使用CSI摄像头就不可以通过本文的方法驱动。

1.1 验证摄像头设备可用

使用命令 ls /dev/ 检查当前设备列表
如果设备列表中有video*设备,则摄像头设备在当前系统中有被正确的识别。
在这里插入图片描述

如果使用虚拟机,需要将摄像头设备连接到虚拟机中。

博主使用的是Ubuntu20.04的版本,点击 虚拟机->可移动设备->Acer Intergrated Camera 即可点击,再次检查,发现相机已添加
在这里插入图片描述

检查有video设备后可以使用Ubuntu下的拍照软件cheese进一步验证

1.2 安装cheese

sudo apt install cheese

在这里插入图片描述

1.3 在虚拟机设置中将usb兼容性改成3.1

此为关键一步,网上很多教程中都没有提到, 如果不改会导致画面黑屏
在这里插入图片描述

1.4 测试

输入 cheese 命令成功打开摄像头,拍照软件能显示摄像头画面就基本稳了
在这里插入图片描述

二、获取摄像头驱动包

ROS下摄像头的驱动包有多款,这里以常用的两款为例:

2.1 usb_cam

usb_cam可以通过apt方式直接安装二进制包,如果使用其他版本的ROS,自行替换命令中的noetic字段

sudo apt install ros-noetic-usb-cam

安装没有报错即为完成

2.1.1 rosrun方式运行

先启动roscore,然后运行驱动节点usb_cam_node

roscore
rosrun usb_cam usb_cam_node 

启动节点后终端中可能会报如下的警告,可以忽略,实测不影响使用
在这里插入图片描述
摄像头启动后启用rqt工具查看图像

rqt_image_view

选择正确的话题即可预览到摄像头的画面

在这里插入图片描述

2.1.2 roslaunch方式运行

usb_cam包中提供了一个launch文件例程usb_cam-test.launch

roslaunch usb_cam usb_cam-test.launch

在这个launch文件中除了启动usb_cam_node节点外还会包含一个image_view用于预览摄像头画面

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

三、摄像头标定(camera calibration)

3.1 为什么要标定

普通相机成像误差的主要来源有两部分,第一是相机感光元件制造产生的误差,比如成
像单元不是正方形、歪斜等;第二是镜头制造和安装产生的误差,镜头一般存在非线性的径
向畸变。
在对相机成像和三维空间中位置关系对应比较严格的场合(例如尺寸测量、视觉 SLAM等)就需要准确的像素和物体尺寸换算参数,这参数必须通过实验与计算才能得到,求解参数的过程就称之为相机标定。

在这里插入图片描述

3.2 标定前准备

3.2.1 标定板

在执行摄像头标定前,需要先准备一块标定板。
标定板有两种获得方法,第一种是采购成品的标定板,A4纸大小的标定板通常价格在300~400的样子。

如果不想采购,可以使用打印机将下面的文件按照1:1打印在A4纸上,然后贴在一块纯平的版上,例如亚克力板。

打印的标定板缺点在于,第一打印机的精度有限,边缘可能会产生模糊,另外就是在粘贴时很难做到极高的平整度,这两项都会对标定结果产生一定的影响,但是优点时便宜易得。

3.2.2 摄像头调焦

标定只针对手动对焦的相机,自动对焦的相机由于焦距变化,难以形成固定的标定参数。
相机在标定前,需要调整好焦距(拧镜头),使成像清晰,并将当前焦距固定住,防止焦距产生变化。

3.3 标定摄像头

标定需要用到camera_calibration功能包,可以通过apt方式安装。

sudo apt install ros-noetic-camera-calibration

安装完成后启动相机

roscore
rosrun usb_cam usb_cam_node

然后启动标定节点,启动这个节点传入的参数比较多,拆分来看一下

–size 11x8 用于指明标定板的内角点数量,如下图每个红圈的位置就是一个内角点,我所使用的GP290标点板有横向有11个内角点,纵向有8个内角点。需要注意的时11x9中的‘x’时小写的英文字母‘x’,不是数学符号‘*’。
使用时根据你所使用标定板实际尺寸修稿
在这里插入图片描述

下图是博主自己打印的A4纸标定,每个方块的边长0.02m,内角为9*6

在这里插入图片描述

–square 0.02 指明标定板中每个方块的边长0.02m,即2cm,根据你所使用标定板实际尺寸修稿
image:=/usb_cam/image_raw 指明图像话名。根据你实际使用的相机驱动节点产生的话题名做修改

rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.02 image:=/usb_cam/image_raw

标定启动后会出现这样的界面

拿着标定板放在相机视野内,标定板上出现彩色线条则为有效图像,反之无效,需要调整标定板位置。
分别在左右移动(X),直到标定界面上X下方的精度条为绿色,然后依次在上下(Y),远近(Size),倾斜(Skew)方向移动,移动过程尽量缓慢,避免大幅度的移动使相机成像产生拖影。持续移动直到所有的进度条都为绿色。

在这里插入图片描述在这里插入图片描述

当所有进度条都变成绿色后,CALIBRATE按钮由灰色变成深绿色,点击CALIBRATE,点击一下后,界面会卡住,此时不要做任何操作,直到运行标定程序的终端输出标定的结果,大概是这样的。

在这里插入图片描述

标点完成后再将标定板放在相机视野内,右上角会出现标定结果的线性误差,通常这个值小于0.1或者显示acc都可以认为标定结果可用

在这里插入图片描述
点击标定界面的SAVE按钮,标定结果保存在/tmp/calibrationdata.tar.gz这个压缩包中,打开标定结果的压缩包,里面大概是这些内容,最后一个yaml文件就是我们需要的标定结果。
在这里插入图片描述
在这里插入图片描述

这里需要注意一下,/tmp目录中的文件随时可能会被系统删除,所以最好将标定的结构拷贝到其他目录下。例如我将ost.yaml文件拷贝至用户主目录~中。

3.4 使用标定结果

接下来由于需要编写launch文件,建议你创建一个功能包用于存放文件,例如我使用了我自己编写的catkin_ws功能包。在功能包中创建一个config目录,将在标定中的获得的ost.yaml文件拷贝至config目录

在功能包的launch目录中创建launch文件,例如命名为bingda_camera.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"/>
    <param name="camera_name" value="my_camera"/>
    <param name="camera_info_url" type="string" value="file://$(find bingda_tutorials)/config/ost.yaml"/>
  </node>
</launch>

在launch 文件中,将camera_name修改为my_cameracamera_info_url指向标定文件存放的路径和位置中。

然后将ost.yaml文件中的camera_name参数修改为和launch文件中的camera_name参数一致

image_width: 640
image_height: 480
camera_name: my_camera

现在通过编写luanch文件来启动摄像头

roslaunch src/jubot_demo/launch/bingda_camera.launch 

在这里插入图片描述

使用echo将camera_info话题输出,可以看到摄像头的标定参数已经加载在话题中了

rostopic echo /usb_cam/camera_info

在这里插入图片描述

矫正图像
如果需要使用标定参数矫正图像,可以使用image_proc这个功能包
首先通过apt方式安装

sudo apt install ros-noetic-image-proc

安装完成后运行它,这里加入ROS_NAMESPACE是由于usb_cam这个功能包中发布的话题都带有了/usb_cam这个命名空间,所以为了保证图像和摄像头参数话题能正常的被image_proc节点接收需要给它加上命名空间/usb_cam

ROS_NAMESPACE=usb_cam rosrun image_proc image_proc

运行后打开两个rqt_image_view,分别订阅原始的/usb_cam/image_raw和畸变矫正后的/usb_cam/image_rect_color图像话题,下图是我使用一个广角相机运行的结果,可以看到畸变矫正效果很明显。
如果你使用的是视场角比较小或者标称无畸变的相机,可能对比效果没有这么明显,但是标定过程和广角是一致的。

在这里插入图片描述
运行ROS_NAMESPACE=usb_cam rosrun image_proc image_proc之后,刷新,发现多了很多话题,图中标红的就是矫正之后的
在这里插入图片描述
如果你使用的是视场角比较小或者标称无畸变的相机,可能对比效果没有这么明显,但是标定过程和广角是一致的。


总结

在本实验中,我们学习了如何在Ubuntu 20.04上安装ROS并使用相机标定包对摄像头进行标定。通过进行标定,我们能够获取摄像头的内部参数和畸变系数,从而提高后续机器人视觉应用的测量精度。这对于需要进行摄像头图像处理和几何测量的项目非常重要。使用ROS进行摄像头标定的过程相对简单,只需几个步骤即可完成。最后,我们可以保存标定结果以备将来使用。

参考

ROS调包侠修炼计划

#ROS调包侠#一键修复rosdep报错

利用cheese在Ubuntu(20.04)配置摄像头(VMware虚拟机)

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菲菲QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值