⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mti_calibrated.m

📁 惯性测量组件Mti进行数据采集
💻 M
字号:
%姿态的解算
%采用Calibrated Sensor Data, new runge-kuta

%初始化
clear all
%DATA=textread('e:\Mt9data\shixiong\MT9_cal_000071C5_002.log');                                                   %read data
DATA=textread('e:\Mtidata\MT_cal_00300507_002.log');                                                   % Mti data
%DATA=textread('e:\Mt9data\new525\MT9_cal_000071C5_003.log');                                                   %read data

Wib1=DATA(:,(5:7));
fb1=DATA(:,(2:4));                  %n*3
sizeDATA=size(DATA);
clear DATA;
jingdu=2.02;
weidu=0.68;
gaodu=0;                                                                    %初始经度为2.02rad,纬度0.68rad,高度为0(longitude 116 degrees,latitude 39)
wie=7.292*10^-5;                                                                                %地球自转角速度取为7292115.1467*10^-11rad/s
youdong=0;                                                                                      %游动角为0
R=6378393;              %the earth radius
V=[0,0,0]';                                                                                     %初始速度Vep为0
%初始姿态矩阵Cbp,由初始对准得到。没有对准时,可以先给定一个值:假设初始完全对准,即各姿态角为0
%T =[
%
%   0.1792    0.9838   -0.0108
%  -0.9838    0.1791   -0.0113
%  -0.0092    0.0126    0.9999];
%
zh=[0 -1 0;
    1 0 0;
    0 0 1];                                                                                     %transfer matrix

qq=[0.988095	0.005767	-0.002147	0.153724]';                                                              %四元数初赋
qqq=zh*[qq(2);qq(3);qq(4)];
q=[qq(1);qqq];
T=[q(1)^2+q(2)^2-q(3)^2-q(4)^2,2*(q(2)*q(3)-q(1)*q(4)),2*(q(2)*q(4)+q(1)*q(3));
    2*(q(2)*q(3)+q(1)*q(4)),q(1)^2-q(2)^2+q(3)^2-q(4)^2,2*(q(3)*q(4)-q(1)*q(2));
    2*(q(2)*q(4)-q(1)*q(3)),2*(q(3)*q(4)+q(1)*q(2)),q(1)^2-q(2)^2-q(3)^2+q(4)^2]             %T即Cbp的计算

C=[-sin(youdong)*sin(weidu)*cos(jingdu)-cos(youdong)*sin(jingdu),-sin(youdong)*sin(weidu)*sin(jingdu)+cos(jingdu)*cos(youdong),sin(youdong)*cos(weidu);
    -cos(youdong)*sin(weidu)*cos(jingdu)+sin(youdong)*sin(jingdu),-cos(youdong)*sin(weidu)*sin(jingdu)-sin(youdong)*cos(jingdu),cos(youdong)*cos(weidu);
    cos(weidu)*cos(jingdu),cos(weidu)*sin(jingdu),sin(weidu)];
%初始位置矩阵Cep

Wie=C*[0,0,wie]';                                                                               %求Wiep初始

Wep=[0,0,0]';                                                                                   %Wep初始化

g=(9.7803+0.051799*C(3,3)^2);                                                                     %重力加速度g初始值,高度h取为0
k=8;
linshi=0;linshiw=0;linshiV=0;
h=0.02;
hV=0.02;
hc=0.02;
flag=1;                                                                                         %flag of q
m=4;  
i=1;
%初始化完成
while i<=sizeDATA(1,1)-1
    %td1;    
    %t1
    %读入数据,该数据need经过坐标变换,由北西天变到了东北天
    
    Wib=zh*(Wib1(i+1,:)');                                                                         %输入陀螺测得的数据
    Wpb=Wib-T'*(Wep+Wie);                                                                           %Wib速率提取与姿态速率Wpb的计算
    
    
    %加入Q的及时修正
    %四元数更新
    W=[0,-Wpb(1),-Wpb(2),-Wpb(3);
        Wpb(1),0,Wpb(3),-Wpb(2);
        Wpb(2),-Wpb(3),0,Wpb(1);
        Wpb(3),Wpb(2),-Wpb(1),0];      
    A=0.5*W;                                                                                        %四元数微分方程的矩阵形式
    switch(flag)
    case(1)
        A1=A;
        flag=2;
        i=i+1;
        continue
    case(2)
        A3=A;
        flag=1;
    end
    A2=(A1+A3)/2;
    qn=q;                                                                                           %前一时刻的q值赋给当时刻I
    k1=A1*q;                                                                                         %求k1
    q=qn+(h/2)*k1;
    k2=A2*q;
    q=qn+(h/2)*k2;
    k3=A2*q;
    q=qn+h*k3;
    k4=A3*q;
    q=qn+(h/6)*(k1+2*k2+2*k3+k4);
    
    %四元数的归一化,t3
    %if mod(i,k)==0;
    q=q/sqrt((q(1)^2+q(2)^2+q(3)^2+q(4)^2));
    %end
    
    T=[q(1)^2+q(2)^2-q(3)^2-q(4)^2,2*(q(2)*q(3)-q(1)*q(4)),2*(q(2)*q(4)+q(1)*q(3));
        2*(q(2)*q(3)+q(1)*q(4)),q(1)^2-q(2)^2+q(3)^2-q(4)^2,2*(q(3)*q(4)-q(1)*q(2));
        2*(q(2)*q(4)-q(1)*q(3)),2*(q(3)*q(4)+q(1)*q(2)),q(1)^2-q(2)^2-q(3)^2+q(4)^2];               %T即Cbp的计算
    %
    
    %t2
    %用二阶龙格-库塔法解速度微分方程
    
    %if mod(i,m)==0;
    
    linshiV=linshiV+1;                                                                          %调试速度程序时引入的临时变量
    VA=[0,2*Wie(3),-(2*Wie(2)+Wep(2));
        -2*Wie(3),0,2*Wie(1)+Wep(1);
        2*Wie(2)+Wep(2),-(2*Wie(1)+Wep(1)),0];                                                      %书上115页,公式6.4.9
    fb=zh*(fb1(i,:)');                                                                         %输入acce测得的数据,acce采集的是和当前时刻gyro同步的值
    fp1=T*fb;
    fb=zh*(fb1(i+1,:)');                                                                         %输入acce测得的数据,acce采集的是和当前时刻gyro同步的值
    fp2=T*fb;
    
    Vn=V;
    k1=fp1-[0,0,g]'+VA*V;
    V=Vn+k1*hV;
    k2=fp2-[0,0,g]'+VA*V;
    V=Vn+(hV/2)*(k1+k2);
    VM(:,linshiV)=V;                                                              %temporary linshiV
    
    %a11=-2*0.003367*C(1,3)*C(2,3)/6378393;                                        %-1/tao a
    %a12=-1/(6378393*(1-0.003367*C(3,3)^2+2*0.003367*C(2,3)^2));                   %-1/Ryp
    %a21=1/(6378393*(1-0.003367*C(3,3)^2+2*0.003367*C(1,3)^2));                    %1/Rxp
    %a22=-a11;
    %aa=[a11,a12;a21,a22;0,0];
    %Vxy=[V(1),V(2)]';
    %Wep=aa*Vxy;                                                                  %Wep位置速率的计算 
    %Wep=[0 0 0]';
    Wep=[-V(2)/R;V(1)/R;V(1)*tan(weidu)/R];             %地球系为参考系,求出的位置速率
    
    CA=[0,Wep(3),-Wep(2);
        -Wep(3),0,Wep(1);
        Wep(2),-Wep(1),0];
    
    %用欧拉法解位置矩阵微分方程
    difC=CA*C;
    C=C+difC*hc;
    
    wie=7.292*10^-5;                                                             %地球自转角速度取为7292115.1467*10^-11rad/s
    Wie=C*[0,0,wie]';                                                                               %Wiep的计算
    g=(9.7803+0.051799*C(3,3)^2);                                                                     %重力加速度g,高度h取为0
    %
    %else
    %continue
    %end
    %t4之姿态角的计算
    %if mod(i,2*m)==0;
   
    
    %T=zh'*T;
    linshi=linshi+1;
    fuyang=asin(T(3,2));                                                                            %俯仰角值为其主值
    gunzhuanm=atan(-T(3,1)/T(3,3));
    hangxiangm=atan(-T(1,2)/T(2,2));                                                                %三个姿态角的主值
    
    if T(3,3)>0;
        gunzhuan=gunzhuanm;
    elseif (T(3,3)<0)&(gunzhuanm<0);
        gunzhuan=gunzhuanm+pi;
    else (T(3,3)<0)&(gunzhuanm>0);
        gunzhuan=gunzhuanm-pi;
    end                                                                                             %滚转角
    
    if (T(2,2)>0)&(hangxiangm>0);
        hangxiang=hangxiangm;
    elseif (T(2,2)>0)&(hangxiangm<0);
        hangxiang=hangxiangm+2*pi;
    else T(2,2)<0;
        hangxiang=hangxiangm+pi;
    end                                                                                             %航向角
    
    hangxiangM(linshi,1)=hangxiang*180/pi;
    fuyangM(linshi,1)=fuyang*180/pi;
    gunzhuanM(linshi,1)=gunzhuan*180/pi;
    %
    
    CM(:,:,linshi)=C;
    %position
    %if mod(i,(2*m))==0;
    linshiw=linshiw+1;
    
    jingdum=atan(C(3,2)/C(3,1));
    weidu=asin(C(3,3));                                                                         %latitude (-90,90)
    youdongm=atan(C(1,3)/C(2,3));                                                               % 经纬度,游动角主值计算
    
    if C(3,1)>0;
        jingdu=jingdum;
    elseif (C(3,1)<0)&(jingdum<0);
        jingdu=jingdum+pi;
    else (C(3,1)<0)&(jingdum>0);
        jingdu=jingdum-pi;
    end                                                                                     %经度计算,(-180,180)
    
    if (C(2,3)>0)&(youdongm>0);
        youdong=youdongm;
    elseif (C(2,3)>0)&(youdongm<0);
        youdong=youdongm+2*pi;
    else C(2,3)<0;
        youdong=youdongm+pi;
    end                                                                                   %youdong (0,360)
    %地速
    SpeedM(linshiw,1)=sqrt(V(1)^2+V(2)^2);
    %
    jingduM(linshiw,1)=jingdu*180/pi;
    weiduM(linshiw,1)=weidu*180/pi;
    youdongM(linshiw,1)=youdong*180/pi;
    %end
    
    %else 
    %continue
    %end
    
    
        %draw 3-D with cuboid
    %if mod((i-1),m)==0                                                       % red surfaces are along with x axis, yellow surfaces are along with y axis,g are z axis
     %  mtiplotcuboid(T,V,jingdu,weidu,youdong,i);                                      % plot 30 s ,没有画初始时刻的图,从第一个更新T开始画图
       %mti_BoxPlot3(T)
       %end

end
clear flag zh qq qqq k m h hV hc;

figure
subplot(2,1,1),plot(hangxiangM)
hold on
plot(fuyangM,'g')
plot(gunzhuanM,'r')
title('姿态角')
subplot(2,1,2),plot(VM(1,:),'r')
hold on
plot(VM(2,:),'y')
plot(VM(3,:),'g')
title('速度')

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -