欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Camera-IMU标定过程

程序员文章站 2022-07-12 10:34:58
...

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

相关标签: VIO-SLAM