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

📄 imusolve2.m

📁 惯性导航精解算程序
💻 M
字号:
function [location,velocity,acceleration,attitude,q1,Cb_n] = Imusolve2(accelerometer0,gyro0,location0,velocity0,acceleration0,attitude0,q0,Cb_n0,caiyangT)
%%解算单步进行的程序,批处理方式用Imusolve


    Ve0 = velocity0(1);
    Vn0 = velocity0(2);
    Vu0 = velocity0(3);
    latitude = location0(1);
    global Ra e wie;
    RN = Ra*(1-2*e+3*e*sin(latitude)^2);%参考椭球子午面内的曲率半径
    RE = Ra*(1+e*sin(latitude)^2);%参考椭球子午面的法线平面内的曲率半径
    g = 9.7803267714*(1+0.00193185138639*sin(latitude)^2)/sqrt(1-0.00669437999013*sin(latitude)^2);
    gn=[0 0 -g]';%地理系上的重力
    
    
    dot_latitude = Vn0/RN;%纬度变化率
    dot_longitude = Ve0/(RE*cos(latitude));%经度变化率
    SWn_ie = [0;wie*cos(latitude);wie*sin(latitude)];%地球自转角速度在导航系上的分量
    SWn_en = [-dot_latitude;dot_longitude*cos(latitude);dot_longitude*sin(latitude)];%导航系相对地固系的角速度在导航系上的分量    
    SWb_nb = gyro0' - Cb_n0*(SWn_ie+SWn_en);%车体系相对当地水平系角速度
    Dtheta = SWb_nb*caiyangT;%角增量3x1
    detDtheta = sqrt(Dtheta'*Dtheta);%scalar vecter,norm(Dtheta)
    
    
    
    syDtheta = [0          -Dtheta(1) -Dtheta(2) -Dtheta(3);
                Dtheta(1)  0          Dtheta(3)  -Dtheta(2);
                Dtheta(2)  -Dtheta(3) 0          Dtheta(1);
                Dtheta(3)  Dtheta(2)  -Dtheta(1) 0         ];
     if detDtheta==0 
         q1=q0;
     else
        q1 = (cos(detDtheta/2)*eye(4) + sin(detDtheta/2)/detDtheta*syDtheta )*q0;
     end
     
     q1 = q1/norm(q1);
     Cb_n = [q1(1)^2+q1(2)^2-q1(3)^2-q1(4)^2  2*(q1(2)*q1(3)+q1(1)*q1(4))  2*(q1(2)*q1(4)-q1(1)*q1(3));
             2*(q1(2)*q1(3)-q1(1)*q1(4))      q1(3)^2-q1(4)^2+q1(1)^2-q1(2)^2  2*(q1(3)*q1(4)+q1(1)*q1(2));
             2*(q1(2)*q1(4)+q1(1)*q1(3))      2*(q1(3)*q1(4)-q1(1)*q1(2))      q1(4)^2-q1(3)^2-q1(2)^2+q1(1)^2];         
     Cb_n = Cb_n/(Cb_n'*Cb_n)^0.5;%保持正交化
     theta = asin(Cb_n(2,3));
     gama = atan(-Cb_n(1,3)/Cb_n(3,3));
     if Cb_n(1,3)<0 && Cb_n(3,3)<0 
        gama = gama+pi;
        elseif Cb_n(1,3)>0 && Cb_n(3,3)<0
        gama = gama-pi;
     end
     fai = atan(Cb_n(2,1)/Cb_n(2,2));
        if  Cb_n(2,2)<0
             fai = fai+pi;
        end
        if fai<0 && Cb_n(2,2)>0
            fai = fai+2*pi;
        end 
        
     attitude = [theta gama fai]';
     Fn = Cb_n'*accelerometer0';%导航系中的加速度??????????   
     acceleration = Fn -cross(2*SWn_ie+SWn_en,velocity0) +gn;%速度变化量☆☆☆☆☆☆☆☆计算的是下一个时刻的
%    velocity = velocity0 + acceleration0*caiyangT;
     velocity = velocity0 + 0.5*(acceleration0+acceleration)*caiyangT;%取中间值做计算 
     dot_latitude = velocity0(2)/RN;%纬度变化率★★★★★★★★★★这里用的是velocity0
     dot_longitude = velocity0(1)/(RE*cos(latitude));%经度变化率★★★★★★★★★★这里用的是velocity0
     dot_latitude2 = velocity(2)/RN;%纬度变化率★★★★★★★★★★这里用的是velocity
     dot_longitude2 = velocity(1)/(RE*cos(latitude));%经度变化率★★★★★★★★★★这里用的是velocity
     
     % location = location0 + [dot_latitude dot_longitude 0]'*caiyangT;%这是一阶算法
     location = location0+[0.5*(dot_latitude+dot_latitude2) 0.5*(dot_longitude+dot_longitude2) 0]'*caiyangT ;

⌨️ 快捷键说明

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