惯性导航与组合导航的对准算法实现
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. 龙格-库塔法
龙格-库塔法是一种常用的数值积分方法,用于求解常微分方程。在惯性导航中,可以用于积分运动方程。例如,四元数的更新可以使用四阶龙格-库塔法进行数值积分。

浙公网安备 33010602011771号