imu_tk源码分析

目录

  • imu_tk源码分析
  • 前言
  • 算法思路简介
  • 代码解读
    • test_imu_calib
    • calibrateAccGyro函数
    • calibration函数
  • 参考论文

前言

imu_tk是一个开源的用于低精度IMU标定的代码,github地址为:imu_tk,主要用了非线性优化方法做加速度计和陀螺仪的标定,标定参数包括bias(3个),标度因子(3个),非正交安装误差(3个),一共12个参数。

算法思路简介

详细的算法思路可以参考它给出的两篇论文,加速度计的标定利用了加速度计在静止状态下的三轴数据模值等于重力加速度这一条件,采集加速度计在不同状态的静止数据,通过优化算法即可求出标定参数。加速度计单独即可完成标定,陀螺仪的标定需要加速度计数据的参与,所以需要先标定好加速度计。在标定陀螺仪时,IMU从静止状态A,通过一段时间,到了静止状态B,通过陀螺仪可以算出来TA→BT_{A \rightarrow B}TA→B​的旋转矩阵,而通过加速度数据也可以算出来TA→BT_{A \rightarrow B}TA→B​的旋转矩阵,最小化这一差异即可实现优化求解。

代码解读

test_imu_calib

  1. importAsciiData: 通过函数读入.mat格式的文件,加速度数据和陀螺仪数据是分开读取的。mu_tk::TIMESTAMP_UNIT_SEC是在imu_tk/io_utils.h文件中定义的一个枚举类型,可以实现不同时间单位之间的转换,TIMESTAMP_UNIT_SEC = 1,即为转换为秒。这里要注意数据的单位。
  2. setBias:加速度计设定了初始的bias。
  3. setScale:陀螺仪设定了初始的标度因子。
  4. setInitStaticIntervalDuration:采集的数据持续的时间,可以方便选择部分时间用于IMU参数的标定。
  5. setGravityMagnitude:设置重力加速度数值,不同地方的重力加速度是不同的,这块可能需要改下,默认设置的数值是9.81744。
  6. enableVerboseOutput:相当于一个debug开关,打开后会输出更多的调试信息,方便调试。
  7. enableAccUseMeans:函数默认设置为否,意思是把所有的加速度静止段数据作为优化函数的输入,而不是每一静止段的平均值。
  8. calibrateAccGyro:主要的代码思路在这个函数中。

calibrateAccGyro函数

calibrateAcc函数是加速度计的标定。

  1. initialInterval:根据设定的时间,找到对应的最后一个数据的索引,这里在寻找过程中用到了二分法。
  2. dataVariance:求整个时间段的数据的方差,此方差是作为判断IMU静止状态时的一个阈值使用,再一个这个方差是所有数据的方差。
  3. staticIntervalsDetector:这是个静止状态监测器,利用数据方差(三个数据方差的模值)作为判断静止与否的阈值条件,对于第i个数据,通过计算其左领域,右临域共win_size大小的数据方差, win_size是函数输入参数,默认大小为101,按照100Hz的输出数据速率,大约为1s的数据。之后得到静止段数据所对应的开始索引和结束索引。
  4. extractIntervalsSamples:该函数是找到静止区域索引所对应的惯导数据,静止区域的数据个数要大于interval_n_samps,也就是1s。如果使用平均值的模式,就用时间段的中间的时间戳作为这个平均值的时间戳。
    注意以下代码
    if(verbose_output_)cout<<"Accelerometers calibration: extracted "<<extracted_intervals.size()<<" intervals using threshold multiplier "<<th_mult<<" -> ";// TODO Perform here a quality testif( extracted_intervals.size() < min_num_intervals_) //至少是12个数据(有12个参数需要标定){if( verbose_output_) cout<<"Not enough intervals, calibration is not possible"<<endl;continue;}

min_num_intervals_设定的是静止区域的个数,静止区域的个数要不小于待标定的参数的个数,对于加速度计,待标定参数个数是9个,如果更改标定模型,参数min_num_intervals_可能需要改变。
接下来就是用ceres优化库,去解待标定参数,这里比较关键的是构建优化函数。

calibration函数

h文件中描述了加速度计和陀螺仪采用的标定模型。

参考论文

  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
  2. A. Pretto and G. Grisetti, “Calibration and performance evaluation of low-cost IMUs”. In Proceedings of the 20th IMEKO TC4 International Symposium, Sep. 15 - 17, 2014 Benevento, Italy, pages: 429 - 434

imu_tk源码分析相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  4. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  5. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  6. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  7. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  9. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

最新文章

  1. C#中使用键值对存取值并使用Linq通过key获取value
  2. Chrome浏览器插件Octotree-树形显示GIithub代码
  3. 修改mysql的用户密码
  4. C语言格式控制符/占位符 - C语言零基础入门教程
  5. 架构师速成6.8-设计开发思路-领域驱动
  6. 【驱动】USB驱动·入门
  7. 如何用阿里云服务器建立一个wordpress网站
  8. echart 地图 某个地区_使用echarts实现自定义区域地图
  9. Oracle 10g 数据库服务器的安装
  10. 晶体表面原子结构和一篇论文
  11. 数学建模入门篇(0基础必看,全是自己的经验)
  12. 有才!学生发文言文请假条,老师连称赞
  13. python学习记录三:关于ImageFont.truetype(‘Arial.ttf‘, 36)执行报错以及解决方案
  14. 浅谈农批市场的信息化:发展现状、信息化动因和契入方向
  15. [数学学习笔记]极限的概念.
  16. 沈阳艺术设计培训就业班 (学制一年)
  17. MAC版Pycharm使用技巧
  18. GOE:Nintendo Switch™ 对战忍者口香糖动作游戏『Ninjala』首次正式直播中陆续发表最新信息
  19. NKOJ-3776 工资管理
  20. 亚马逊后台网页提示HTTP Status 400 – Bad Request无法登陆的解决办法

热门文章

  1. wechall做题之www-robots
  2. 郴州华硕服务器维修,如何编译padavan路由器rt-n56u华硕(即老毛子)固件
  3. Pytorch | yolov3原理及代码详解(一)
  4. 4月跳槽进字节跳动了,面试真简单...
  5. 字符串搜索之BMH 算法(伪代码)
  6. 【python】造测试数据并插入excel【python-faker库使用】
  7. 瑞星升级提示网络连接失败网络配置后重试(12007) 解决办法
  8. AIX创建激活删除LV
  9. POJO/DO / DTO / BO / VO /AO
  10. 【深度学习】数据分割