CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM

最近的工作内容一直是使用鱼眼相机,经过一段时间的使用,做个简单记录:

鱼眼相机标定

鱼眼相机成像原理

  • 普通小视场范围的相机可以用小孔成像模型标示:
    CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM_第1张图片
    这种相机的标定工具一般使用opencv或者MATLAB工具箱标定即可,还是比较简单的

  • 鱼眼相机成像模型:
    鱼眼相机的视场角一般都比较大,我使用的是190度水平视场角的相机,其物理结构如下:
    CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM_第2张图片
    成像过程:
    CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM_第3张图片
    由相机结构和成像过程决定了鱼眼相机与普通相机有很大不同,鱼眼相机由于视场角非常大,那么图像越靠近边缘,畸变越大。CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM_第4张图片

鱼眼相机的标定:

我使用的标定工具师OCamCalib:

  • 下载链接:官方地址,github
  • 使用方法:OCamCalib的使用方法
  • 标定产生的文件:
%YAML:1.0
Camera.Iw: 1280
Camera.Ih: 800

Camera.nrpol: 5
Camera.a0: -404.3966
Camera.a1: 0
Camera.a2: 0.001060063
Camera.a3: -1.721493e-06
Camera.a4: 2.419325e-09

Camera.nrinvpol: 13

Camera.pol0: 648.606
Camera.pol1: 351.983
Camera.pol2: -65.7989
Camera.pol3: 65.4013
Camera.pol4: 32.0489
Camera.pol5: 38.7709
Camera.pol6: 166.325
Camera.pol7: -289.897
Camera.pol8: -1098.52
Camera.pol9: -1211.87
Camera.pol10: -654.942
Camera.pol11: -178.69
Camera.pol12: -19.7471

Camera.c: 0.9999787
Camera.d: -2.287345e-05
Camera.e: -0.000590995

Camera.u0: 637.4669
Camera.v0: 371.9346

Camera.fx: 160.000
Camera.fy: 160.000
Camera.fov: 190
CubeFace.w: 1280
CubeFace.h: 800

CubeMapSLAM简介

处理流程:

在使用大视场角的鱼眼相机时,靠近边缘处的畸变异常的大,为了能尽量用上这部分的信息,将图像分为前,上,下,左,右五个面,分别投影,每个面也就是单位平面:
CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM_第5张图片
一般相机图像矫正使用小孔模型,使用上也就是:图像坐标—>归一化平面坐标(投影到深度为1的平面);
在鱼眼相机模型中,是:图像坐标---->归一化到球面(向量方向向量的模长为1);
cubeMap矫正是:图像坐标—>归一化球面—>五个归一化平面;
使用这种矫正在slam流程与ORB_SLAM一致,只是在优化、初始化中对于坐标表示做了相应调整,对不同面的图像坐标,在求重投影误差时均要根据各个面做不同的转换。
CubeMapSLAM:一种利用立方体映射矫正鱼眼的单目SLAM_第6张图片
从作者测试情况看,效果比一般鱼眼矫正要好,因为充分应用到了鱼眼相机大视野的好处,同时也一定程度上减小了畸变的影响。详细内容可读paper,以及相关代码:github

你可能感兴趣的:(SLAM)