参考论文:
[1] Paul Furgale, Joern Rehder, Roland Siegwart (2013). Unified Temporal and Spatial Calibration for Multi-Sensor Systems. In Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), Tokyo, Japan.
[2] Paul Furgale, T D Barfoot, G Sibley (2012). Continuous-Time Batch Estimation Using Temporal Basis Functions. In Proceedings of the IEEE International Conference on Robotics and Automation (ICRA), pp. 2088–2095, St. Paul, MN.
参考博客(参考,但是不完全参考,因为这些博客都是老版本的kalibr版本了):
手机上的SLAM(7):Kalibr相机+IMU离线标定 - 知乎 (zhihu.com) [3]
利用Kalibr标定Camera-IMU外参_cjn_的博客-CSDN博客 [4]
以上参考博客,有重要的几个问题没有交代清楚,以及kalibr更新了之后不很多原有的步骤不同了,导致在后续的标定过程中出现了特别深的坑,在此记录一下,2022年10月23号晚上22:30
需要ros环境,但是目前因为ros自带的python编译器是python2,个人暂时没有花时间去了解如何改成python3(有知道的小伙伴可以告诉我咋改),python3基本安装完成就可以运行,python2的话还得改许多代码(但是单纯仅仅标定IMU和单目相机的外参来说,改的地方还不算多(这都不算事,主要花了一天时间调试,编译花了许久,就将就python2凑合着用吧!))
官方网址:GitHub - ethz-asl/kalibr: The Kalibr visual-inertial calibration toolbox
注意:上述进去的源码还不一定是我们需要的源码;我们注意到上述源码有以下几项内容:
针对自己的ubuntu版本选择不同文件,点进去,查看对应源码的地址,我这里是ubuntu16.04;打开后,出现了ubuntu16.04需要安装的依赖,以及编译步骤等等;
这个文件先保存,后续操作步骤全部按照这个文件运行,一切以官方步骤为准;直接跳转到29行,就出现了我们ubuntu16.04版本下的代码链接:
点进去,下载即可;
下载文件之后,一步一步严格按照那个文件操作进行安装,官方步骤基本不会出现什么很难解决的问题,基本就是缺包的问题,我这里列出一个最有可能缺的包:SuitSparse;关于这个包的解决方案,大家最有可能搜到的解决方案如下链接:
Camera-IMU标定工具Kalibr的编译_Small potatoes的博客-CSDN博客
但是请大家看我们下载的kalibr包目录:
我丝毫没有看到所说的suitesparse文件夹,所以,大部分博客搜到的问题还是遇到老的问题罢了,都2022了,问题早已更新了。出现找不到包这种错误,一定就是去下载这个包,
我下载的是下面这个包:
https://codeload.github.com/DrTimothyAldenDavis/SuiteSparse/zip/refs/heads/master
正常按照readme文件进行编译安装即可,不过最后一步sudo make install要用
sudo make install INSTALL=\usr\local
即必须指定安装路径,不然这个包没法安装到系统文件路径,然后就也还是找不到这个包;
NOTE:我这里突然发现了另外一个suitsparse包,比上面那个包占用内存小许多,但是还没有试验过,还不知道这个包能不能用,有研究的小伙伴可以告诉我一下行不行,以及怎么用:https://github.com/ethz-asl/suitesparse
然后其余的包缺少什么就去装什么就行,正常跟着官方文档走基本不会有大错。
我们这里仅仅想通过数据集,标定,IMU和相机的,外参。
Euroc提供了相应数据集:Downloads · ethz-asl/kalibr Wiki · GitHub
以下的红色框框就是我们需要的几个文件,我们要是想自己标定自己的设备,就得制作这几个文件,但是目前我手头没设备,只能用数据集练练手。以下具体内容参考[4]
1. .bag文件,具体内部的数据格式自己下载后用rosbag info xx.bag或者echo或者play等等自己查看,里面包含两个相机的数据和一个IMU数据;咱就是说,就算里面有任意多个相机数据,任意多个IMU数据,咱都能依次把 任意一组IMU-Camera外参标定出来,因为后续的标定是通过话题名提取出数据的,提取对应的话题名即可。
2. imu的yaml文件,里面就是加速度陀螺仪的 高斯白噪声方差,bias方差,以及陀螺仪话题名,这些单独通过kalibr工具标定,后续补充一种我自己常用的。
3. 相机的yaml文件,主要是相机的内参,畸变系数,这里也可以试试kalibr标定。
4. april的yaml文件,其实就是这里联合标定用的标定板的一些信息。
这里先给出Euroc MAV的真值外参 Rbc(把相机坐标,变换到,body坐标)
[0.0148655429818, -0.999880929698, 0.00414029679422,
0.999557249008, 0.0149672133247, 0.025715529948,
-0.0257744366974, 0.00375618835797, 0.999660727178]
真值Pbc:
[-0.0216401454975,-0.064676986768, 0.00981073058949]
这里通过[3]知道了 camera和imu联合标定时的可执行文件以下文件
kalibr-noetic-devel/aslam_offline_calibration/kalibr/python/kalibr_calibrate_imu_camera
然后运行以下代码:
注意,下面就是那四个文件的路径,这里是python文件的 关键字传参语法,--bag 和 --bag-from-to 等等就是参数,具体谁在前谁在后都没关系,5 45 代表只取 5~45s之间的数据,当然可要可不要。
rosrun kalibr kalibr_calibrate_imu_camera --bag /home/zjj/Data/EuRoC/IMU_CAM_Calib/imu_april.bag --bag-from-to 5 45 --cams /home/zjj/Data/EuRoC/IMU_CAM_Calib/cam_april-camchain.yaml --imu /home/zjj/Data/EuRoC/IMU_CAM_Calib/imu_adis16448.yaml --target /home/zjj/Data/EuRoC/IMU_CAM_Calib/april_6x6_80x80cm.yaml
之后如果你的ros是python3,那么什么问题都不会有;如果是python2,那么就得依次去解决兼容性问题,这里我估计也就改了7到8个地方吧,python2兼容python3还是挺好改的,自己去改吧,根据错的地方,ctrl+c必应一下一大堆python2兼容python3的操作。
Tcb:
T_ci: (imu0 to cam0):
[[ 0.01490708 0.9996032 -0.02390014 0.06448343]
[-0.99988602 0.01496002 0.00203792 -0.01970523]
[ 0.00239466 0.02386703 0.99971227 -0.0049854 ]
[ 0. 0. 0. 1.]]把这里的求逆,基本和上面Rbc和Pbc的真值吻合,虽然有一点点区别,但是给vins当作初值就已经够用了。
还估计出了时间偏移 timeoffset:
timeshift cam0 to imu0: [s] (t_imu = t_cam + shift)
-0.000137717430147
再贴一张看起来高大上的图吧:虽然看不太懂,但是在(0,0)附近。有懂得多的小伙伴可以分享下为什么会有那么多红点,这些难道是特征点的重投影误差咩~~~?
目前数据集基本测试完成,下面开始买实物了orz~~~