Camera-IMU标定过程

Camera和IMU的标定过程

问题说明

VIO(Visual-Inertial Odometry)视觉惯导里程计是在视觉里程计的基础上加入了IMU的数据进行融合来更精确的估计位姿。在VIO算法中,Camera和IMU的融合都需要基于Camera和IMU坐标系进行转换的相对位置矩阵Tbc/Tcb。所以VIO算法在实际实现时会遇到的第一个问题就是这个Tbc的矩阵标定。
一般有两种方法来做Camera和IMU的标定,online和offline。港科大的VINS就实现了一个在线的Camera和IMU的标定算法,显而易见,online标定使用起来会更加的方便,具有兼容性,能够对不同的设备进行标定,但是也增加了初始化的复杂性。一般来说目前的VIO系统假如不是动态的求解Camera的内参的情况下,都是做预先的offline标定的。

工具环境准备

这里Camera和IMU标定所用到的工具是kalibr,这个工具是跑在ROS上的,而且是特别指的是ROS indigo。而ROS indigo是跑在Ubuntu14.04上的,所以我们要用kalibr需要先准备ubuntu14.04+ROS indigo的平台,然后把kalibr在这个平台上编译运行。
按照这个installation wiki就能够搭建好所需要的环境,遇到什么库找不到的问题,只需要通过apt-get install安装即可。
在编译kalibr的时候,有可能会报gcc编译的错误,通常来说是内存不足(特别是运行在虚拟机上),目测kalibr编译高峰会需要3G的内存,解决方法可以不要用-j4编译,或者增加分配的内存,也可以增加swap分区的大小。

dd if=/dev/zero of=/path/swap.img bs=1M count=4096 
mkswap /path/swap.img
sudo swapon /path/swap.img

编译好kalibr之后,既可以通过example的数据来看看kalibr工具是不是能够正确的运行。按照 这里提供的方法走一遍整个标定流程。
kalibr_calibrate_imu_camera --target april_6x6.yaml --cam camchain.yaml --imu imu_adis16448.yaml --bag dynamic.bag --bag-from-to 5 45
假如example数据能跑通,说明kalibr工具准备好了,下面开始进入真实环境下的标定过程。

标定

数据采集的过程是手持需要标定的设备,同时激活camera和imu器件分别采集图像和imu数据,对着预先制作好的标定板,在激励充分(从不同的角度,旋转和平移,对标定板拍照,并且使得IMU的accel和gyro两个器件的三个轴都被激活)的情况下,同时保存图像和IMU的数据。采集到的数据应该如下所示(双目+IMU):

+-- dataset-dir 
+-- cam0
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
+-- cam1
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
-- imu0.csv

假如是单目的话,只需要保留cam0和imu0.csv即可。imu0.csv是一个文本文件,每一行就是一个gyro和accel在某一时刻的读数,如下所示:
timestamp,omega_x,omega_y,omega_z,alpha_x,alpha_y,alpha_z 
1385030208736607488,0.5,-0.2,-0.1,8.1,-1.9,-3.3
...
1386030208736607488,0.5,-0.1,-0.1,8.1,-1.9,-3.3

采集的过程中,通常建议是camera采用20hz,imu采用200hz的频率。避免震动,避免照片模糊等,尤其是在标定开始和标定结束时。
图像和IMU的数据都采集好以后,就可以通过以下命令来生成ROS的bag包格式。

kalibr_bagcreater --folder dataset-dir --output-bag awsome.bag

可以通过rosbag info awsome.bag来检查生成的bag包是不是合格的。

除了bag包,命令还需要的三个参数分别是–target,–cam和–imu,分别是指的采集数据过程中用到的标定板的标准,camera的内参,imu的噪声数据。这里用到的标定板,都是需要安装1比1的比例打印出来,比如从kalibr上下载的pdf是个0.8m*0.8m的标定板。当然你也可以自己制作一个标定板,比如制作一个A4大小的标定板,然后在打印的时候选择不要做缩放,通过kalibr_create_target_pdf –h查看制作的方法。camera的内参标定是比较成熟的技术,这里不做介绍。而IMU的噪声参数一般可以通过IMU器件的datasheet来获得。

假如都没有问题的话,通过运行kalibr_calibrate_imu_camera,我们就能得到pdf,txt,和yaml3个结果文件。
我们主要关注results-imucam-%BAGNAME%.txt文件,根据这个结果来简单看看我们的标定是否有效。
其中reprojection误差最好不要超过5个像素,T_ic/T_ci矩阵中的位移应该根据设备IMU和Camera的实际位置来,一般应该是厘米或者毫米这样的尺度的数值。

参考

https://github.com/ethz-asl/kalibr

你可能感兴趣的:(slam的原理)