姿态解算(更新)的本质就是解 姿态的微分方程。
而表示姿态的方法不同,如欧拉角、方向余弦矩阵、四元数、旋转矢量;
因此,分别有各自的表示方法下的微分方程,也就得到了各自的解算方法。
此处,仅介绍其微分方程。
(其应用:一是在仿真程序数据生成时;二是在大失准角的初始对准中)
秦书P279
力学中,常用 欧拉角 确定动坐标系相对参考坐标系的角位置关系。
如:运载体的航向角 Ψ Ψ ,俯仰角 θ θ ,横滚角 γ γ 实质上就是一组欧拉角,它们描述了机体坐标系(动)相对于地理坐标系(参考)的角位置关系。
地理坐标系 g g 系,绕 Z,X,Y Z , X , Y 分别转过 Ψ,θ,γ Ψ , θ , γ
ωnb ω n b 为姿态速率,即,机体坐标系 b b 系相对于导航坐标系 n(g) n ( g ) 系的角速度。
且按 ω^bnb=ω~bib−ω^bin ω ^ n b b = ω ~ i b b − ω ^ i n b 确定,
那么,欧拉角微分方程就是:
此处仅介绍姿态矩阵的微分方程:
秦书P280
有四种形式,此处仅给出实际中常用的两种,且推导过程略。
四元数可以用来表示某一时刻,如 tk t k ,的姿态,此时称为姿态四元数;(一般记为大写 Q(tk) Q ( t k ) )
也可以用来表示,从 tk t k 到 tk+1 t k + 1 时刻姿态的变化,此时称为姿态变换四元数;(一般记为小写 q(h) q ( h ) ,其中 h=tk+1−tk h = t k + 1 − t k )
旋转矢量是另外一种 表示姿态变化的方式,因此和姿态变化四元数存在如下关系:
此处简单推导一下,姿态变换四元数用于姿态更新:
rn(k+1)=Cn(k+1)b(k+1)rb(k+1) r n ( k + 1 ) = C b ( k + 1 ) n ( k + 1 ) r b ( k + 1 ) ,对应 rn(k+1)=Q(tk+1)⊗rb(k+1)⊗Q(tk+1)∗ r n ( k + 1 ) = Q ( t k + 1 ) ⊗ r b ( k + 1 ) ⊗ Q ( t k + 1 ) ∗
上面两个式子分别用 余弦矩阵和四元数乘表示了向量的坐标变换。
而 rn(k+1)=Cn(k+1)n(k)Cn(k)b(k)Cb(k)b(k+1)rb(k+1) r n ( k + 1 ) = C n ( k ) n ( k + 1 ) C b ( k ) n ( k ) C b ( k + 1 ) b ( k ) r b ( k + 1 )
对应
rn(k+1)=p∗(h)⊗{Q(tk)⊗[q(h)⊗rb(k+1)⊗q∗(h)]⊗Q(tk)∗}⊗p(h) r n ( k + 1 ) = p ∗ ( h ) ⊗ { Q ( t k ) ⊗ [ q ( h ) ⊗ r b ( k + 1 ) ⊗ q ∗ ( h ) ] ⊗ Q ( t k ) ∗ } ⊗ p ( h )
这样就得到:
在一个姿态更新周期里, Cn(k+1)n(k)≈I C n ( k ) n ( k + 1 ) ≈ I ,即, p(h)≈1 p ( h ) ≈ 1
此时,做一下近似:
于是,问题的关键落到了姿态变化四元数 q(h) q ( h ) ,或者说旋转矢量 Φ Φ 的求解上。
此处,编写两个函数:(要求尽可能独立和模块化)
function Qk1=updateQk(Qk,qh)
% This function is to update Q(tk) to Q(tk+1)
% Qk1 = Qk \otimes qh = M(Qk)qh
% Make sure Qk,qh are both a 4-by-1 column vector
% changshen_xu
% 2018-07-17
%
% M = [Qk(1),-Qk(2),-Qk(3),-Qk(4);
% Qk(2), Qk(1),-Qk(4), Qk(3);
% Qk(3), Qk(4), Qk(1),-Qk(2);
% Qk(4),-Qk(3), Qk(2), Qk(1)];
% temp = M*qh;
% Qk1 = temp/sqrt(temp'*temp);
% Qk1 = Qk \otimes qh = M'(qh)Qk
Mq = [qh(1),-qh(2),-qh(3),-qh(4);
qh(2), qh(1), qh(4),-qh(3);
qh(3),-qh(4), qh(1), qh(2);
qh(4), qh(3),-qh(2), qh(1)];
temp2 = Mq*Qk;
Qk1 = temp2/sqrt(temp2'*temp2);
end
function qh=getqh(theta1,theta2,theta3)
% This function is to get the qh.
% By changshen_xu
% Date: 2018-07-17
% Optimized three-sample algorithm to get the rotation vector \Phi.
s1 = cross(theta1,theta3);
s2 = theta3-theta1;
s3 = cross(theta2,s2);
Phi = theta1+theta2+theta3+0.45*s1+0.675*s3;
phi = sqrt(Phi'*Phi); % phi = |Phi|
qh = zeros(4,1);
qh(1) = cos(phi/2);
qh(2) = Phi(1)/phi*sin(phi/2);
qh(3) = Phi(2)/phi*sin(phi/2);
qh(4) = Phi(3)/phi*sin(phi/2);
end
此处注意,在仿真过程中,陀螺的采样值亦是由数据生成函数产生的。
因此,并不能直接获得秦书上所说的角增量,实际上恰恰是角速率。故此处需要一个由角速率到角增量的积分转换函数。