imu_tk阅读笔记

1. imu_tk简介

imu_tk是一款开源的面向消费级imu的无基准标定软件,不需要转台设备,即可以实现acc/gyr bias、scale和misalignment的标定。标定原理参考文献[1]。

2. 程序框架

2.1 文件读取

读取acc和gyr的数据(如果自己的acc和gyr数据在文件中需要改一下)。

void importAsciiData( const char *filename,     std::vector< TriadData_<_T> > &samples,      TimestampUnit unit = TIMESTAMP_UNIT_USEC,     DatasetType type = DATASET_SPACE_SEPARATED );  

通过unit将数据中的时间戳转化成秒,所以需要根据自己的数据具体调整。

2.2 参数配置

// 配置加计零偏和陀螺刻度因子 (将文件中acc和gyr转成已m/s^2和rad/s为单位) CalibratedTriad init_acc_calib, init_gyro_calib; init_acc_calib.setBias( Vector3d(32768, 32768, 32768) ); init_gyro_calib.setScale(Vector3d(1.0/6258.0, 1.0/6258.0, 1.0/6258.0));  MultiPosCalibration mp_calib; // 设置静态数据时间长度,默认是在数据最前段取,也可以自己手动改成在数据最后段取(程序中已实现) mp_calib.setInitStaticIntervalDuration(50.0); mp_calib.setInitAccCalibration( init_acc_calib ); mp_calib.setInitGyroCalibration( init_gyro_calib );   // 设置当地重力,用来acc标校(最好用重力模型计算一个较准确的当地重力值) mp_calib.setGravityMagnitude(9.81744); mp_calib.enableVerboseOutput(true); mp_calib.enableAccUseMeans(false); //mp_calib.setGyroDataPeriod(0.01); // 标校程序主函数 mp_calib.calibrateAccGyro(acc_data, gyro_data );	 // 输出acc和gyr的标校结果,acc和gyr标定的结果文件被保存在程序运行路径下 mp_calib.getAccCalib().save("test_imu_acc.calib"); mp_calib.getGyroCalib().save("test_imu_gyro.calib"); 

2.2 静态识别

根据配置静态数据时长(mp_calib.setInitStaticIntervalDuration(50.0))取数据最前段(static DataInterval initialInterval( const std::vector<TriadData_<_T> > &samples, _T duration ))或最后段(static DataInterval finalInterval( const std::vector< TriadData_<_T>> &samples, _T duration ))的数据,计算静态数据的方差norm_th,通过th_mult*norm_th对数据进行静态判别。

2.3 acc标定

然后用判别出的静态数据及当地重力对acc进行标校,对比th_mult取不同值对应的标校残差大小,选残差最小的th_mult*norm_th作为静态判别指标。

bool MultiPosCalibration_<_T>::calibrateAcc (  	const std::vector<TriadData_<_T> >& acc_samples ) 

[boldsymbol{g= left| f^bright|^2} ]

2.4 gyr标定

最后用标校后的acc数据矢量标校gyr。大致原理:g_versor_pos1 = Cbb * g_versor_pos0,g_versor_pos0和g_versor_pos1为相邻acc静态数据,Cbb为g_versor_pos0和g_versor_pos1中间动态段imu的姿态变化(用动态段gyr求得)。

bool MultiPosCalibration_<_T>::calibrateAccGyro (  	const vector< TriadData_<_T> >& acc_samples,      const vector< TriadData_<_T> >& gyro_samples ) 

[boldsymbol{f^{b_1}=C_{b_2}^{b_1}f^{b_2}} ]

所以,测试数据需要静止一会儿,动一下(变化一下姿态),静止一会儿,动一下(变化一下姿态),以此重复。文献[1]中指出至少需要9个不同的姿态,最好动36-50次。

程序与文献[1]的区别是bias补偿的正负号不一致,程序中补偿模型:

[boldsymbol{imu^o=TK(imu^S - b)} ]

参考文献

[1] D. Tedaldi, A. Pretto and E. Menegatti, “A Robust and Easy to Implement Method for IMU Calibration without External Equipments”. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA 2014), May 31 - June 7, 2014 Hong Kong, China, Page(s): 3042 - 3049.

发表评论

评论已关闭。

相关文章