AI-IMU Dead-Reckoning论文总结

2023-05-16

AI-IMU Dead-Reckoning Martin

论文出处

论文:https://arxiv.org/abs/1904.06064
代码:https://github.com/mbrossar/ai-imu-dr

 

整体介绍

a. 本文主要提出了一种方法,能够仅仅使用IMU的航位推算得到较为精准的轨迹,如下图所示:
在这里插入图片描述

b. 该方法只适用于像汽车一样只能向前跑的系统,因为这样的系统在进行kalman滤波器的时候可以加入动力模型的辅助信息,在这里,辅助信息主要是指系统在侧向 y l a t y^{lat} ylat和与地面垂直的方向 y u p y^{up} yup上是没有移动的,文中称之为伪测量;

c. 论文的重要改进点在于,(b)中辅助信息的均值可以认为是0,但是协方差是否一直都是一个值呢?显然,在系统进行转弯的时候,水平方向的协方差要比直线方向的协方差是要大很多的,同理,在爬坡的时候,垂直地面方向的协方差也应该比直线的时候协方差是要大的;鉴于一般的滤波器都是人为设计协方差矩阵,同时设计好的协方差不能修改,因此文章希望使用CNN(并非RNN,作者说RNN不是很好)对观测的协方差进行动态的更新,进一步的,作者使用CNN也同时预测出来了上述的伪测量的值(这里没有给出伪量测的值)。

 

系统实现

IMU模型定义

一般情况下,IMU的模型建立为真值+零偏+高斯白噪声,如下:
(1) w n I M U = w n + b n w + w n w a n I M U = a n + b n a + w n a \begin{aligned} w_{n}^{IMU} &= w_{n}+b_{n}^{w}+w_{n}^{w} \\ a_{n}^{IMU} &=a_{n}+b_{n}^{a}+w_{n}^{a} \end{aligned} \tag{1} wnIMUanIMU=wn+bnw+wnw=an+bna+wna(1)
其中零偏一般是一个随机游走的“准常量”(quasi-constant)(一般来说与温度有关),因此对零偏进行建模,其模型如下:
(2) b n + 1 w = b n w + w n b w b n + 1 a = b n a + w n b a \begin{aligned} b_{n+1}^{w} &= b_{n}^{w}+w_{n}^{b_w} \\ b_{n+1}^{a} &= b_{n}^{a}+w_{n}^{b_a} \end{aligned} \tag{2} bn+1wbn+1a=bnw+wnbw=bna+wnba(2)
其中 w n w , w n a , w n b w , w n b a w_{n}^{w}, w_{n}^{a}, w_{n}^{b_w}, w_{n}^{b_a} wnw,wna,wnbw,wnba为高斯分布的白噪声。

IMU的运动模型

IMU的运动模型可以定义为如下形式:
(3) R n + 1 I M U = R n I M U exp ⁡ ( ( ω n d t ) × ) v n + 1 I M U = v n I M U + ( R n I M U a n + g ) d t p n + 1 I M U = p n I M U + v n I M U d t \begin{aligned} \mathbf{R}_{n+1}^{\mathrm{IMU}} &=\mathbf{R}_{n}^{\mathrm{IMU}} \exp \left(\left(\boldsymbol{\omega}_{n} d t\right)_{ \times}\right) \\ \mathbf{v}_{n+1}^{\mathrm{IMU}} &=\mathbf{v}_{n}^{\mathrm{IMU}}+\left(\mathbf{R}_{n}^{\mathrm{IMU}} \mathbf{a}_{n}+\mathbf{g}\right) d t \\ \mathbf{p}_{n+1}^{\mathrm{IMU}} &=\mathbf{p}_{n}^{\mathrm{IMU}}+\mathbf{v}_{n}^{\mathrm{IMU}}dt \end{aligned} \tag{3} Rn+1IMUvn+1IMUpn+1IMU=RnIMUexp((ωndt)×)=vnIMU+(RnIMUan+g)dt=pnIMU+vnIMUdt(3)
其中的所有变量都是真值形式,没有考虑到偏差等等的因素,如果把带有偏差的值运用到上面动态模型中,则误差会十分大,甚至比直接使用轮子的积分来的更差。

KalmanFilter的建模

1. 状态变量

状态变量选择为:
x n : = ( R n I M U , v n I M U , p n I M U , b n ω , b n a , R n c , p n c ) \mathbf{x}_{n} :=\left(\mathbf{R}_{n}^{\mathrm{IMU}}, \mathbf{v}_{n}^{\mathrm{IMU}}, \mathbf{p}_{n}^{\mathrm{IMU}}, \mathbf{b}_{n}^{\omega}, \mathbf{b}_{n}^{\mathrm{a}}, \mathbf{R}_{n}^{\mathrm{c}}, \mathbf{p}_{n}^{\mathrm{c}}\right) xn:=(RnIMU,vnIMU,pnIMU,bnω,bna,Rnc,pnc)
其中系统的输入为IMU的测量值, R n I M U , v n I M U , p n I M U \mathbf{R}_{n}^{\mathrm{IMU}},\mathbf{v}_{n}^{\mathrm{IMU}},\mathbf{p}_{n}^{\mathrm{IMU}} RnIMUvnIMUpnIMU是载体在第n步(或者理解为t时刻)的姿态,速度和位置,其中的参考系都是世界坐标系,坐标系的信息如下图:

在这里插入图片描述

可以看到每个变量都是从载体系到世界坐标系的转换,不要被变量上面的IMU所迷惑了; b n ω , b n a \mathbf{b}_{n}^{\omega}, \mathbf{b}_{n}^{\mathrm{a}} bnω,bna是IMU的零偏, R n c , p n c \mathbf{R}_{n}^{\mathrm{c}}, \mathbf{p}_{n}^{\mathrm{c}} Rnc,pnc是IMU到载体系的外参矩阵,这里也做作为一个更新量进行了估计。

2. 系统方程

同正常的kalman滤波步骤一样,我们首先建立预测方程(文章中把预测阶段称为传播propagate)和更新方程:
(5) x n + 1 = f ( x n , u n ) + w n y n = h ( x n ) + n n \begin{aligned} \mathbf{x}_{n+1} &=f\left(\mathbf{x}_{n}, \mathbf{u}_{n}\right)+\mathbf{w}_{n} \\ \mathbf{y}_{n} &=h\left(\mathbf{x}_{n}\right)+\mathbf{n}_{n} \tag{5} \end{aligned} xn+1yn=f(xn,un)+wn=h(xn)+nn(5)

其中正如上面所说, y n y_n yn是辅助变量,理想情况下,我们的设置值为[0, 0],即 h ( x n ) ≈ 0 h\left(\mathbf{x}_{n}\right)\approx0 h(xn)0

3. 伪测量的建立

这部分更类似于观测方程的建立,主要是把状态估计中的速度(载体在世界坐标系下的速度,即 W V n ^WV_n WVn)转移到载体系下
v n c = [ v n f o r v n l a t v n u p ] = ( R n c ) T ( R n I M U ) T v n I M U + ( ω n ) × p n c \mathbf{v}_{n}^{\mathrm{c}}=\left[ \begin{array}{c}{v_{n}^{\mathrm{for}}} \\ {v_{n}^{\mathrm{lat}}} \\ {v_{n}^{\mathrm{up}}}\end{array}\right]=(\mathbf{R}_{n}^{\mathrm{c}})^T (\mathbf{R}_{n}^{\mathrm{IMU}})^T \mathbf{v}_{n}^{\mathrm{IMU}}+\left(\boldsymbol{\omega}_{n}\right) \times \mathbf{p}_{n}^{\mathrm{c}} vnc=vnforvnlatvnup=(Rnc)T(RnIMU)TvnIMU+(ωn)×pnc
对于汽车等只能向前的物体,上述的 v n l a t , v n u p v_n^{lat}, v_n^{up} vnlat,vnup的值应该近似于0,因此伪量测为
y n = [ y n l a t y n u p ] = [ h l a t ( x n ) + n n l a t h u p ( x n ) + n n u p ] = [ v n l a t v n u p ] + n n y_n=\left[\begin{array}{c}{y_n^{lat}} \\ {y_n^{up}}\end{array}\right]=\left[\begin{array}{c}{h^{lat}(x_n)+n_n^{lat}} \\ {h^{up}(x_n)+n_n^{up}}\end{array} \right]=\left[\begin{array}{c}{v_n^{lat}} \\ {v_n^{up}}\end{array} \right] + n_n yn=[ynlatynup]=[hlat(xn)+nnlathup(xn)+nnup]=[vnlatvnup]+nn
其中 n n n_n nn为噪声,这里算作一个松散的约束,这样的效果往往比强硬的把伪测量看做0要好的多。

系统的整体结构

整体结构如下图:

在这里插入图片描述

整体而言,系统使用IEKF进行状态的估计,而使用神经网络根据IMU的测量值产生出伪量测及其协方差,整个算法中预测阶段的系统噪声的协方差 Q Q Q是固定的,因为都是高斯白噪声。笔者还是比较看好这样的slam系统的,因为个人认为神经网络不是很适合slam这种几何学的问题,而作为辅助的话还是很看好的。

 

网络的设计

从系统结构图上可以看到,系统使用的是IMU的量测值,其为基于时间的一组序列,作者选择其中N组数据进行卷积,之后产生对应的测量协方差:
N n + 1 = C N N ( { ω i I M U , a i I M U } i = n − N n ) \mathbf{N}_{n+1}=\mathrm{CNN}\left(\left\{\omega_{i}^{\mathrm{IMU}}, \mathbf{a}_{i}^{\mathrm{IMU}}\right\}_{i=n-N}^{n}\right) Nn+1=CNN({ωiIMU,aiIMU}i=nNn)
作者说道设计中的三个动机如下:

  • 尽量使用小的参数防止过拟合;
  • 希望得到一个可解释的规则,例如转弯的时候,网络的输出要大一些;
  • 没有使用RNN是因为RNN的训练更加的艰难;

网络最终的输出为一个2维向量 z n = [ z n l a t , z n u p ] T ∈ R 2 z_n=[z_n^{lat}, z_n^{up}]^T \in R^2 zn=[znlat,znup]TR2,随后作者引入一个超参数 β \beta β用于控制协方差的扩张上下限,最终的协方差值取做:
N n + 1 = diag ⁡ ( σ  lat  2 1 0 β tanh ⁡ ( z n  lat  ) , σ  up  2 1 0 β tanh ⁡ ( z n  up  ) ) \mathbf{N}_{n+1}=\operatorname{diag}\left(\sigma_{\text { lat }}^{2} 10^{\beta \tanh \left(z_{n}^{\text { lat }}\right)}, \sigma_{\text { up }}^{2} 10^{\beta \tanh \left(z_{n}^{\text { up }}\right)}\right) Nn+1=diag(σ lat 210βtanh(zn lat ),σ up 210βtanh(zn up ))
因此协方差的动态变化范围为 1 0 − β ~ 1 0 β 10^{-\beta}~10^{\beta} 10β10β

网络采用1维卷积的方式,共2层,第一层卷积核的大小为5,输出的深度为32,膨胀系数为1,第二层卷积核大小为5,输出深度为32,膨胀系数为3,最后还有一个全连接层将特征输出综合输出为2,取得滑动窗口的大小为N=15,最终一共产生的参数量为6210(这个参数量笔者计算的稍微不太对,按照stride=2来计算的话最终的结果是6304)。

在实现的一些初始参数这里就不过多解释了,需要注意的是,用于不同的机器人的时候,需要对这些参数稍加修改,具体还是参照论文中的部分。

网络的训练

网络的训练步骤就是:

  • 选取数据;
  • 计算滤波器的输出与真实轨迹之间的误差e,之后按照公式更新kalman滤波器的参数,包括协方差矩阵等等,对于量测方程中的量测协方差 R R R,一般滤波器中该参数为人为设定,这里应该看做变量,之后根据链式法则将误差e传递回来,送给网络进行权重的调整;
  • 更新网络的参数;

具体的一些超参数这里就不赘述了。

 

最终的结果

论文最终对比了IMLS(以激光雷达数据为基础),双目ORB-SLAM2和纯IMU进行积分的方法,结果如下:

在这里插入图片描述

结论还是很强势的,毕竟只是使用IMU的数据进行航位推算,最终能达到比ORB-SLAM2的效果还要还一点也确实很不错了。

除此之外,还记得作者设计网络时候的三个动机吗?作者也把其中第二个动机进行了验证,结果如下图:

在这里插入图片描述
恩~果然在转弯的时候,方差出现了变化。

 

总结

笔者最后把github上的代码下载下来运行了一下,几个测试数据集的效果还是不错的,是一个足以期待的方向。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AI-IMU Dead-Reckoning论文总结 的相关文章

  • 鱼眼+红外+IMU+VSLAM+SLAM

    一 目的 1 想知道 xff1a 二 参考 1 一分钟详解鱼眼镜头标定基本原理及实现 https mp weixin qq com s VyxoTaYtYPB Bfh3JCXl1A 三 注意 四 操作
  • ROS | Realsense中的IMU解算orientation

    文章目录 概述 一 定义介绍 二 操作教程 一 下载并编译imu tools功能包 1 创建工作空间并初始化 2 下载imu tools并编译 二 修改配置 1 修改imu tools源码 2 修改launch文件 3 启动解算 概述 本文
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • realsense D435i双目IMU 数据集

    realsense D435i 双目IMU数据集 使用双目 43 IMU的数据双目内参双目IMU外参 使用双目 43 IMU的数据 双目内参 model type PINHOLE camera name camera image width
  • Camera-IMU标定工具Kalibr的编译

    关于catkin make过程中下载suitesparse过久甚至失败的问题 xff1a 在安装kalibr时的suitesprse库时 xff0c 对应的cmakelists中会通过wget 下载压缩包 xff0c 若无法下载则整个kal
  • VINS slam , imu fusion

    VINS 基本介绍 VINS Mono 和 VINS Mobile 是香港科技大学沈劭劼老师开源的单目视觉惯导 SLAM 方案 2017年发表于 IEEE Transactions on Robotics 另外 xff0c VINS 的最新
  • Ubuntu18下xsens IMU的驱动安装及使用imu_utils标定

    最近在做xsens IMU的标定工作 xff0c 网上资源很多很杂 xff0c 打算按自己的操作过程 细节及遇到的问题记录一下 xff0c 里面有参考的博文都附了链接 主体可参考此博文 xff1a VIO 中 IMU 的标定流程 1 3 i
  • ORB-SLAM3测试:数据集(单目/双目/imu)& ROS (D435 T265)

    ORB SLAM3环境配置 安装各种依赖库 orb slam3非常友好 xff0c 不用自己下载各种依赖库 xff0c 因为他们全部在thirdParty文件夹中 xff0c 编译orb slam3的同时会自动编译各种依赖库 Eigen3
  • 【SLAM】VINS-MONO解析——IMU预积分

    4 IMU预积分 IMU预积分主要干了2件事 xff0c 第一个是IMU预积分获得 值 xff0c 另一个是误差传递函数的获取 本部分的流程图如下图所示 各个部分的讲解如下链接 xff1a SLAM VINS MONO解析 综述 SLAM
  • BetaFlight深入传感设计之三:IMU传感模块

    BetaFlight深入传感设计之三 xff1a IMU传感模块 1 HwPreInit HwInit阶段1 1 业务HwPreInit gyroPreInit1 2 业务HwInit gyroInit amp accInit1 2 1 g
  • 常见IMU的性能比较

    型号gyr零偏稳定性gyr量程acc零偏稳定性acc量程HZ价格其他说明 EG320N xff08 epson xff09 http www canalgeomatics com wp content uploads 2020 06 oem
  • Imu误差模型、零偏、零偏稳定性

    原文链接 零偏 xff0c 零偏稳定性和零偏重复性 xff0c IMU误差模型 什么是零偏 xff08 Bias xff09 在陀螺静止时 xff0c 陀螺仪仍会 xff0c 以规定时间内测得的输出量平均值相应的等效输入角速率表示 xff0
  • 星网宇达(惯导+IMU)设备实现自动采点

    一 创建和打开gps Road txt文件 xff0c 准备往里写数据 FILE span class token operator span p span class token operator 61 span span class t
  • 惯导(IMU)的使用

    提示 xff1a 和上一篇关于利用imu计算位移的文章相比 xff0c 这篇我对imu的理解应该是更加深刻了 目录 前言 一 imu调试 二 利用IMU计算旋转 1 引入库 2 读入数据 总结 前言 这次使用的imu和上一篇文章中所提到的i
  • Kalibr进行相机-IMU联合标定踩坑记录RuntimeError: Optimization failed!

    1 具体标定步骤 xff0c 跟网上别的一模一样 xff0c 此处就不列举 2 记录踩坑过程 xff1a RuntimeError Optimization failed 当执行到开始联合标定时 xff0c 也就是如下指令 xff1a ka
  • IMU-Allan方差分析

    使用Allan方差来确定MEMS陀螺仪的噪声参数 陀螺仪测量模型为 使用长时间静止的陀螺仪数据对陀螺仪噪声参数进行分析 上式中 三个噪声参数N 角度随机游走 K 速率随机游走 和B 偏差不稳定性 背景 Allan方差最初由David W A
  • CeiT:训练更快的多层特征抽取ViT

    GiantPandaCV导语 来自商汤和南洋理工的工作 也是使用卷积来增强模型提出low level特征的能力 增强模型获取局部性的能力 核心贡献是LCA模块 可以用于捕获多层特征表示 引言 针对先前Transformer架构需要大量额外数
  • An Introduction for IMU 2 - IMU数据融合与姿态解算

    在上一篇博客中 我们已经介绍了IMU的内部工作原理 以及如何通过Arduino读取MPU6050的数据 虽然可以从DMP直接读取姿态角 但其数据返回的频率相对较低 同时由于DMP库不是开源的 其内部的工作原理 输出姿态角的准确性都不清楚 而
  • 四元素与旋转矩阵

    如何描述三维空间中刚体的旋转 是个有趣的问题 具体地说 就是刚体上的任意一个点P x y z 围绕过原点的轴 i j k 旋转 求旋转后的点P x y z 旋转矩阵 旋转矩阵乘以点P的齐次坐标 得到旋转后的点P 因此旋转矩阵可以描述旋转 x

随机推荐