NOTE / 2021/12/12
[SINS]捷联惯导更新算法
SLAM技术笔记SLAMVIO传感器融合
最近了解了一些高精捷联惯导的知识,在此做一些总结。 因为自己刚接触这个领域,可能会有不少差错,欢迎指正。
本篇实现了一套北方位捷联惯导更新算法。在给定位置、姿态、速度初值的基础上,通过IMU积分来获取实时的位置姿态。主要参为严恭敏老师的《捷联惯导算法与组合导航原理》以及PSINS工具箱。
算法原理
1.1 姿态更新算法
姿态微分方程方程为:
C˙bn=Cbn(ωnbb×)
但是用这个方程做姿态更新会非常复杂。我们可以把旋转矩阵用链式方法分解成两个矩阵的相乘:
Cb(m)n(m)=Cin(m)Cb(m)i
这样,我们可以分别更新右边这两个矩阵更加方便。
Cb(m)i=Cb(m−1)iCb(m)b(m−1)Cin(m)=Cn(m−1)n(m)Cin(m−1)
综合以上可以得到,姿态更新的实用方法:
Cb(m)n(m)=Cn(m−1)n(m)Cb(m−1)n(m−1)Cb(m)b(m−1)
左边这一项为当地导航系的变化,由速度和地球自转引起,这两个旋转速度都为平稳变化量,可以采用欧拉积分。
Cn(m−1)n(m)=Cn(m)n(m−1)=MT(ϕinn)≈MT(ωin(m)nΔT)ϕinn=ωien+ωennωien=[0ωiecosLωiesinL]Tωenn=[−RM+hvNRN+hvERN+hvEtanL]T
右边这一项,为快速变化量。需要采用更高精的积分方法,这里采用二子样算法:
Cb(m)b(m−1)=M(ϕib(m)b)ϕib(m)b=(Δθm1+Δθm2)+32Δθm1×Δθm2
1.2 速度更新
比力方程:
v˙enn=Cbnfsfb−(2ωien+ωenn)×venn+gn
对这个式子进行积分:
vmn(m)=vm−1n(m−1)+Δvsf(m)n+Δvcor/g(m)n
其中,第二项:
Δvcor/g(m)n=∫m−1m−(2ωien+ωenn)×venn+gndt
为有害加速度导致的速度增量,被积分的量是一些缓慢变化的量,可以采用梯形积分有:
Δvcor/g(m)n=(−(2ωien+ωenn)×venn+gn)(m−1/2)ΔT
这里的量需要采用外推法获取:
xm−1/2=xm−1+2xm−1−xm−2=23xm−1−xm−2 (x=ωien,ωenn,vn,gn)
其中,第三项
Δvsf(m)n=∫m−1mCbnfsfbdt
为比力导致的速度增量,里面的旋转矩阵和比例都是快速变化量,需要采用高精度的积分方法才能保证精度。
Δvsf(m)n=[I−2ΔT(ωin(m−1/2)n×)]Cb(m−1)n(m−1)(Δvm+Δvrotb+Δvsculb)
其中
Δvrotb=21Δθm×Δvm
为速度旋转误差补偿量。
Δvsculb=32(Δθm1×Δvm2+Δvm1×Δθm2)
为二子样的划桨误差补偿量。
其中 Δθm Δvm为IMU输出的角增量或者速度增量。
1.3 位置更新算法
位置微分方程
p˙=Mvnp=LλhM=0secL/RN+h0RM+h100001
位置更新算法引起的计算误差一般比较小,可以采用比较简单的梯形积分:
pm=pm−1+Mm−1/2(vm−1n+vmn)2ΔT
Mm−1/2 可以采用简单的外推法获得。
2. 代码
https://github.com/ydsf16/TinyGrapeKit/tree/master/app/SINS/Core/InsUpdate
3. 实验测试
同样用上一篇小葡萄:[SINS] 高精度捷联惯导初始对准 相同的数据。
一组光纤惯组SPANISA跑车测试-高精度捷联惯导算法
这段数据用Novatel 100C录制,并且提供了IE后处理结果,可以作为真值适用。
对比INS积分与真值。可以看出1个多小时积分,姿态最大的误差不超过1.5角分【~0.025度】,速度误差不超过2m/s,姿态误差<1500m。精度还是非常高的。
INS积分与IE真值对比【左侧的图为AVP的值,右侧为INS积分与IE真值的对比】【用PSINS工具箱绘制】
INS积分轨迹【红色】与真值轨迹【黑色】对比。【QGIS绘制】