Imu_tk算法流程及数据采集要求和标定程序参数设置

Imu_tk算法流程

由于VIO中,普遍使用的是精度较低的imu,所以其需要一个较为准确的内参数和noise的估计。Noise大家通常使用Allan方差进行估计可以得到较为可信的结果,这里不赘述了。内参数标定比较方便的一个工具就是imu_tk。所以本篇文章主要详细介绍一下imu_tk的算法流程以及使用时的注意事项。下一篇的内容 计划是imu-camera外参数的标定方法。

首先分步介绍算法流程:

1. 读入数据,将时间单位转化为秒

2. 设置初始参数和标定算法的控制参数

3. 开始标定

3.1 标定加速度计

首先调用initiInterval函数,返回前50s(默认是30s)的数据的index

计算初始的init_static_interval的方差,定义为norm_th

For循环:th_mult=2:10

{利用大小为101的滑动窗口搜索静止区间:如果该滑动窗口内的加速度计读数的方差小于th_mult*norm_th,则认为是静止区间

提取出静止区间内的加速度计读数。如果某个区间的大小小于初始设置的interval_n_samples_(默认是100)则去除该静止区间;注意,如果初始参数中acc_use_means_为true,则在静止区间内只取所有读数的平均值作为static_sample,且其时间戳为静止区间的时间戳的中值。否则保存所有的静止区间内的sample。如果提取出的静止区间个数小于初始设置的min_num_intervals_(默认是12),则认为采集的数据不足以标定imu,则程序退出。

构造目标函数:g-unbiasnorm(acc_samples),其中前者为初始设置的重力加速度值,后者为去除bias以后的加速度计读数的norm。因为如果imu静止,则其加速度计的读数的模应当等于重力加速度的值。

利用ceres最小化目标函数得到加速度计的九个参数。并利用标定得到的参数将加速度计的raw_data进行修正。

}

th_mult在2~10时最小的估计误差对应的参数为最准的加速度计标定参数,同时保存该参数对应的static_interval。

3.2 标定陀螺仪

根据加速度计的标定结果,提取static_sample。

根据初始的50s的陀螺仪读数,估计陀螺仪的bias。

利用上步得到的bias矫正陀螺仪读数。

根据提取的static_interval找到运动区间的start_index和end_index。

构造目标函数:integrate_R’*g_start-g_end。其中g_start和g_end均是归一化后的向量。因为在imu运动区间内,两帧加速度计的读数之间应当是两帧间imu的旋转,也就是imu的陀螺仪积分后得到的结果。

利用ceres最小化目标函数得到陀螺仪的十二个参数。注意,如果初始optimize_gyro_bias_为true,则在矫正陀螺仪读数后仍然需要标定bias参数,否则返回初始读数估计得到的bias。gyro_dt_如果为-1,则利用两帧陀螺仪的timestamp进行积分,否则利用gryo_dt给定的时间间隔进行积分。

注意事项:

1. 标定时,首先需要将imu静止一段时间,根据程序可知,至少需要静止50s以上。

2. 由于程序中检测静止区间的滑动窗口大小为101,所以每次静止时间需要超过100帧数据

3. 由于程序中检测静止区间时,需要至少end_index开始的滑动窗口内的方差大于2倍的静止方差,所以每两次静止区间之间的运动时间不能太短,且最好是有明显的加速或减速运动。最好运动时间超过100帧。

4. 由于程序中需要检测到的静止区间数大于12,且论文中提到静止区间为30+~40+次时,精度较好。所以需要有大概30多次的静止区间。

5. 静止区间内尽量保证imu是静止不动的。初始的1分钟中内尤其要保持imu静止,以得到较好的norm_th的估计和gyro_bias的估计。

参考文献:

Tedaldi D, Pretto A, Menegatti E. A robust and easy to implement method for IMU calibration without external equipments[C]//2014 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2014: 3042-3049.

test_imu_calib.cpp

需要修改代码里的offset和scale,把offset设置为0,把scale设置为1

  init_acc_calib.setBias( Vector3d(0, 0, 0) );
  init_gyro_calib.setScale( Vector3d(1.0, 1.0, 1.0) );

原文地址:https://www.cnblogs.com/feifanrensheng/p/10472345.html

时间: 2024-07-30 20:21:40

Imu_tk算法流程及数据采集要求和标定程序参数设置的相关文章

Latex 如何书写算法流程

最近要在论文中写算法流程, 幸好看到一个latex版本, 借此机会学习下. 代码如下: %\dontprintsemicolon%doesn't work on my machine \SetCommentSty{textit} \SetKwComment{tcc}{}{} %default /* */ \SetSideCommentRight \SetKwInOut{Input}{Input}\SetKwInOut{Output}{Output} \Input{Signal to be fil

AdaBoost 人脸检测介绍(3) : AdaBoost算法流程

本系列文章总共有七篇,目录索引如下: AdaBoost 人脸检测介绍(1) : AdaBoost身世之谜 AdaBoost 人脸检测介绍(2) : 矩形特征和积分图 AdaBoost 人脸检测介绍(3) : AdaBoost算法流程 AdaBoost 人脸检测介绍(4) : AdaBoost算法举例 AdaBoost 人脸检测介绍(5) : AdaBoost算法的误差界限 AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标 AdaBoost 人脸

写文件头的算法流程及C代码实现

一.问题描述 将多条记录写入文件中,每条记录占一行.每写入一条记录,要计算当前文件中所有记录的大小(精确到字节)和记录条数,并写到文件的第一行(即文件头).为了便于区分,文件记录的大小和文件中记录条数各占10个字节,左对齐,不足的位补以空格. 二.算法流程 三.C代码实现 四.程序说明 (1) 本程序在Linux环境下用makefile文件进行编译,makefile文件的内容如下: WriteFileHeader : WriteFileHeader.c gcc -c -g WriteFileHe

08-01 通过线性回归了解算法流程

目录 通过线性回归带你了解算法流程 一.1. 1 线性回归引入 二.1. 2 决策函数 三.1. 3 损失函数 四.1. 4 目标函数 五.1. 5 目标函数最小化 六.1. 6 过拟合 七.1. 7 正则化 7.1 1. 7.1 L1正则化 7.2 1. 7.2 L2正则化 八.1. 8 训练集.验证集.测试集 8.1 1. 8.1 训练集 8.2 1. 8.2 验证集 8.3 1. 8.3 测试集 九.1. 9 本章小结 更新.更全的<机器学习>的更新网站,更有python.go.数据结构

PBFT &amp;&amp; RBFT算法流程

PBFT && RBFT算法流程以及其实现(上) 这篇文章主要是讲一下RBFT中共识算法流程以及节点的加入的流程.在下一篇博客中,将使用Java实现该算法. 传统的PBFT算法无法动态的添加和删除结点,高鲁棒拜占庭容错算法RBFT(Robust Byzantine Tolerance)算法实现了该功能. 在RBFT算法中,有几个变量我们需要知道:f,N,quorum N ; 代表结点的数量. f :代表PBFT中最多能容忍的错误的结点$ f = \lfloor\frac{N-1} { 3}

SSL/TLS算法流程解析

SSL/TLS 早已不是陌生的词汇,然而其原理及细则却不是太容易记住.本文将试图通过一些简单图示呈现其流程原理,希望读者有所收获. 一.相关版本 Version Source Description   Browser Support SSL v2.0 Vendor Standard (from Netscape Corp.) [SSL2] First SSL protocol for which implementations exist - NS Navigator 1.x/2.x - MS

结对编程任务的算法流程思路

这次的结对编程的作业相较于上次的作业看似只是核心功能的嫁接过程,但是程序这个东西尤其是对于实战经验并不很足的我来讲,其实还是很有难度的,因为在这次的作业要求中新加了很多的可以由用户定制的功能要求,那么以前的取巧一些的方法在对于这种可以随意定制功能的要求之下就显得力不从心,于是对我来讲这次的作业只有部分的算法的框架还留在程序中,从代码的角度来讲的话基本所有的代码都是被重构的,作为处女座的一员即便是当初可以用的代码,再一次复审的时候发现很多不和标准的地方的有悖于自己的强迫症的地方还是不能忍受的于是果

Python多继承解析顺序的C3线性算法流程解析

Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和新式类共存,使用了DFS算法和C3算法. Python2中的经典类 class A(object): pass Python3的新式类 class A: pass C3算法 In computing, the C3 superclass linearization is an algorithm u

GB和GBDT 算法流程及分析

1.优化模型的两种策略: 1)基于残差的方法 残差其实就是真实值和预测值之间的差值,在学习的过程中,首先学习一颗回归树,然后将“真实值-预测值”得到残差,再把残差作为一个学习目标,学习下一棵回归树,依次类推,直到残差小于某个接近0的阀值或回归树数目达到某一阀值.其核心思想是每轮通过拟合残差来降低损失函数. 总的来说,第一棵树是正常的,之后所有的树的决策全是由残差来决定. 2)使用梯度下降算法减小损失函数. 对于一般损失函数,为了使其取得最小值,通过梯度下降算法,每次朝着损失函数的负梯度方向逐步移