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的实际位置来,一般应该是厘米或者毫米这样的尺度的数值。
参考
上一篇: SLAM 之四元数转欧拉角再理解