LARVIO代码学习以及基本框架
最近由于项目原因,对MSCKF进行了一定的研究,在其基础上进行开发,但是17年开源的代码不管是初始化还是后期跟踪、悬浮等问题,均为解决,在20年3月份qxc开源了LARVIO(https://github.com/PetWorm/LARVIO),基于MSCKF基本框架开发的一个可使用版本的VIO。
在传统的MSCKF的基础上其主要做了以下改进:
1、引入Hybrid EKF;
2、在线对IMU进行标定;
3、初始化部分:静态初始化、动态初始化,其中静态初始化采用视觉来判断是否存在移动,动态初始化为借鉴VINS初始化模块;
4、在视觉前端对特征点跟踪过程中,添加了ORB描述子剔除策略,提高特征点精度;
5、采用ZUPT(零速校正)应对静态、悬浮情况;
等等。。。。。。。。。。。。。。。。。。
下面我们来看程序,程序主要有三个主程序:System.cpp、ImageProcessor.cpp、LarVio.cpp ,其中System.cpp为程序主框架,负责系统参数初始化(不包括SLAM初始化)等;ImageProcessor.cpp主要为视觉前端,特征点的跟踪剔除等功能;LarVio.cpp为滤波跟踪,包括系统初始化、IMU预计分、添加特征点、扩充状态量、ZUPT校正、管理跟踪特征点等功能;
首先来看System.cpp;主要程序流程如下所示:
ImageProcessor.cpp主要流程图如下所示:
LarVio.cpp主要流程图如下所示:
在运行过程中,发现存在一定bug,使用其他数据包时,一致不能完成动态初始化成功,最终发现:
在动态对准过程中:DynamicInitializer::tryDynInit下面 存在一个ddt 的量,估计作者想对对其IMU和image的时间,但是其中存在一定的问题:
if ( imu_time-time_bound > imu_img_timeTh ) break;
只限制了imu_time-time_bound的上限,未考虑负值,后面直接添加上
if ( imu_time-time_bound > ) ddt = imu_time-time_bound;
此时结果与参数文件yaml里面的IMU频率有关系,尝试了几次,但是还是不能初始化成功,最后直接将其置零(ddt=0),后面初始化结果和VINS的一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)