Kalibr相机校正工具安装与使用笔记

Sep 9,2020   5708 words   21 min

Tags: SLAM

1.Kalibr简介

Kalibr是一个由瑞士ETH开源的、使用比较广泛的相机校正工具包,主要进行包括以下三方面的校正(翻译自GitHub项目主页,部分修改):

  • 多相机标定:具有非全局共享重叠视场的相机系统的内参、外参标定
  • 相机-IMU校正:IMU和相机的内参、外参标定
  • 卷帘相机校正:对卷帘快门的相机进行标定

关于它的一系列理论,可以参考GitHub主页中列出的5篇文章。本篇博客只从安装和使用的角度对Kalibr进行介绍。

2.安装

Kalibr有两种方式可供使用,一种是预编译好的可执行文件包(CDE Package),直接打开就可以使用;另一种是源码,需要自己编译。

两种方式各有优势。CDE包运行最简单、快捷,不需要配置依赖环境,但同时会缺少Camera focus和Calibration validator这两个功能。而源码编译好处就是全功能,而且相比于CDE包运行效率会更快。当然坏处就是要配置一堆环境,还有可能面对各种奇奇怪怪的编译错误。

不过如果想做开发的话,还是建议源码编译会好一些。本文以Ubuntu 16.04 + ROS Kinetic环境进行配置。关于ROS的环境配置在之前已经介绍过了,可以参考这篇博客

(1)依赖项安装

需要注意的是这里的环境是Ubuntu 16.04 + ROS Kinetic,而在官方GitHub中给出的依赖是针对Ubuntu 14.04 + ROS Indigo的,因此会有一些出入。

apt-get install python-setuptools

apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev

apt-get install libopencv-dev ros-kinetic-vision-opencv ros-kinetic-image-transport-plugins ros-kinetic-cmake-modules python-software-properties software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev

pip install python-igraph
(2)创建工作空间
mkdir -p ~/Codes/kalibr_workspace/src
cd ~/Codes/kalibr_workspace
source /opt/ros/kinetic/setup.bash
catkin init
catkin config --extend /opt/ros/kinetic
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release

创建好以后终端如下图所示。

(3)源码下载

然后切换到工作空间的src文件夹下并克隆源码。Kalibr源码在GitHub上,点击查看。直接clone或者下载zip文件都可以。

cd ~/Codes/kalibr_workspace/src
git clone https://github.com/ethz-asl/Kalibr.git
(4)编译源码
cd ~/Codes/kalibr_workspace
catkin build -DCMAKE_BUILD_TYPE=Release -j4

编译成功会如下图所示。 整个编译过程在我的电脑上还是比较快的,花了10分钟左右。如果出现一些错误,根据它的错误提示修改或者百度查找解决方法。

(5)刷新工作空间

和常规编译ROS节点程序一样,在编译完成以后,为了系统能够识别,也需要source刷新一下。

source ~/Codes/kalibr_workspace/devel/setup.bash

当然,上面的这行命令只对当前终端有效,这样每次使用前都需要source一下。如果想更加方便,可以直接输入gedit ~/.bashrc打开文件,写入如下内容保存。

source ~/Codes/kalibr_workspace/devel/setup.bash

最后输入source ~/.bashrc即可。不过需要注意的是,如果你之前已经有其它的工作空间的话,ROS默认会以最新的工作空间为准,也就是说你之前工作空间里的ROS程序“找不到”了。对于这种情况的话,建议可以把Kalibr的源码放到已有的工作空间中进行编译,不像官方文档里给出的一样新建一个工作空间,就可以和已有的程序共存了。

至此,Kalibr的配置与安装工作就完成了。

3.成像模型与畸变模型

在下面介绍如何使用Kalibr之前,首先先简单介绍一下Kalibr支持的几种成像和畸变模型,以及对应的参数。当然如果细说,每一种都可以写一篇博客(如果有时间,新开个坑也许不错),这里就只是简单介绍这些模型都包含哪些参数。

(1)成像模型
  • pinhole camera model(pinhole):fu、fv、pu、pv
  • omnidirectional camera model(omni):xi、fu、fv、pu、pv
  • double sphere camera model(ds):xi、alpha、fu、fv、pu、pv
  • extended unified camera model(eucm):alpha、beta、fu、fv、pu、pv

可以看到,不管是什么模型,都是有焦距(fu、fv)和主点(pu、pv)的,其它的相机模型可以看做是在针孔相机模型上又增加了其它的参数,比如omnidirectional的xi(mirror parameter)等等。

(2)畸变模型
  • radial-tangential(radtan):k1、k2、r1、r2
  • equidistant(equi):k1、k2、k3、k4
  • fov(fov):w
  • none(none):none

第一种就是针孔相机常见的径向-切向畸变模型。

4.测试使用

如前文所述,Kalibr主要有两种模式:Multiple Camera和Camera-IMU,当然还有Multi IMU和IMU Intrinsic模式。但这里主要介绍前两种。

(1)Multiple Camera Calibration

对应kalibr_calibrate_cameras节点,非常详细的参数说明和使用参见官方文档。需要注意的是,虽然是针对多相机系统设计的,但是只输入一个相机的影像也当然是可以的。这样标定出来的就是相机的内参、畸变参数等内容,而对于多相机系统,除了前面提到的参数,还会标定出各相机间的位置关系。这里直接测试它给出的例子。我们可以首先在这个网页里下载示例数据,注意需要科学上网。下载好以后直接解压。然后在解压后的目录下打开终端,输入如下内容:

kalibr_calibrate_cameras --target april_6x6.yaml --bag static.bag --models pinhole-equi pinhole-equi omni-radtan omni-radtan --topics /cam0/image_raw /cam1/image_raw /cam2/image_raw /cam3/image_raw

简单介绍一下,对于多相机标定,需要输入的内容是ROS bag名称(路径)、bag中每个相机影像流对应的Topic名称、每个相机的成像模型和畸变模型(顺序和前面的输入的影像流对应)、目标的样式文件(Aprilgrid、Checkerboard、Circlegrid)。

正常情况下Kalibr就开始工作了,如下所示。 完成之后会输出相关的结果以及文件,如下所示。 简单来说,Kalibr会输出三个文件:

  • report-cam-%BAGNAME%.pdf:PDF版本的结果报告,包含绘制的图片和标定的参数。
  • results-cam-%BAGNAME%.txt:以文本文件储存的标定结果。
  • camchain-%BAGNAME%.yaml:以YAML格式储存的标定结果。它可以直接用来作为相机-IMU校正的输入。

另外,作者提到,对于某些序列,迭代优化估计参数可能不收敛,这个时候只需要重新再估计一次就可以了。因为迭代初值是随机选择的。

最后需要注意的是Kalibr接受的输入是ROS的bag,因此对于自己的传感器,可以先录好bag,再传入Kalibr进行校正。关于ROS bag的相关内容可以参考这篇博客,包括录制、回放等内容。

(2)Camera-IMU Calibration

对应kalibr_calibrate_imu_camera节点,用于相机和IMU的联合标定,获得相机和IMU的相对位置关系,整体流程和上面的大同小异。更详细介绍参考官网。还是先下载示例数据并解压,然后在解压后的目录下打开终端,输入如下内容:

kalibr_calibrate_imu_camera --target april_6x6.yaml --cam camchain.yaml --imu imu_adis16448.yaml --bag dynamic.bag --bag-from-to 5 45

这里的输入,相比于多相机的校正要更多一些。主要包括包含影像和IMU数据的ROS Bag文件、相机系统的内参外参(可以由上面多相机标定程序获得)、IMU配置文件、目标的样式文件(Aprilgrid、Checkerboard、Circlegrid)。关于这些文件内容的更多解释可以参考官方文档。从这个角度也可以看出来,对于Camera-IMU的标定而言,并不是同时进行的,而是先标定好了相机,拿到了相机的内参、外参以后,作为参数,和IMU数据一起传入程序中,最终获得各个相机相对于IMU的位姿。这在官方对于相机-IMU标定的指导文档中也提到了。关于相机-IMU更详细的标定会在之后进一步介绍。

程序会输出三个文件:

  • report-imucam-%BAGNAME%.pdf:PDF版本的结果报告,包含绘制的图片和标定的参数。
  • results-imucam-%BAGNAME%.txt:以文本文件储存的标定结果。
  • camchain-imucam-%BAGNAME%.yaml:以YAML格式储存的标定结果。它是在camchain.yaml的基础上增加了所有相机相对于IMU的位移。

标定后的结果如下图所示。

另外,作者也提到,尽可能保证在IMU的所有轴向上都有运动(注意是目标样式固定,相机运动,和上面有点区别。上面是可以相机不动,目标样式动),以便完全激活IMU。另一方面,避免晃动,尤其是在拿起或放下传感器的时候(这也就是为什么作者在例子中使用的是5秒到45秒的数据)。最后,尽可能保证没有运动模糊、保证充足光照、降低快门时间。而对于目标样式的选择,作者建议使用Aprilgrid,而不是对称的样式。

这里需要提醒一下,ROS Bag里的IMU信息到底包含什么内容。如果你利用ROS Rqt Tool跟踪消息(如何监控见这篇博客)可以发现,dynamic.bag里的IMU消息是ROS标准格式的sensor_msgs/Imu类型,包含角速度(Angular Velocity)、线加速度(Linear Acceleration)、方向(Orientation)这三个方面的内容。但在这里,我们只用到了角速度(由陀螺仪测量)和线加速度(由加速度计测量)作为IMU的测量值。

以上就是Kalibr的简单介绍、安装与测试了。当然实际的相机标定还会要再麻烦一些,涉及到一系列具体的流程,比如标定纸的打印、ROS Bag的录制、相机的运动方式、相机的参数获取、Kalibr传入参数的修改等等。之后会结合最近到手的Intel RealSense D435i进行实际的标定练习,再写总结。

5.参考资料

  • [1]https://github.com/ethz-asl/kalibr
  • [2]https://github.com/ethz-asl/kalibr/wiki/installation
  • [3]https://github.com/ethz-asl/kalibr/wiki/multiple-camera-calibration
  • [4]https://github.com/ethz-asl/kalibr/wiki/camera-imu-calibration
  • [5]https://blog.csdn.net/weixin_40725884/article/details/88933972
  • [6]https://blog.csdn.net/okasy/article/details/90665534
  • [7]https://blog.csdn.net/zhangjunhit/article/details/89137958
  • [8]https://zhuanlan.zhihu.com/p/71234078
  • [9]https://github.com/ethz-asl/kalibr/wiki/supported-models
  • [10]https://zhuanlan.zhihu.com/p/71234078
  • [11]https://blog.csdn.net/u011178262/article/details/74159480
  • [12]https://blog.csdn.net/u011178262/article/details/86656153

本文作者原创,未经许可不得转载,谢谢配合

返回顶部