提示:代码只给出PSINS工具箱中的形式,由于本文所给公式与PSINS中使用的有差别,因此代码与公式不一定对应,但这仅仅是因为定义姿态角矩阵时,三个欧拉角的顺序有关,因此问题不大,读者自行判别,根据需要更改即可
等效旋转矢量转四元数
公式
代码
function q = rv2q(rv)
% Convert rotation vector to transformation quaternion.
%
% Prototype: q = rv2q(rv)
% Input: rv - rotation vector
% Output: q - corresponding transformation quaternion, such that
% q = [ cos(|rv|/2); sin(|rv|/2)/|rv|*rv ]
%
q = zeros(4,1);
n2 = rv(1)*rv(1) + rv(2)*rv(2) + rv(3)*rv(3);
if n2<1.0e-8 % cos(n/2)=1-n2/8+n4/384; sin(n/2)/n=1/2-n2/48+n4/3840
q(1) = 1-n2*(1/8-n2/384); s = 1/2-n2*(1/48-n2/3840);
else
n = sqrt(n2); n_2 = n/2;
q(1) = cos(n_2); s = sin(n_2)/n;
end
q(2) = s*rv(1); q(3) = s*rv(2); q(4) = s*rv(3);
四元数乘法
公式
代码
q = [ q1(1) * q2(1) - q1(2) * q2(2) - q1(3) * q2(3) - q1(4) * q2(4);
q1(1) * q2(2) + q1(2) * q2(1) + q1(3) * q2(4) - q1(4) * q2(3);
q1(1) * q2(3) + q1(3) * q2(1) + q1(4) * q2(2) - q1(2) * q2(4);
q1(1) * q2(4) + q1(4) * q2(1) + q1(2) * q2(3) - q1(3) * q2(2) ];
四元数归一化
公式
代码
% normalization
n2 = qnb1(1)*qnb1(1)+qnb1(2)*qnb1(2)+qnb1(3)*qnb1(3)+qnb1(4)*qnb1(4);
if (n2>1.000001 || n2<0.999999)
nq = 1/sqrt(n2);
qnb1(1) = qnb1(1)*nq; qnb1(2) = qnb1(2)*nq; qnb1(3) = qnb1(3)*nq; qnb1(4) = qnb1(4)*nq;
end