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 )
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 )
所以,测试数据需要静止一会儿,动一下(变化一下姿态),静止一会儿,动一下(变化一下姿态),以此重复。文献[1]中指出至少需要9个不同的姿态,最好动36-50次。
程序与文献[1]的区别是bias补偿的正负号不一致,程序中补偿模型:
参考文献
[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.
浙公网安备 33010602011771号