惯性导航学习过程记录(姿态更新,计算失准角)

1. 利用旋转矩阵进行姿态更新

function Cb2n = ch_mnormlz(Cb2n)
% 姿态阵单位化,防止矩阵蠕变
    for k=1:5
%         Cnb = 0.5 * (Cnb + (Cnb')^-1);  % Algorithm 1 
        Cb2n = 1.5*Cb2n - 0.5*(Cb2n*Cb2n')*Cb2n;  % Algorithm 2 
    end
    
%   Algorithm 3:  [s,v,d] = svd(Cnb); Cnb = s*d';  % in = s*v*d' = s*d' * d*v*d';  out = s*d'
clear;
clc
close all;

%% 已知信息
w = [2 -3 5]';
dt = 0.01; %姿态更新周期: 0.01s = 100Hz
dur = 100; %积分时长 单位s


N = dur / dt; %积分次数
eul = zeros(N, 3);
fprintf("已知b系角速度(陀螺仪输出为):%.3fdeg/s %.3fdeg/s %.3fdeg/s\n", w(1), w(2), w(3));

%定轴转动下: 等效旋转矢量 = 角增量 = 角速度*dt
Cb2n = eye(3);
theta = deg2rad(w)*dt; 


for i = 1:N
    C_m2m_1 = ch_rv2m(theta);  % 等效旋转矢量转成旋转矩阵
    Cb2n = Cb2n * C_m2m_1;

    
    %单位阵正交化
    Cb2n = ch_mnormlz(Cb2n);

    %记录每一步的欧拉角,姿态阵转成欧拉角
    eul(i,:) = rad2deg(ch_m2eul(Cb2n));
end


plot(eul)
legend("PITCH(deg)", "ROLL(deg)", "YAW(deg)");

tmp =eul(end,:);
fprintf("最终欧拉角: pich:%.4f° roll:%.4f° yaw:%.4f°\n", tmp(1), tmp(2), tmp(3));

运行结果:

2. 利用四元数进行姿态更新

clear;
clc
close all;

%% 已知
w = [1 1 0]'; %角速度
dt = 0.01; %姿态更新周期: 0.01s = 100Hz
dur = 10; %积分时长 单位s


N = dur / dt; %积分次数
eul = zeros(N, 3);
fprintf("已知b系角速度(陀螺仪输出为):%.3fdeg/s %.3fdeg/s %.3fdeg/s\n", w(1), w(2), w(3));


Qb2n = [1 0 0 0]';
theta = deg2rad(w)*dt; %定轴转动下: 等效旋转矢量 = 角增量 = 角速度*dt


for i = 1:N
    Q_m2m_1 = ch_rv2q(theta);
    
    Qb2n  = ch_qmul(Qb2n, Q_m2m_1);
    
    %四元数单位化
    Qb2n = ch_qnormlz(Qb2n);

    %记录每一步的欧拉角
    eul(i,:) = rad2deg(ch_q2eul(Qb2n));
end


plot(eul)
legend("PITCH(deg)", "ROLL(deg)", "YAW(deg)");

tmp =eul(end,:);
fprintf("最终欧拉角: pich:%.4f° roll:%.4f° yaw:%.4f°\n", tmp(1), tmp(2), tmp(3));

运行结果:

3. 失准角计算方法

失准角使用姿态矩阵计算的!!!

clear;
clc
close all;
format 

%% 一个简单的失准角例子

% M_gen = ch_eul2m(deg2rad([30,40,50.2]))

Cb2n = [
    0.2462   -0.6634    0.7066
    0.7934    0.5567    0.2462
   -0.5567    0.5000    0.6634
];

Cb2np = [
    0.2434   -0.6654    0.7057
    0.7943    0.5544    0.2487
   -0.5567    0.5000    0.6634
    ];

fprintf("Cb2n: 真实姿态阵):\n");
fprintf("Cb2np: 计算导航系姿态阵(有误差的)):\n");


fprintf("失准角反对称阵为:\n");
phi_skew = -(Cb2np * Cb2n'  - eye(3));
phi_skew


phi = [-phi_skew(2,3), phi_skew(1,3), phi_skew(1,2)];
phi = rad2deg(phi);
fprintf("失准角:%f %f %f (deg)\n", phi(1), phi(2), phi(3));

运行结果:

Cb2n: 真实姿态阵):
Cb2np: 计算导航系姿态阵(有误差的)):
失准角反对称阵为:

phi_skew =

    0.0000    0.0036    0.0000
   -0.0035   -0.0001   -0.0000
    0.0000    0.0000   -0.0000

失准角:0.000044 0.002257 0.204619 (deg)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值