PSINS惯性系初始对准与代码解读


码字不易,转载请注明出处

0.前言

严恭敏老师的开源代码库psins中,惯性系对准代码alingi0与《捷联惯导与组合导航》一书理论部分并没有严格对应,相应的资料也不太好找,学习中废了挺多脑筋。

本文参考“摇摆基座上基于信息的捷联惯导粗对准研究”(秦永元),以及“严恭敏博士后研究报告”,详细解读并推导了静基座惯性系对准算法,并与PSINS代码进行对照解读。希望能对惯导初学者有所帮助,同时也欢迎各位大佬雅正。

1.坐标系定义

  1. 地心惯性坐标系( i i i系):
    o x i ox_i oxi轴在赤道平面内且指向春分点, o z i oz_i ozi轴指向地球自转方向,三轴构成右手坐标系;

  2. 地球坐标系( e e e系):
    o x e ox_e oxe轴在赤道平面内且指向中央子午线, o z e oz_e oze轴沿地球自转方向,三轴构成右手坐标系,e系与地球固连,e系相对于i系的转动角速率即为地球自转角速率 ;

  3. 导航坐标系( n n n系):
    选取“东-北-天( E − N − U E-N-U ENU)”坐标系为导航坐标系( n n n系);

  4. 载体坐标系( b b b系):
    定义“右-前-上( R − F − U R-F-U RFU)”坐标系为捷联惯导坐标系( b b b系),或称之为运载体坐标系;

  5. 初始时刻惯性坐标系( i 0 i_0 i0系):
    在初始对准起始时刻(即当 t = t 0 = 0 t=t_0=0 t=t0=0 时), o x i 0 ox_{i_0} oxi0轴在当地子午面内且平行于赤道平面, o z i 0 oz_{i_0} ozi0轴指向地球自转方向,三轴构成右手坐标系,初始对准开始后 i 0 i_0 i0系三轴方向相对惯性空间保持不动;

  6. 初始时刻地球坐标系( e 0 e_0 e0系):
    原点为地球中心, o x e 0 ox_{e_0} oxe0轴在赤道平面内且指向初始对准开始时刻的当地子午线, o z e 0 oz_{e_0} oze0沿地球自转方向,三轴构成右手坐标系, e 0 e_0 e0系也与地球固连,并且 e 0 e_0 e0系与 i 0 i_0 i0系之间方位关系是前者只绕后者的 o z i 0 oz_{i_0} ozi0轴转动了 ω i e t {\omega}_{ie}t ωiet角度;

  7. 初始时刻导航坐标系( n 0 n_0 n0系):
    把初始对准开始时刻的导航坐标系定义为 n 0 n_0 n0系,它相对地球表面固定不动,即不随捷联惯导在地球表面运动而运动;

  8. 初始时刻捷联惯导惯性坐标系( i b 0 i_b0 ib0系):
    t 0 t_0 t0时刻 i b 0 i_{b_0} ib0系重合于b系,初始对准开始后 i b 0 i_{b0} ib0 系不随捷联惯导转动,即在惯性空间中保持指向不变。

2.传统解析式对准算法

静基座下即捷联惯组静止不动时,加速度计的比力输出 f ~ s f b \tilde{f}^b_{sf} f~sfb测量的是重力加速度矢量 g g g在b系中的投影 − g b -g^b gb,陀螺角速度输出 b ~ i b b \tilde{b}^b_{ib} b~ibb测量的是地球自转角速度矢量 ω i e {\omega}_{ie} ωie在b系中的投影 ω i e b {\omega}^b_{ie} ωieb。当对准地点的地理位置准确已知时,物理量 g g g ω i e {\omega}_{ie} ωie在n系中的投影 g n g^n gn ω i e n {\omega}^n_{ie} ωien也是已知的。由姿态矩阵 C b n C^n_b Cbn可建立如下两个转换关系式:
− f ~ s f b = C n b g n ω ~ i b b = C n b ω i e n \begin{aligned} -\tilde{f}^b_{sf}=&C^b_ng^n \\ \tilde{\omega}^b_{ib}=&C^b_n{\omega}^n_{ie} \end{aligned} f~sfb=ω~ibb=CnbgnCnbωien式中 [ 0 0 − g ] T \begin{bmatrix}0&0&-g\end{bmatrix}^T [00g]T,g为重力加速度大小; ω i e n = [ 0 ω i e c o s L ω i e s i n L ] T {\omega}^n_{ie}=\begin{bmatrix}0&{\omega}_{ie}cosL&{\omega}_{ie}sinL\end{bmatrix}^T ωien=[0ωiecosLωiesinL]T,L是当地地理纬度, ω i e {\omega}_{ie} ωie是地球自转角速度。通过公式(1)可求出得初始对准姿态矩阵 C b n C^n_b Cbn1

C b n = [ ( g n ) T ( g n × ω i e ) T ( g n × ω i e × g n ) T ] − 1 [ ( − f ~ s f b ) T ( − f ~ s f b × ω ~ i b b ) T ( f ~ s f b × ω ~ i b b × f ~ s f b ) T ] (1) C^n_b= \begin{bmatrix} (g^n)^T\\ (g^n\times{\omega}_{ie})^T\\ (g^n\times{\omega}_{ie}\times g^n)^T \end{bmatrix}^{-1} \begin{bmatrix} (-\tilde{f}^b_{sf})^T\\ (-\tilde{f}^b_{sf}\times\tilde{\omega}^b_{ib})^T\\ (\tilde{f}^b_{sf}\times\tilde{\omega}^b_{ib}\times \tilde{f}^b_{sf})^T \end{bmatrix} \tag{1} Cbn= (gn)T(gn×ωie)T(gn×ωie×gn)T 1 (f~sfb)T(f~sfb×ω~ibb)T(f~sfb×ω~ibb×f~sfb)T (1)

3.惯性系初始对准:

秦永元老师在论文中指出,上述对准方法仅适用于微小晃动的对准环境2 ,而惯性系对准的基本思想是,从惯性坐标系观察地球表面上某固定点的重力矢量,通过在不同时间对重力矢量的观测,进行双/多矢量定姿。该方法具备极强的抗角运动能力。非常适用于线运动不强但角运动明显的场景。

惯性空间中观察不同时刻的重力矢量

虽然原理如上所述,但PSINS的代码实现与书中1 并不完全一致,现按照PSINS代码的算法编排,推导如下:

3.1.基本原理:

将姿态矩阵作如下分解,分别求出各个变换关系然后组合。
C b n = C e n C i e C i b 0 i C b i b 0 (2) C^n_b=C^n_eC^e_iC^i_{i_{b_0}}C^{i_{b_0}}_b\tag{2} Cbn=CenCieCib0iCbib0(2)
下面分步推导涉及的变换矩阵

3.2. C e n C^n_e Cen:地球坐标系(e)到导航坐标系(n)的转换矩阵

从e系到n系的转换可分为两个步骤:
1、沿Z轴逆时针旋转 90 + λ 90+\lambda 90+λ,使X轴和East轴重合。
2、沿East轴(新X轴)逆时针旋转 90 − φ 90-\varphi 90φ ,使Z轴和UP轴重合。
ECEF和ENU的转换
以上旋转即:
[ x y z ] = R 3 [ − ( π / 2 + λ ) ] R 1 [ − ( π / 2 − φ ) ] \begin{bmatrix} x\\ y\\ z \end{bmatrix}=R_3[-(\pi/2+\lambda)]R_1[-(\pi/2-\varphi)] xyz =R3[(π/2+λ)]R1[(π/2φ)]
其中
R 1 [ θ ] = [ 1 0 0 0 c o s ( θ ) s i n ( θ ) 0 − s i n ( θ ) c o s ( θ ) ] ; R 2 [ θ ] = [ c o s ( θ ) 0 s i n ( θ ) 0 1 0 − s i n ( θ ) 0 c o s ( θ ) ] R 3 [ θ ] = [ c o s ( θ ) s i n ( θ ) 0 − s i n ( θ ) c o s ( θ ) 0 0 0 1 ] \begin{aligned} &R_1[\theta]= \begin{bmatrix} 1&0&0\\ 0&cos(\theta)&sin(\theta)\\ 0&-sin(\theta)&cos(\theta) \end{bmatrix}; R_2[\theta]= \begin{bmatrix} cos(\theta)&0&sin(\theta)\\ 0&1&0\\ -sin(\theta)&0&cos(\theta) \end{bmatrix}\\ &R_3[\theta]= \begin{bmatrix} cos(\theta)&sin(\theta)&0\\ -sin(\theta)&cos(\theta)&0\\ 0&0&1 \end{bmatrix} \end{aligned} R1[θ]= 1000cos(θ)sin(θ)0sin(θ)cos(θ) ;R2[θ]= cos(θ)0sin(θ)010sin(θ)0cos(θ) R3[θ]= cos(θ)sin(θ)0sin(θ)cos(θ)0001
带入得:
R 3 [ − ( π / 2 + λ ) ] R 1 [ − ( π / 2 − φ ) ] = ( − s i n ( λ ) c o s ( λ ) 0 − c o s ( λ ) s i n ( φ ) − s i n ( λ ) s i n ( φ ) c o s ( φ ) c o s ( λ ) c o s ( φ ) s i n ( λ ) c o s ( φ ) s i n ( φ ) ) (3) R_3[-(\pi/2+\lambda)]R_1[-(\pi/2-\varphi)]= \begin{pmatrix} -sin(\lambda)&cos(\lambda)&0\\ -cos(\lambda)sin(\varphi)&-sin(\lambda)sin(\varphi)&cos(\varphi)\\ cos(\lambda)cos(\varphi)&sin(\lambda)cos(\varphi)&sin(\varphi)\tag{3} \end{pmatrix} R3[(π/2+λ)]R1[(π/2φ)]= sin(λ)cos(λ)sin(φ)cos(λ)cos(φ)cos(λ)sin(λ)sin(φ)sin(λ)cos(φ)0cos(φ)sin(φ) (3)
通常,e系的x轴是指向n系原点所在子午线与赤道交点的,即 λ = 0 \lambda=0 λ=0代入(3)可得:
C e n = R 3 [ − ( π / 2 ) ] R 1 [ − ( π / 2 − φ ) ] = ( 0 1 0 − s i n ( φ ) 0 c o s ( φ ) c o s ( φ ) 0 s i n ( φ ) ) (4) C^n_e= R_3[-(\pi/2)]R_1[-(\pi/2-\varphi)]= \begin{pmatrix} 0&1&0\\ -sin(\varphi)&0&cos(\varphi)\\ cos(\varphi)&0&sin(\varphi)\tag{4} \end{pmatrix} Cen=R3[(π/2)]R1[(π/2φ)]= 0sin(φ)cos(φ)1000cos(φ)sin(φ) (4)

3.3. C i e C^e_i Cie:地球坐标系(e)到惯性系(i)的转换矩阵

e系相对i系是沿z轴的定轴转动,转动角度为 ω i e ⋅ t {\omega}_{ie}\cdot t ωiet旋转矩阵为:
C i e = [ c o s ω i e ⋅ t s i n ω i e ⋅ t 0 − s i n ω i e ⋅ t c o s ω i e ⋅ t 0 0 0 1 ] (5) C^e_i= \begin{bmatrix} cos{\omega}_{ie}\cdot t&sin{\omega}_{ie}\cdot t&0\\ -sin{\omega}_{ie}\cdot t&cos{\omega}_{ie}\cdot t&0\\ 0&0&1\tag{5} \end{bmatrix} Cie= cosωietsinωiet0sinωietcosωiet0001 (5)

3.4. C b i b 0 C^{i_{b_0}}_b Cbib0:初始捷联惯导惯性系( i b 0 i_{b_0} ib0)到捷联惯导坐标系(b)的转换矩阵

初始时刻两个坐标系是重合的,即 C b i b 0 ( t = 0 ) = I C_b^{i_{b_0}} (t=0)=I Cbib0(t=0)=I,之后利用陀螺输出的角运动信息,通过捷联惯导姿态更新算法(下式)可以很容易实时求得矩阵 C b i b 0 ( t ) C_b^{i_{b_0}} (t) Cbib0(t):
C ˙ t i b 0 ( t ) = C b i b 0 ( t ) [ ω i 0 b b ( t ) × ] (6) \dot C_t^{i_{b_0}}(t)=C_b^{i_{b_0}}(t)[\omega ^b_{i_0b}(t)_{\times}]\tag{6} C˙tib0(t)=Cbib0(t)[ωi0bb(t)×](6)
其中 [ ω i 0 b b ( t ) × ] [\omega ^b_{i_0b}(t)_{\times}] [ωi0bb(t)×]表示由陀螺测量输出的角增量构成的反对称矩阵,可通过n子样算法近似计算等效旋转矢量后求解,即ins的姿态更新。

3.5. C i b 0 i C^i_{i_{b_0}} Cib0i:惯性系(i)到初始捷联惯导惯性系( i b 0 i_{b_0} ib0)的转换矩阵

(此处推导有区别于秦永元论文与严恭敏博士后报告论文,重点在于静基座、微小晃动)
在静止基座上,加速度计输出的比力在坐标系 i b 0 i_{b_0} ib0的投影为:
C b i b 0 f ~ s f b = C b i b 0 ( − g b + ∇ b ) (7.1) C^{i_{b_0}}_b\tilde f^b_{sf}=C^{i_{b_0}}_b(-g^b+\nabla^b)\tag{7.1} Cbib0f~sfb=Cbib0(gb+b)(7.1)
其中 ∇ b = δ f s f b + v ˙ b \nabla^b=\delta f^b_{sf}+\dot v^b b=δfsfb+v˙b是比力测量误差和线速度干扰。
对(7.1)在 [ t 0 , t k ] [t_0,t_k] [t0,tk]内积分
v ~ b 0 i = ∫ t 0 t k C b i b 0 f ~ s f b   d t = − C i i b 0 ∫ t 0 t k g i   d t + ∫ t 0 t k ∇ i b 0   d t (7.2) \tilde v^i_{b_0}= \int_{t_0}^{t_k} C^{i_{b_0}}_b\tilde f^b_{sf}\, {\rm d}t =-C^{i_{b_0}}_i\int_{t_0}^{t_k} g^i\, {\rm d}t+ \int_{t_0}^{t_k} \nabla^{i_{b_0}}\, {\rm d}t\tag{7.2} v~b0i=t0tkCbib0f~sfbdt=Ciib0t0tkgidt+t0tkib0dt(7.2)

v b 0 i = − C i i b 0 ∫ t 0 t k g i   d t v^i_{b_0}=-C^{i_{b_0}}_i\int_{t_0}^{t_k} g^i\,{\rm d}t vb0i=Ciib0t0tkgidt
其中
g i = C e i C n e [ 0 0 − g ] = [ − g c o s L c o s ω i e ( t − t 0 ) − g c o s L s i n ω i e ( t − t 0 ) − g s i n L ] (7.3) g^i=C^i_eC^e_n \begin {bmatrix} 0\\ 0\\ -g \end{bmatrix}= \begin{bmatrix} -gcosLcos\omega_{ie}(t-t_0)\\ -gcosLsin\omega_{ie}(t-t_0)\\ -gsinL \end{bmatrix}\tag{7.3} gi=CeiCne 00g = gcosLcosωie(tt0)gcosLsinωie(tt0)gsinL (7.3)
积分得
v i ( t k ) = [ g c o s L ω i e s i n ω i e t k g c o s L ω i e ( 1 − c o s ω i e t k ) t k g s i n L ] (7.4) v^i(t_k)= \begin{bmatrix} \cfrac{gcosL}{\omega_{ie}}sin\omega_{ie}t_k\\ \cfrac{gcosL}{\omega_{ie}}(1-cos\omega_{ie}t_k)\\ t_k g sinL \end{bmatrix}\tag{7.4} vi(tk)= ωiegcosLsinωietkωiegcosL(1cosωietk)tkgsinL (7.4)
再次积分得(此处第二个元素原来多写了个负号,现已修改,感谢@Williams_lwq):
P i ( t k ) = [ g c o s L ω i e 2 ( 1 − c o s ω i e t k ) g c o s L ω i e 2 ( ω i e t k − s i n ω i e t k ) t k 2 g s i n L 2 ] (7.5) P^i(t_k)= \begin{bmatrix} \cfrac{gcosL}{\omega^2_{ie}}(1-cos\omega_iet_k)\\ \cfrac{gcosL}{\omega^2_{ie}}(\omega_{ie}t_k-sin\omega_{ie}t_k)\\ \cfrac{t_k^2gsinL}{2} \end{bmatrix}\tag{7.5} Pi(tk)= ωie2gcosL(1cosωietk)ωie2gcosL(ωietksinωietk)2tk2gsinL (7.5)
当线运动极小时:
v ~ b 0 i ≈ v b 0 i = C i i b 0 v i P ~ b 0 i ≈ P i b 0 = C i i b 0 P i \tilde v^i_{b_0}\approx v^i_{b_0}=C^{i_{b_0}}_i v^i\\ \tilde P^i_{b_0}\approx P^{i_{b_0}}=C^{i_{b_0}}_iP^i v~b0ivb0i=Ciib0viP~b0iPib0=Ciib0Pi
v ~ b 0 i , P ~ b 0 i \tilde v^i_{b_0},\tilde P^i_{b_0} v~b0i,P~b0i为真实的速度和位移量,可以由INS速度、位置更新求解。
采取两个不同时间间隔的数据 t k 1 , t k 2 t_{k_1},t_{k_2} tk1,tk2构建双矢量定姿方程(参考书上1P194):
C ^ i i b 0 = [ [ v i ( t k 1 ) ] T [ v i ( t k 2 ) ] T [ v i ( t k 1 ) ] T × [ v i ( t k 2 ) ] T ] − 1 ⋅ [ [ v ~ i b 0 ( t k 1 ) ] T [ v ~ i b 0 ( t k 2 ) ] T [ v ~ i b 0 ( t k 1 ) ] T × [ v ~ i b 0 ( t k 2 ) ] T ] (7.6) \hat C_i^{i_{b_0}}= \begin{bmatrix} [v^i(t_{k_1})]^T\\ [v^i(t_{k_2})]^T\\ [v^i(t_{k_1})]^T\times[v^i(t_{k_2})]^T \end{bmatrix}^{-1} \cdot \begin{bmatrix} [\tilde v^{i_{b_0}}(t_{k_1})]^T\\ [\tilde v^{i_{b_0}}(t_{k_2})]^T\\ [\tilde v^{i_{b_0}}(t_{k_1})]^T\times[\tilde v^{i_{b_0}}(t_{k_2})]^T \end{bmatrix}\tag {7.6} C^iib0= [vi(tk1)]T[vi(tk2)]T[vi(tk1)]T×[vi(tk2)]T 1 [v~ib0(tk1)]T[v~ib0(tk2)]T[v~ib0(tk1)]T×[v~ib0(tk2)]T (7.6)
位置矢量的求解与上式原理相同。
最后将解得的(4)(5)(6)(7.6)带入(2)求得 C b n C^n_b Cbn,完成初始对准。
该方法对角运动有很好的抗干扰能力,在线运动不明显的时候,短时间即可达到较高精度对准。

4.代码解析

CAlign0.m

在这里插入图片描述
在这里插入图片描述
35行—计算等效旋转矢量与补偿后的速度增量
36行—计算初始比力
40行—速度更新,对应(7.6)中的 v ~ i b 0 \tilde v^{i_{b_0}} v~ib0
41行—位置更新,对应(7.6)中的 P ~ i b 0 \tilde P^{i_{b_0}} P~ib0
45行—计算惯性系观测速度位移,对应(7.*)中的 g i , v i , P i g^i,v^i,P^i gi,vi,Pi 。代码解析见下文
46行—初始捷联惯导惯性系到捷联惯导坐标系(t)的转换矩阵,对应(6)
52行—对应(4)乘以(5)
47行—选取 t ( k 1 ) = 0.5 t ( k 2 ) t_(k_1 )=0.5t_(k_2 ) t(k1)=0.5t(k2)时刻,为参与定姿的矢量变量赋值
56行—对应(7.6)
57行—对应(2)完成求解

i0fvp

在这里插入图片描述
21行—对应(7.3)
22行—对应(7.4)
23行—对应(7.5)

码字不易,转载请注明出处


  1. 《捷联惯导算法与组合导航》(严恭敏著)第七章第一节。 ↩︎ ↩︎ ↩︎

  2. 摇摆基座上基于信息的捷联惯导粗对准研究”(秦永元) ↩︎

  • 17
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
惯性导航初始对准算法一般使用的是卡尔曼滤波算法,以下是一个简单的示例代码,供参考: ```matlab % 假设已经读取了惯性测量单元(IMU)的数据,其中包括角速度和加速度 % 数据格式为一个 6 行 N 列的矩阵,前三行为角速度,后三行为加速度 % 初始化状态向量,包括三个欧拉角和三个角速度 x = zeros(6, 1); % 初始化状态协方差矩阵 P = eye(6); % 初始化状态转移矩阵,假设采样时间为 0.01s dt = 0.01; F = [eye(3) dt*eye(3); zeros(3) eye(3)]; % 初始化观测矩阵 H = [eye(3) zeros(3)]; % 初始化过程噪声协方差矩阵和观测噪声协方差矩阵 Q = eye(6) * 0.01; R = eye(3) * 0.1; % 循环处理每个采样点 for i = 1:N % 获取角速度和加速度 omega = data(1:3, i); accel = data(4:6, i); % 计算状态转移矩阵 phi = eye(3) + dt * skew(omega); G = dt * eye(3); F(1:3, 4:6) = phi; F(4:6, 1:3) = -skew(accel) * dt; F(4:6, 4:6) = eye(3) - dt * skew(omega); % 预测状态和协方差 x = F * x; P = F * P * F' + G * Q * G'; % 进行观测更新 if mod(i, 10) == 0 % 每隔 10 个采样点进行一次更新 z = accel; y = z - H * x; S = H * P * H' + R; K = P * H' / S; x = x + K * y; P = P - K * H * P; end end % 最终得到的状态向量 x 中包含了初始对准的欧拉角和角速度信息 % 可以将欧拉角转换为旋转矩阵,用于对惯性测量单元进行姿态解算 ``` 注意,上述代码中的 `skew` 函数用于计算一个向量的叉乘矩阵,定义如下: ```matlab function S = skew(v) S = [0 -v(3) v(2); v(3) 0 -v(1); -v(2) v(1) 0]; end ``` 此外,该代码中假设采样时间为 0.01s,每隔 10 个采样点进行一次观测更新,这些参数需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值