SLAM中常用的相机模型及标定工具

文章浏览阅读3.4k次,点赞5次,收藏33次。最近一段时间准备作多传感器的SLAM研究,第一步是要解决传感器间的联合标定。所要开展实验的机器人平台配置了相机、单线雷达和IMU,自然而然地,首先是要先确定各个传感器的内参数,然后再确定传感器之

最近一段时间准备作多传感器的SLAM研究,第一步是要解决传感器间的联合标定。所要开展实验的机器人平台配置了相机、单线雷达和IMU,自然而然地,首先是要先确定各个传感器的内参数,然后再确定传感器之间的外参数(单线雷达和IMU的内参主要是传感器的测量噪声,这里不作展开,本文仅聚焦于相机的内参标定)。

SLAM中常用的相机模型

(一)Pinhole(针孔相机)

最为简单也最为常见的模型是针孔相机模型,我们所使用的大部分无畸变镜头和广角镜头都可以用该模型来建模。它按照小孔成像原理:同一光线上,射影中心、物体在像平面所成像点与其物理空间点之间构成了一组等比关系,因此可以用一个简单的等比关系来描述。

整个成像转换过程涉及如下几个重要的坐标系:

  1. 世界坐标系: 用于描述物理空间点在世界坐标系下的坐标
  2. 相机空间坐标系: 以摄像机摄影中心为坐标原点,以主光轴正方向为Z轴,X与Y轴分别平行于向平面坐标系的u、v 轴
  3. 相平面坐标系:也即是图像坐标系,习惯以像素阵列的左上角为原点,列作为横轴(u),行作为纵轴(v)
  4. 归一化像平面坐标系: 不像前三个系有物理意义上的对应,这是一个辅助坐标系。但是却很重要,应为畸变与去畸变都是在该坐标系上进行的。并且,该坐标系将三维与二维联系了起来。经3D到2D投影的点将在首先此平面上施加畸变变换,然后再按照内参数矩阵归算到二维像平面坐标系。

3D到2D的一个完整坐标变换过程为:

世界坐标系->相机空间坐标系->归一化像平面坐标系->畸变变换->像平面坐标系

(二)Fisheye(鱼眼相机)

同义词:Fisheye/omni-directional/spherical/panoramic/catadioptric/wide-angle

在大佬木吒的文章中,定义上述在文献中常出现的相机模型为同义词,即鱼眼、全景、球面相机等都是指的同一类相机。它们都是由圆锥曲线镜片所组成的镜头,并且所有的光线经镜头汇聚于同一个点,即摄像机中心,称该性质为single effective viewpoint property。该性质有两个显著的优点:其一是它仍符合多视几何中的对极几何关系;其二是它使得可以方便地建立平面点与空间点的射影关系。

在此类相机的标定中,由于所采用的镜头组合更为复杂,光线的传播用简单的针孔模型不再能很好的描述。因此出现了许多专门针对此类模型建模的文章,其中比较常用的有以下三个模型(此处都以发明者命名,各个库的实现中各有不同,需注意区分):Kannala-brandt, Mei和Scaramuzza。

Kannala-brandt:

该模型于2006年发表于TPAMI,它仍遵照小孔成像过程来建模图像生成过程。不同点在于,光线不再是直线传播,而是再经过透镜后有一定的折射。根据不同的镜头类型,该折射模型可以建模为不同的函数:

[公式]

其中r为像点距离相片中心的距离, θ \theta θ为入射光线与主光轴的夹角, f f f为镜头焦距。以上分别为perspective projection, stereographic projection, equidistance projection, equisolid angle projection以及orthogonal projection的投影模型。下图中,图左所示为上述各个方程在f为1时的投影曲线,图右为镜头的成像投影过程*(可以看到,其与针孔模型的区别在于入射光线发生了弯曲变形)*。
在这里插入图片描述

作者发现,所有这些函数其实经过泰勒展开之后具有很相似的结构:
[公式]
回忆一下, [公式] 与 [公式] 的泰勒展开式,我们就会恍然大雾了:[公式]
[公式]
然后,再加上由多项式建模的径向畸变和切向畸变则构成了完整的成像模型。

但是!值得注意的是:在大家常用的标定工具中都没有像原文一样再加上畸变模型,而是直接采用了9参数模型,即上述 k 1 , k 2 , . . . , k 5 k_1,k_2,…,k_5 k1,k2,...,k5,再加上 f x , f y , . . . , u 0 , v 0 f_x,f_y,…,u_0,v_0 fx,fy,...,u0,v0 (横纵向投影系数及主点偏置)4个内参数。原文中也证明了仅用这9个参数也能获得很不错的精度。

CamOdoCal库及OpenCV采用的是8参数模型,将其中的 [公式] 固定为1。但是!需要注意的是:在OpenCV中,其标定接口所返回的 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4 实际上对应的是原文的 k 2 , k 3 , k 4 , k 5 k_2,k_3,k_4,k_5 k2,k3,k4,k5 ,且,OpenCV的在线文档中,直接把这几个参数描述为distortion,实际上跟原文是有出入的,原文中,这几个参数建模的是光线的折射,distortion则由额外的参数来建模,大家在使用时要注意跟针孔模型中的distortion相区分(尽管它们都作用在“畸变/去畸变”这一步骤)。

Mei:

该模型由Christopher Mei 和 Patrick Rives于2007年的ICRA提出。前述Kannala-brandt模型所提出的多项式尽管能建模大部分的投影模型,但仍遵循针孔成像的基本假设,导致该模型存在奇点(水平入射的光线将被投影到无穷远)。因此,Mei等提出一个更为通用的投影模型,如下图所示:
在这里插入图片描述

Mei模型将投影成像过程分为以下四步(具体公式请参考原文):

相机空间坐标系 C M C_M CM下的点投影到单位球面
求取所投影的单位球面点在偏移坐标系 C P C_P CP下的坐标
然后求取该点在 C P C_P CP下的归一化平面坐标
最后再将内参数矩阵作用于该归一化平面得到像平面坐标
可以看到,经过在 C P C_P CP下表达坐标点,可以投影更大范围的点,使得此模型对于鱼眼镜头的适用范围更广。

Scaramuzza: (待补)

常用标定工具

  1. OpenCV

OpenCV应该是使用最广泛的相机内参标定工具了,它包含了Pinhole、Kannala-brandt及Mei的实现

对针孔模型的实现在,并有一个使用用例:链接

对Kanala-brandt模型的实现在modules/calib3d/src/fisheye.cpp文件中,采用8参数,其distortion参数 k 1   k 4 k1~k4 k1 k4对应于原文的 k 2   k 5 k2~k5 k2 k5。官方文档

对Mei模型的实现在/opencv_contrib/modules/ccalib/src/omnidir.cpp文件中,可参阅官方使用说明文档

  1. CamOdoCal

CamOdoCal是Lionel Heng博士在ETH博士后期间的工作,其中实现了本文中述及的所有模型,代码地址

用该工具箱标定开箱即用,作者已经实现好了标定示例。只是新版本Ubuntu系统上编译可能有一些小坑,多是opencv_contrib没找对路径的锅,改一改CMakeLists.txt就好。

  1. Kalibr

Kaibr在SLAM领域比较出名,它提供多相机系统、相机-IMU系统互标定的功能

该库也实现了Pinhole、Kannala-brandt及MEI模型(代码注释中注明参考了CamOdoCal库的实现),同时支持与不同畸变模型的组合,可参照其wiki说明。其中omni对应的是Mei模型,Spherical对应的是Kanala-brandt模型

Reference

[1] Scaramuzza, Davide, and Katsushi Ikeuchi. “Omnidirectional camera.” (2014): 552-560.

[2] Mei, Christopher , and P. Rives . “Single View Point Omnidirectional Camera Calibration from Planar Grids.”2007 IEEE International Conference on Robotics and Automation, ICRA 2007, 10-14 April 2007, Roma, ItalyIEEE, 2007.

[3] Kannala, Juho , and S. S. Brandt . “A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses.”IEEE Transactions on Pattern Analysis & Machine Intelligence28.8(2006):1335.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88378.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注