惯性导航与组合导航的对准算法实现

1. 惯性导航与组合导航的对准过程

惯性导航系统(INS)在使用前需要进行初始化,包括位置、速度和姿态的初始化。其中,姿态初始化的过程称为对准,目的是将惯性器件与当地导航系轴向对齐。对准过程通常分为粗对准和精对准两个阶段。

  • 粗对准:依靠地球重力矢量、地球自转角速度等信息,通过解析计算获得初始姿态矩阵。粗对准的结果表现形式为姿态矩阵,进而可以求出欧拉角、四元数等。
  • 精对准:在粗对准的基础上,通过卡尔曼滤波等方法进一步提高对准精度。精对准过程可以使用捷联惯导导航系速度作为观测量。

2. 粗对准的MATLAB实现

粗对准的MATLAB实现示例,使用给定数据DATA.mat进行1分钟的粗对准仿真。

% 粗对准数据初始化
clc;
clear;
load('DATA.mat'); % 加载数据
f = 200; % 采样频率
latitude = deg2rad(39.978848182); % 纬度,以弧度表示
g = 9.7803*(1+0.0053024*((sin(latitude))^(2))-...
    0.000005*((sin(2*latitude))^(2))); % 重力加速度
w_ie = 7.292115e-5; % 地球自转角速度
T = 60; % 粗对准时间设置为1分钟

3. 精对准的MATLAB实现

以下是一个精对准的MATLAB实现示例,使用卡尔曼滤波进行精对准。

function [att0, attk, xkpk] = alignvn2(imu, qnb, pos, phi0, imuerr, wvn, ts,att_ref)
    % SINS初始对准使用卡尔曼滤波,以速度作为观测量
    % 状态向量:[phiE,phiN,phiU, dvE,dvN,dvU, ebx,eby,ebz, dbx,dby,dbz]'
    % 输入参数:imu - IMU数据
    %           qnb - 粗对准姿态四元数
    %           pos - 位置
    %           phi0 - 初始失准角估计
    %           imuerr - IMU误差设置
    %           wvn - 速度测量噪声
    %           ts - IMU采样间隔
    % 输出参数:att0 - 姿态对准结果
    %           attk, xkpk - 用于调试
    % 示例:
    %   avp0 = [[0;0;0], zeros(3,1), glv.pos0];
    %   imuerr = imuerrset(0.03, 100, 0.001, 10);
    %   imu = imustatic(avp0, 1, 300, imuerr);
    %   phi = [.5; .5; 5]*glv.deg;
    %   wvn = [0.01; 0.01; 0.01];
    %   [att0, attk, xkpk] = alignvn(imu, avp0(1:3)', avp0(7:9)', phi, imuerr, wvn);
    % 参考:alignfn, alignfn9, aligncmps, aligni0, alignWahba, alignsb, insupdate, etm.
    % 版权所有:Gongmin Yan
    % 西北工业大学,西安,中国
    % 2011年6月17日
    global glv;
    if nargin<4,  phi0 = [1.5; 1.5; 3]*glv.deg;  end
    if nargin<5,  imuerrset(0.01, 100, 0.001, 1);  end
    if nargin<6,  wvn = [0.01; 0.01; 0.01];  end
    if nargin<7,  ts = imu(2,7)-imu(1,7);  end
    if length(qnb)==3, qnb=a2qua(qnb); end  %如果输入qnb是欧拉角。
    nn = 2; nts = nn*ts;
    len = fix(length(imu)/nn)*nn;
    % Cnn?
    eth = earth(pos); vn = zeros(3,1); Cnn = rv2m(-eth.wnie*nts/2);
    % 滤波器初始化
    kf = avnkfinit(nts, pos, phi0, imuerr, wvn);
    [attk, xkpk] = prealloc(fix(len/nn), 4, 2*kf.n);
    ki = timebar(nn, len, 'Initial align using vn as meas.');
    for k=1:nn:len-nn+1
        wvm = imu(k:k+nn-1,1:6);
        % phim:角度增量
        % dvbm:速度增量
        [phim, dvbm] = cnscl(wvm);
        Cnb = q2mat(qnb);
        % 注意:不进行位置更新!!!
        % 速度更新方程
        dvn = Cnn*Cnb*dvbm;
        vn = vn + dvn + eth.gn*nts;
        %qnb = qupdt(qnb, phim-Cnb'*eth.wnin*nts);
        % 四元数更新方程
        qnb = qupdt2(qnb, phim, eth.wnin*nts);
        Cnbts = Cnb*nts;
        % kf.Phikk_1:状态转移矩阵[时变矩阵]
        kf.Phikk_1(4:6,1:3) = askew(dvn);
        % 陀螺零偏转到导航坐标系
        kf.Phikk_1(1:3,7:9) = -Cnbts;  % 参考公式(7.2.3)
        % 加表零偏转到导航坐标系
        kf.Phikk_1(4:6,10:12) = Cnbts; % 参考公式(7.2.3)
        % 卡尔曼滤波核心函数
        kf = kfupdate(kf, vn);

        % 状态向量更新
        qnb = qdelphi(qnb, 0.1*kf.xk(1:3));  % 部分反馈校正
        kf.xk(1:3) = 0.9*kf.xk(1:3);
        vn = vn-0.1*kf.xk(4:6);
        kf.xk(4:6) = 0.9*kf.xk(4:6);

        attk(ki,:) = [q2att(qnb)',imu(k+nn-1,end)];
        xkpk(ki,:) = [kf.xk; diag(kf.Pxk)];
        ki = timebar;
    end
    attk(ki:end,:) = []; xkpk(ki:end,:) = [];
    att0 = attk(end,1:3)';
    resdisp('Initial align attitudes (arcdeg)', att0/glv.deg);
    avnplot(nts, attk, xkpk,att_ref);

4. 四元素算法与欧拉角算法

  • 四元素算法:使用四元数来表示姿态,具有数值稳定性和计算效率高的优点。四元数更新方程如下:

    qnb = qupdt2(qnb, phim, eth.wnin*nts);
    
  • 欧拉角算法:通过欧拉角来表示姿态,直观但存在万向锁问题。欧拉角更新可以通过四元数转换为欧拉角实现:

    attk(ki,:) = [q2att(qnb)',imu(k+nn-1,end)];
    

参考代码 惯性导航,组合导航,粗对准及精对准程序 www.youwenfan.com/contentcnp/63971.html

5. 龙格-库塔法

龙格-库塔法是一种常用的数值积分方法,用于求解常微分方程。在惯性导航中,可以用于积分运动方程。例如,四元数的更新可以使用四阶龙格-库塔法进行数值积分。

posted @ 2026-01-13 15:51  躲雨小伙  阅读(0)  评论(0)    收藏  举报