捷联惯导Matlab程序求解飞行器的姿态
matlab姿态解算
matlab姿态解算Matlab姿态解算是一种通过数学模型和算法,将传感器采集到的数据转化为姿态信息的技术。
姿态解算在航空航天、机器人、虚拟现实等领域具有重要的应用价值。
本文将介绍Matlab姿态解算的原理、方法和应用。
我们来了解姿态解算的概念。
姿态是指物体在空间中的方向和位置。
在三维空间中,姿态通常由欧拉角或四元数表示。
姿态解算的目标是根据传感器采集到的数据,推导出物体的姿态信息。
在Matlab中,姿态解算可以通过多种方法实现。
其中一种常用的方法是基于加速度计和陀螺仪的姿态解算。
加速度计可以测量物体在三个方向上的加速度,陀螺仪可以测量物体绕三个方向上的角速度。
通过对这些数据的处理和分析,可以推导出物体的姿态信息。
姿态解算的核心是将传感器数据转化为姿态信息的数学模型。
在Matlab中,可以使用旋转矩阵或四元数来表示姿态信息。
旋转矩阵是一个3x3的矩阵,可以表示物体在三维空间中的旋转变换。
四元数是一种复数扩展,可以用来表示旋转变换。
在Matlab中,可以使用一些现有的工具箱来实现姿态解算。
例如,可以使用Robotics System Toolbox中的函数来进行姿态解算。
这些函数提供了一些常用的姿态解算算法,例如扩展卡尔曼滤波(EKF)和互补滤波器。
除了基于加速度计和陀螺仪的姿态解算,还有其他一些方法可以用于姿态解算。
例如,可以使用磁力计来测量地球的磁场,从而推导出物体的方向信息。
还可以使用视觉传感器来获取物体在相机坐标系中的姿态信息。
姿态解算在许多领域具有广泛的应用。
在航空航天领域,姿态解算可以用于导航、飞行控制和目标跟踪等任务。
在机器人领域,姿态解算可以用于机器人的定位和路径规划。
在虚拟现实领域,姿态解算可以用于头部追踪和手部追踪等应用。
总结起来,Matlab姿态解算是一种通过数学模型和算法,将传感器采集到的数据转化为姿态信息的技术。
姿态解算在航空航天、机器人、虚拟现实等领域具有重要的应用价值。
捷联惯导系统算法.ppt
cos
b Ebz
注意事项:当 θ= 90 度时,方程出现奇点
姿态计算 矩阵方程精确解1
二、方向余弦矩阵微分方程及其解 C C
其中
C bE
CbE
b Eb
0
b Eb
z
z
0
y
x
y x
0
由于陀螺仪直接测得的是载体 相对惯性空间的角速度,所以:
CbE
b ib
E iE
C
E b
或四元数微分方程:
q(t)
(
b ib
b iE
)q(t)
注意事项: 1、上述两个方程中的角速度表达式不一样 2、方程第二项较小,计算时速度可以低一些
增量算法 矩阵方程精确解
一、角增量算法
角增量:陀螺仪数字脉冲输出,每个脉冲代表一个角增量
一个采样周期内,陀螺输出脉冲数对应的角增量为:
C
0
0
c os
0 0 0 sin
sin
sin
c os
cos cos
求解欧拉角速率得
1 0
0
cos
0 sin
惯性器件的误差补偿
姿态计算 欧拉角微分方程1
姿态矩阵的计算 假设数学坐标系模拟地理坐标系 飞行器姿态的描述:
航向角ψ、俯仰角θ、滚动角γ 一、欧拉微分方程
从地理坐标系到载体坐标系 的旋转顺序:
Ψ →θ →γ
matlab飞行管理问题的模型求解及验证
文章标题:深度探讨MATLAB飞行管理问题的模型求解及验证摘要:MATLAB在飞行管理问题中的应用已经成为航空领域研究人员的重要工具。
本文将深入探讨MATLAB在飞行管理问题中的模型求解及验证,从简单到复杂,由浅入深地展示MATLAB在飞行管理问题中的应用。
一、MATLAB在飞行管理问题中的模型求解1. 简介在飞行管理问题中,MATLAB可以用于建立模型进行求解,例如飞机的动力学模型、导航模型和控制模型等。
2. 动力学模型求解通过MATLAB建立飞机的动力学模型,可以对飞机的运动进行精确描述,包括高度、速度和加速度等参数。
3. 导航模型求解利用MATLAB建立飞机的导航模型,可以对飞机的航线规划、转弯半径和航向角等进行精确计算。
4. 控制模型求解利用MATLAB建立飞机的控制模型,可以对飞机的稳定性和操纵性进行分析和优化。
二、MATLAB在飞行管理问题中的模型验证1. 验证原理在建立模型后,需要进行验证以确保模型的准确性和可靠性,MATLAB提供了丰富的工具和方法来进行模型验证。
2. 飞机动力学模型验证通过MATLAB进行飞机动力学模型的验证,可以对飞机的实际运动状态和模型预测进行比对,验证模型的准确性。
3. 飞机导航模型验证利用MATLAB进行飞机导航模型的验证,可以对飞机实际航线和模型计算结果进行比对,验证模型的可靠性。
4. 飞机控制模型验证通过MATLAB进行飞机控制模型的验证,可以对飞机的操纵响应和模型预测进行比对,验证模型的稳定性和操纵性。
三、总结和回顾1. 模型求解和验证的重要性在飞行管理问题中,模型求解和验证是确保飞机安全和高效运行的重要环节,MATLAB提供了强大的工具来进行模型求解和验证。
2. MATLAB在飞行管理问题中的应用前景随着航空技术的不断发展,MATLAB在飞行管理问题中的应用前景十分广阔,将继续发挥重要作用。
个人观点:MATLAB作为飞行管理问题的求解和验证工具,具有极大的优势和潜力。
捷联系统航姿算法分析
们可以利用前一时刻的角速度采样值对旋
转矢量双子样法中的角增量进行修正 ,由此 4 数字仿真
提出双子样改进算法 。
我们用 MATLAB 编写了仿真程序 ,采用
修正后 ,双子样法的角增量由以下公式 角速度输出的陀螺 ,在圆锥运动下进行了数
提取
字仿真 。不同算法的时间复杂度取捷联矩
Δθ1 = [ 8ω(t - T2/ 2) - ω(t) + 5ω(t + T2/ 阵一次递推所需运算次数 ,如下表所示
<20 8
+ζ·3<8404 ,d2≈0. 5 -
<20 48
Δ; (10) Δθ3 = [ω(t + 2T3/ 3) +ω(t + T3) ]·T3/ 6 +Δ;
式中 ζ, = 0. 8 ,目的是为了减小漂移误差 。 若认为在式 (5) 中 ,一个计算周期内ω
= a + b·t ,并作一定的近似 ,可推导出等效 旋转矢量双子样计算公式为
自动化技术与应用 Vol. 19 ,No. 1 2000 年第 1 期 7
q (t + T1) = q (t) + (k1 + k2 + k3 + k4) / 6
若认为在一个计算周期内ω= a + b·t +
(7) c·t2 ,可导出等效旋转矢量三子样计算公式
式中 ,T1 为计算周期 ; k1 = 0. 5·T1[ωb (t) ]·q (t) ; k2 = 0. 5·T1 [ωb (t + T1/ 2) ] ·( q (t) + k1/
对于双子样法 Δθ1 = [ω(t) +ω(t + T2/ 2) ]·T2/ 4 ;
捷联惯导Matlab程序
捷联惯导程序,依据加表和陀螺仪的输出数据来求解飞行器的姿态clc;clear;format long; %设置数据精度为15位小数Data=importdata('temp.txt'); % 导入实验所采集的数据,以矩阵形式赋给Data变量,temp.txt 必须与该M文件在同一个文件夹中Px=Data(:,3); % Px,Py,Pz为陀螺仪的输出值Py=Data(:,4);Pz=Data(:,5);Nx=Data(:,6); % Nx,Ny,Nz为加速度计的输出值Ny=Data(:,7);Nz=Data(:,8);% 陀螺仪模型参数标定如下:Sx = -4.085903e-006 ; Sy = -4.085647e-006 ; Sz = -4.085170e-006 ;Mxy = 5.059527e-003 ; Mxz = -1.031103e-003 ; Myx = -3.355451e-003 ;Myz = 3.508468e-003 ; Mzx = -1.266671e-003 ; Mzy = -2.318244e-004 ;Dx = -2.009710e-006 ; Dy = 8.156346e-007 ; Dz = -5.749059e-007 ;GyroCali_A = [ 1 -Mxy -Mxz ; -Myx 1 -Myz ; -Mzx -Mzy 1 ];% 加速度计模型参数标定如下:Kx = 9.272930e-004 ; Ky = 9.065544e-004 ; Kz = 9.443748e-004 ;Ixy = 6.533872e-003 ; Ixz = 9.565992e-004 ; Iyx = -6.319376e-003 ;Iyz = -6.902339e-004 ; Izx = -1.144549e-003 ; Izy = -3.857963e-004 ;Bx = -3.400847e-002 ; By = -8.916341e-003 ; Bz = -9.947414e-003 ;AccCali_A = [1 -Ixy -Ixz ; -Iyx 1 -Iyz ; -Izx -Izy 1 ];Delta_t = 0.05; %采样时间为0.05秒Delta_Theta_x = 0;Delta_Theta_y = 0;Delta_Theta_z = 0; %定义陀螺仪输出的角度增量Delta_Vx = 0;Delta_Vy = 0;Delta_Vz = 0; %定义加速度计输出的速度增量L = zeros(1,12001);L(1)= 45.7328*pi/180 ; %纬度用L表示,纬度的初始值划为弧度形式,因为后面计算位置矩阵更新L(2)= 45.7328*pi/180 ; %时需要用到前两次的L值来计算当前L值,所以在此定义2个初始L值Lamda = 126.6287*pi/180 ; %经度用Lamda表示,经度的初始值划为弧度形式h = 136 ; %高度用h表示V = [ 0 ; 0 ; 0 ]; %导航坐标系中的东北天初始速度都为0Vx = 0; %方便后面的速度计算与速度更新Vy = 0;Vz = 0;Theta = 0;Gama = 0;Fai = 0; %初始姿态角(俯仰角/倾斜角/航向角)都为0,此处均为弧度Re = 6378254 ; Rp = 6356803 ;%定义地球的半长轴与半短轴e = (Re - Rp)/Re ; %定义旋转椭球扁率(椭球度)Wie = 15.04107/180*pi ; %定义地球自转角速度,地球坐标系相对于惯性坐标系的角速度Theta_Matrix = zeros(1,12000); %定义姿态角矩阵,供画图用Gama_Matrix = zeros(1,12000);Fai_Matrix = zeros(1,12000);L_Matrix = zeros(1,12001); %定义经纬度矩阵,供画图用,L的特殊性决定了其数据个数为12001L_Matrix(1) = 45.7328;Lamda_Matrix = zeros(1,12000);Ve_Matrix = zeros(1,12000); %定义速度矩阵,供画图用Vn_Matrix = zeros(1,12000);Vu_Matrix = zeros(1,12000);%以下计算捷联矩阵的初始值,捷联矩阵的初始值仅仅由Theta,Gama,Fai的初始值决定T = [ cos(Gama)*cos(Fai)-sin(Gama)*sin(Theta)*sin(Fai) -cos(Theta)*sin(Fai) sin(Gama)*cos(Fai)+cos(Gama)*sin(Theta)*sin(Fai) ;cos(Gama)*sin(Fai)+sin(Gama)*sin(Theta)*cos(Fai) cos(Theta)*cos(Fai) sin(Gama)*sin(Fai)-cos(Gama)*sin(Theta)*cos(Fai) ;-sin(Gama)*cos(Theta) sin(Theta) cos(Gama)*cos(Theta) ];%由捷联矩阵的初始值计算初始四元数值,为捷联矩阵的实时更新做准备if(T(3,2)-T(2,3)>0)Q1 = 0.5*sqrt(1+T(1,1)-T(2,2)-T(3,3));else if (T(3,2)-T(2,3)==0)Q1 = 0;else Q1 = -0.5*sqrt(1+T(1,1)-T(2,2)-T(3,3));end %求解Q1endif(T(1,3)-T(3,1)>0)Q2 = 0.5*sqrt(1-T(1,1)+T(2,2)-T(3,3));else if (T(1,3)-T(3,1)==0)Q2 = 0;else Q2 = -0.5*sqrt(1-T(1,1)+T(2,2)-T(3,3));end %求解Q2endif(T(2,1)-T(1,2)>0)Q3 = 0.5*sqrt(1-T(1,1)-T(2,2)+T(3,3));else if (T(2,1)-T(1,2)==0)Q3 = 0;else Q3 = -0.5*sqrt(1-T(1,1)-T(2,2)+T(3,3));end %求解Q3endQ0 = 0.5*sqrt(1-Q1*Q1-Q2*Q2-Q3*Q3); %求解Q0Q = [Q0 ; Q1 ; Q2 ; Q3]; %四元数初始值Q = Q / sqrt(Q0*Q0+Q1*Q1+Q2*Q2+Q3*Q3); %四元数的初始归一化,为得到最小漂移误差%以下求位置矩阵的初始值,通过位置矩阵更新后,反过来算运载体所在的经纬度%位置矩阵仅仅与经纬度有关系,Ce2n表示把地球坐标系转换为导航坐标系的转换矩阵Ce2n = [ -sin(Lamda) cos(Lamda) 0 ;-sin( L(1) )*cos(Lamda) -sin(L(1))*sin(Lamda) cos( L(1) );cos( L(1) )*cos(Lamda) cos( L(1) )*sin(Lamda) sin( L(1) ) ];%大循环,共执行12000次,实时更新捷联矩阵,速度矩阵,位置矩阵,保存作图所需数据for k = 1:12000;GyroCali_B = [Sx*Px(k)-Dx*Delta_t ; Sy*Py(k)-Dy*Delta_t ; Sz*Pz(k)-Dz*Delta_t ];Delta_Theta = GyroCali_A * GyroCali_B ; %计算陀螺仪输出的角度增量Delta_Theta_x = Delta_Theta(1);Delta_Theta_y = Delta_Theta(2);Delta_Theta_z = Delta_Theta(3);Delta_Theta_Module = sqrt( Delta_Theta_x * Delta_Theta_x + Delta_Theta_y * Delta_Theta_y + Delta_Theta_z * Delta_Theta_z );AccCali_B = [Kx*Nx(k)-Bx*Delta_t ; Ky*Ny(k)-By*Delta_t ; Kz*Nz(k)-Bz*Delta_t ];Delta_V = AccCali_A * AccCali_B ; %计算加速度计输出的速度增量Delta_Vx = Delta_V(1);Delta_Vy = Delta_V(2);Delta_Vz = Delta_V(3);Delta_V_Module = sqrt( Delta_Vx * Delta_Vx + Delta_Vy * Delta_Vy + Delta_Vz * Delta_Vz );%使用毕卡法求解四元数更新矩阵,即捷联矩阵Bika = zeros(4);Bika(1,1) = cos(0.5 * Delta_Theta_Module);Bika(1,2) = -Delta_Theta_x / Delta_Theta_Module * sin(0.5 * Delta_Theta_Module);Bika(1,3) = -Delta_Theta_y / Delta_Theta_Module * sin(0.5 * Delta_Theta_Module);Bika(1,4) = -Delta_Theta_z / Delta_Theta_Module * sin(0.5 * Delta_Theta_Module);Bika(2,1) = -Bika(1,2);Bika(2,2) = Bika(1,1);Bika(2,3) = -Bika(1,4);Bika(2,4) = Bika(1,3);Bika(3,1) = -Bika(1,3);Bika(3,2) = -Bika(2,3);Bika(3,3) = Bika(1,1);Bika(3,4) = -Bika(1,2);Bika(4,1) = -Bika(1,4);Bika(4,2) = -Bika(2,4);Bika(4,3) = -Bika(3,4);Bika(4,4) = Bika(1,1);Q = Bika * Q; % 每循环一次,更新一次四元素Q值,为求捷联矩阵Q = Q / sqrt(Q0*Q0+Q1*Q1+Q2*Q2+Q3*Q3); %四元数的归一化,为得到最小漂移误差Q0 = Q(1);Q1 = Q(2);Q2 = Q(3);Q3 = Q(4);%捷联矩阵的四元数表达式T = [ Q0*Q0+Q1*Q1-Q2*Q2-Q3*Q3 2*(Q1*Q2-Q0*Q3) 2*(Q1*Q3+Q0*Q2)2*(Q1*Q2+Q0*Q3) Q0*Q0-Q1*Q1+Q2*Q2-Q3*Q3 2*(Q2*Q3-Q0*Q1)2*(Q1*Q3-Q0*Q2) 2*(Q2*Q3+Q0*Q1) Q0*Q0-Q1*Q1-Q2*Q2+Q3*Q3 ];%*********************************************************************%********************求三个姿态角Theta,Gama和Fai ******************** %*********************************************************************Theta_Main = asin( T(3,2) );Gama_Main = atan( -T(3,1) / T(3,3));Fai_Main = atan( -T(1,2) / T(2,2));Theta = Theta_Main;if (T(3,3)>0)Gama = Gama_Main ;else if (T(3,3)<0 && Gama_Main > 0)Gama = Gama_Main + pi;else Gama = Gama_Main - pi; %此处用else实为不妥,不过为了程序的完善性,只能这样了endendif ( T(2,2)<0 )Fai = Fai_Main + pi ;else if (T(2,2)==0)Fai = pi/2;else if ( Fai_Main>0)Fai = Fai_Main;else Fai = Fai_Main + 2*pi ;endendend%以下存储姿态角到三个矩阵里面,为画图做准备Theta_Matrix(k) = Theta*180/pi; %作图用矩阵,以角度表示Gama_Matrix(k) = Gama*180/pi; %作图用矩阵,以角度表示if (Fai<2*pi)Fai_Matrix(k) = Fai*180/pi;else Fai_Matrix(k) = Fai*180/pi-360; %作图用矩阵,以角度表示end%到此为止,姿态角的求解完毕,以下先求速度%*********************************************************************%********************求飞行器相对于东北天的速度************************* %*********************************************************************Rm = Re*( 1-2*e+3*e*sin( L(k+1) )^2 );Rn = Re*( 1+e*sin(L(k+1))^2 );LL = 3/2*L(k+1) - 1/2*L(k) ;F = [ 0 -1/(Rm + h) 0 ; 1/(Rn + h) 0 0 ; tan( LL )/(Rn + h) 0 0];g = 9.7803+0.051799*sin(L(k+1))^2-0.94114e-006*h;G = [0;0;-g];Wen2n = F*V;Wie2n = [0 ; Wie*cos(L(k+1)); Wie*sin(L(k+1))];W = 2*Wie2n + Wen2n;W_X = [ 0 -W(3) W(2) ; W(3) 0 -W(1) ; -W(2) W(1) 0 ]; %此式中W_X为2*Wie+Wen2n 的反对称矩阵V = V + T*( Delta_V+ [ 0 -Delta_Theta_z Delta_Theta_y ; Delta_Theta_z 0 -Delta_Theta_x ; -Delta_Theta_y Delta_Theta_x 0 ]*Delta_V ) + Delta_t*(G-W_X*V);Vx = V(1);Vy = V(2);Vz = V(3);V e_Matrix(k) = V(1);Vn_Matrix(k) = V(2);Vu_Matrix(k) = V(3);%*********************************************************************%********************求飞行器所在的经纬度****************************** %*********************************************************************Epsilon = F*V*Delta_t;Ce2n =( eye(3) - [ 0 -Epsilon(3) Epsilon(2) ; Epsilon(3) 0 -Epsilon(1) ; -Epsilon(2) Epsilon(1) 0 ] )*Ce2n ; %位置矩阵实时更新%下面通过位置矩阵来实时更新经纬度L(k+2) = asin( Ce2n(3,3)); %由于L本来就是以矩阵形式定义的,下面定义一个把L用角度表示的矩阵L_Matrix(k+1) = L(k+2)*180/pi;Lamda_Main = atan( Ce2n(3,2)/Ce2n(3,1) ); %计算出来的L和Lamda都是弧度制的if (Ce2n(3,1)>0)Lamda = Lamda_Main;else if (Lamda_Main<0)Lamda = Lamda_Main + pi;else Lamda = Lamda_Main - pi;endendLamda_Matrix(k) = Lamda*180/pi; %作图用矩阵,以角度表示end%**************************************************************************%********************以下是画图程序*****************************************%**************************************************************************k=1:1:12000; %绘制三轴姿态变化图线-绿色figure(1);plot(k/20,Theta_Matrix(k),'g');xlabel('Time(second)');ylabel('Angle(degree)');title('Theta(俯仰角)');grid on;figure(2);plot(k/20,Gama_Matrix(k),'g');xlabel('Time(second)');ylabel('Angle(degree)');title('Gama(滚转角)');grid on;figure(3);plot(k/20,Fai_Matrix(k),'m');xlabel('Time(second)');ylabel('Angle(degree)');title('Fai(偏航角)');grid on;%绘制东北天个方向的速度变化曲线-红色figure(4);plot(k/20,Ve_Matrix(k),'r');xlabel('Time(second)');ylabel('Velocity(m/s)');title('Ve(东向速度)');grid on;figure(5);plot(k/20,Vn_Matrix(k),'r');xlabel('Time(second)');ylabel('Velocity(m/s)');title('Vn(北向速度)');grid on;figure(6);plot(k/20,Vu_Matrix(k),'r');xlabel('Time(second)');ylabel('Velocity(m/s)');title('Vu(天向速度)');grid on;%绘制飞行器所在经纬度曲线-蓝色figure(7);plot(k/20,L_Matrix(k),'b');xlabel('Time(second)');ylabel('Degree');title('Latitude L(纬度)');grid on;figure(8);plot(k/20,Lamda_Matrix(k),'b');xlabel('Time(second)');ylabel('Degree');title('Longitude Lamda(经度)');grid on;。
捷联惯导的解算程序
%====本程序为捷联惯导的解算程序(由惯性器件的输出解算出飞行器的位置、速度、姿态信息)======clear all;close all;clc;deg_rad=pi/180; %由度转化成弧度rad_deg=180/pi; %由弧度转化成度%-------------------------------从源文件中读入数据----------------------------------fid_read=fopen('IMUout.txt','r'); %path1_Den.dat 是由轨迹发生器产生的数据[AllDataNumofAllData]=fscanf(fid_read,'%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g',[17 inf]);AllData=AllData';NumofEachData=round(NumofAllData/17);Time=AllData(:,1);longitude=AllData(:,2); %经度单位:弧度latitude=AllData(:,3); %纬度单位:弧度High=AllData(:,4); %高度单位:米Ve=-AllData(:,6); % 东向、北向、天向速度单位:米/妙Vn=AllData(:,5);Vu=AllData(:,7);fb_x=AllData(:,9); %比力(fx,fy,fz)fb_y=AllData(:,8); %指向右机翼方向为x正方向,指向机头方向为y正向,z轴与x轴和y轴构成右手坐标系单位:米/秒2fb_z=-AllData(:,10); %右前上pitch=AllData(:,11); %俯仰角(向上为正)单位:弧度head=-AllData(:,13); %偏航角(偏西为正)roll=AllData(:,12); %滚转角(向右为正)omigax=AllData(:,15); %陀螺输出(单位:弧度/秒,坐标轴的定义与比力的相同)omigay=AllData(:,14);omigaz=-AllData(:,16);%-------------------------------程序初始化--------------------------------------latitude0=latitude(1);longitude0=longitude(1); %初始位置High0=High(1);Ve0=Ve(1);Vn0=Vn(1); %初始速度Vu0=Vu(1);pitch0=pitch(1);head0=head(1); %初始姿态roll0=roll(1);TimeEach=0.005; %周期和仿真总时间TimeAll=(NumofEachData-1)*TimeEach;Omega_ie=0.7292115147E-4;%0.00007272205216643040; %地球自转角速度单位:弧度每妙g0=9.78;%------------------------------导航解算开始--------------------------------------%假设没有初始对准误差pitch_err0=pitch0+0*deg_rad;head_err0=head0+0*deg_rad;roll_err0=roll0+0*deg_rad;%初始捷联矩阵的计算《捷联惯导系统》P63 旋转顺序 head - pitch - roll %导航坐标系n为东北天方向载体坐标系b为右前上偏航角北偏西为正Tbn(1,1)=cos(roll_err0)*cos(head_err0)-sin(roll_err0)*sin(pitch_err0) *sin(head_err0);Tbn(1,2)=cos(roll_err0)*sin(head_err0)+sin(roll_err0)*sin(pitch_err0) *cos(head_err0);Tbn(1,3)=-sin(roll_err0)*cos(pitch_err0);Tbn(2,1)=-cos(pitch_err0)*sin(head_err0);Tbn(2,2)=cos(pitch_err0)*cos(head_err0);Tbn(2,3)=sin(pitch_err0);Tbn(3,1)=sin(roll_err0)*cos(head_err0)+cos(roll_err0)*sin(pitch_err0) *sin(head_err0);Tbn(3,2)=sin(roll_err0)*sin(head_err0)-cos(roll_err0)*sin(pitch_err0) *cos(head_err0);Tbn(3,3)=cos(roll_err0)*cos(pitch_err0);Tnb=Tbn';%位置矩阵的初始化《捷联惯导系统》P46 其中游动方位角 a=0 假使初始经纬度确知Cne(1,1) = - sin(longitude0);Cne(1,2) = cos(longitude0);Cne(1,3) = 0;Cne(2,1) = - sin(latitude0) * cos(longitude0);Cne(2,2) = - sin(latitude0) * sin(longitude0);Cne(2,3) = cos(latitude0);Cne(3,1) = cos(latitude0) * cos(longitude0);Cne(3,2) = cos(latitude0) * sin(longitude0);Cne(3,3) = sin(latitude0);Cen=Cne';%初始四元数的确定《捷联惯导系统》 P151-152 方法本身保证了q1^2+q2^2+q3^2+q4^2=1q(2,1) = sqrt(abs(1.0 + Tnb(1,1) - Tnb(2,2) - Tnb(3,3))) / 2.0; q(3,1) = sqrt(abs(1.0 - Tnb(1,1) + Tnb(2,2) - Tnb(3,3))) / 2.0; q(4,1) = sqrt(abs(1.0 - Tnb(1,1) - Tnb(2,2) + Tnb(3,3))) / 2.0;q(1,1) = sqrt(abs(1.0 - q(2,1) ^2 - q(3,1) ^2 - q(4,1) ^2));% 判断q(1,1)的符号flag_q11=cos(head_err0/2.0)*cos(pitch_err0/2.0)*cos(roll_err0/2.0)-sin(head_err0/2.0)*sin(pitch_err0/2.0)*sin(roll_err0/2.0);if (flag_q11 >0) %此时q(1,1)取正if (Tnb(3,2) < Tnb(2,3))q(2,1) = - q(2,1);endif (Tnb(1,3) < Tnb(3,1))q(3,1) = - q(3,1);endif (Tnb(2,1) < Tnb(1,2))q(4,1) = - q(4,1);endelse %此时q(1,1)取负或0q(1,1) = - q(1,1);if (Tnb(3,2) > Tnb(2,3))q(2,1) = - q(2,1);endif (Tnb(1,3) > Tnb(3,1))q(3,1) = - q(3,1);endif (Tnb(2,1) > Tnb(1,2))q(4,1) = - q(4,1);endend%-------------------------迭代推算用到的参数的初始化------------------------Wiee_e = 0;Wiee_n = 0;Wiee_u = Omega_ie;Wiee = [Wiee_e Wiee_n Wiee_u]'; %地球速率在地球系中的投影东-北-天Lat_err(1)=latitude0;Lon_err(1)=longitude0;High_err(1)=High0;Ve_err(1)=Ve0;Vn_err(1)=Vn0;Vu_err(1)=Vu0;pitch_err(1)=pitch_err0;head_err(1)=head_err0;roll_err(1)=roll_err0;Re=6378137.0;%6378245.0; %地球长轴《惯性导航系统》 P28e=0.0033528106647474807198455286185206; %地球扁率精确值ee=0.00669437999014131699614;%----------------------------迭代推算开始-----------------------------------for i=1:NumofEachData%----------------------------惯性仪表数据的获得------------------------Wibb(1,1)=omigax(i); %指向右机翼方向为x正方向,指向机头方向为y正向,z轴与x轴和y轴构成右手坐标系Wibb(2,1)=omigay(i); %单位:弧度/妙Wibb(3,1)=omigaz(i); %右前上fb(1,1)=fb_x(i); %指向右机翼方向为x正方向,指向机头方向为y正向,z轴与x轴和y轴构成右手坐标系fb(2,1)=fb_y(i); %单位:米/秒2fb(3,1)=fb_z(i); %右前上%--------计算在姿态矩阵和位置矩阵更新时用到的参数------------------ RM=Re*(1.0-2.0*e+3.0*e*Cne(3,3)^2)+High_err(i); %《捷联惯导系统》P233 P235RN=Re*(1.0+e*Cne(3,3)^2)+High_err(i);% RN=Re*(1-ee)/(sqrt(1-ee*sin(Lat_err(i))))^3+High_err(i);% RM=Re/sqrt(1-ee*sin(Lat_err(i)))+High_err(i);%实验当地重力加速度计算《捷联惯导系统》P150 《惯性导航系统》 P35g=g0*((1.0+0.0052884*Cne(3,3)^2)-0.0000059*(1-(1-2*Cne(3,3)^2)^2))*(1 .0-2.0*High_err(i)/Re);tmp_slat=sin(Lat_err(i))*sin(Lat_err(i));Wien = Cne * Wiee; %地球速率在导航系中的投影Wenn(1,1) = -Vn_err(i)/RM;Wenn(2,1) = Ve_err(i)/RN; % <<惯性导航系统>> P45 考虑了地球转动的影响.Wenn(3,1) = Ve_err(i)*tan(Lat_err(i))/RN; %计算Wenn(不太精确),更新速度和位置矩阵时用Winn=Wien+Wenn;Winb=Tbn*Winn;Wnbb=Wibb-Winb; %姿态速率在姿态更新时用到fn=Tnb*fb; % x-y-z 东-北-天% 速度的更新《捷联惯导系统》 P30 33 东-北-天difVe_err=fn(1,1)+(2*Wien(3,1)+Wenn(3,1))*Vn_err(i)-(2*Wien(2,1)+Wenn (2,1))*Vu_err(i);difVn_err=fn(2,1)-(2*Wien(3,1)+Wenn(3,1))*Ve_err(i)+(2*Wien(1,1)+Wenn (1,1))*Vu_err(i);difVu_err=fn(3,1)+(2*Wien(2,1)+Wenn(2,1))*Ve_err(i)-(2*Wien(1,1)+Wenn (1,1))*Vn_err(i)-g;Ve_err(i+1)=Ve_err(i)+difVe_err*TimeEach;Vn_err(i+1)=Vn_err(i)+difVn_err*TimeEach;Vu_err(i+1)=Vu_err(i)+difVu_err*TimeEach;High_err(i+1)=High_err(i)+Vu_err(i)*TimeEach;% 位置矩阵的实时更新《惯性导航系统》 P190Cne(1,1)=Cne(1,1)+TimeEach*(Wenn(3,1)*Cne(2,1)-Wenn(2,1)*Cne(3,1)); Cne(1,2)=Cne(1,2)+TimeEach*(Wenn(3,1)*Cne(2,2)-Wenn(2,1)*Cne(3,2)); Cne(1,3)=Cne(1,3)+TimeEach*(Wenn(3,1)*Cne(2,3)-Wenn(2,1)*Cne(3,3)); Cne(2,1)=Cne(2,1)+TimeEach*(-Wenn(3,1)*Cne(1,1)+Wenn(1,1)*Cne(3,1)); Cne(2,2)=Cne(2,2)+TimeEach*(-Wenn(3,1)*Cne(1,2)+Wenn(1,1)*Cne(3,2)); Cne(2,3)=Cne(2,3)+TimeEach*(-Wenn(3,1)*Cne(1,3)+Wenn(1,1)*Cne(3,3)); Cne(3,1)=Cne(3,1)+TimeEach*(Wenn(2,1)*Cne(1,1)-Wenn(1,1)*Cne(2,1)); Cne(3,2)=Cne(3,2)+TimeEach*(Wenn(2,1)*Cne(1,2)-Wenn(1,1)*Cne(2,2)); Cne(3,3)=Cne(3,3)+TimeEach*(Wenn(2,1)*Cne(1,3)-Wenn(1,1)*Cne(2,3));% Mat_Wenn(1,1)=0;% Mat_Wenn(1,2)=Wenn(3,1);% Mat_Wenn(1,3)=-Wenn(2,1); %Wenn的反对阵矩阵取负% Mat_Wenn(2,1)=-Wenn(3,1); %这里位置矩阵的及时修正为:dCne/dt=Mat_Wenn*Cne% Mat_Wenn(2,2)=0;% Mat_Wenn(2,3)=Wenn(1,1);% Mat_Wenn(3,1)=Wenn(2,1);% Mat_Wenn(3,2)=-Wenn(1,1);% Mat_Wenn(3,3)=0;%% Mat_Wenn=Mat_Wenn*Cne*TimeEach;% Cne=Cne+Mat_Wenn;Cen=Cne';% 计算经纬度Lat_err(i+1)=asin(Cne(3,3));Lon_err(i+1)=atan(Cne(3,2)/Cne(3,1)); %这是经度的主值if (Cne(3,1) < 0)if (Lon_err(i+1) > 0)Lon_err(i+1) = Lon_err(i+1) - pi;elseLon_err(i+1) = Lon_err(i+1) + pi;endend% 四元数的及时修正《惯性导航系统》 P194% Mat_Wnbb=[ 0, -Wnbb(1,1), -Wnbb(2,1), -Wnbb(3,1); % Wnbb(1,1), 0, Wnbb(3,1), -Wnbb(2,1); % Wnbb(2,1), -Wnbb(3,1), 0, Wnbb(1,1); % Wnbb(3,1), Wnbb(2,1), -Wnbb(1,1), 0];% q=q+Mat_Wnbb*q*TimeEach/2.0;q(1,1)=q(1,1)+TimeEach*(-Wnbb(1,1)*q(2,1)-Wnbb(2,1)*q(3,1)-Wnbb(3,1)* q(4,1))/2.0;q(2,1)=q(2,1)+TimeEach*(Wnbb(1,1)*q(1,1)+Wnbb(3,1)*q(3,1)-Wnbb(2,1)*q (4,1))/2.0;q(3,1)=q(3,1)+TimeEach*(Wnbb(2,1)*q(1,1)-Wnbb(3,1)*q(2,1)+Wnbb(1,1)*q (4,1))/2.0;q(4,1)=q(4,1)+TimeEach*(Wnbb(3,1)*q(1,1)+Wnbb(2,1)*q(2,1)-Wnbb(1,1)*q (3,1))/2.0;% 四元数归一化处理q_norm=sqrt(sum(q.*q));q=q/q_norm;% 计算姿态矩阵 TnbTnb(1,1) = q(1,1) ^2 + q(2,1) ^2 - q(3,1)^2 - q(4,1)^2;Tnb(1,2) = 2.0 * (q(2,1) * q(3,1) - q(1,1) * q(4,1));Tnb(1,3) = 2.0 * (q(2,1) * q(4,1) + q(1,1) * q(3,1));Tnb(2,1) = 2.0 * (q(2,1) * q(3,1) + q(1,1) * q(4,1));Tnb(2,2) = q(1,1)^2 - q(2,1)^2 + q(3,1)^2 - q(4,1)^2;Tnb(2,3) = 2.0 * (q(3,1) * q(4,1) - q(1,1) * q(2,1));Tnb(3,1) = 2.0 * (q(2,1) * q(4,1) - q(1,1) * q(3,1));Tnb(3,2) = 2.0 * (q(3,1) * q(4,1) + q(1,1) * q(2,1));Tnb(3,3) = q(1,1)^2 - q(2,1)^2 - q(3,1)^2 + q(4,1)^2;Tbn=Tnb';flag_pitch=asin(Tnb(3,2));flag_roll=atan(-Tnb(3,1)/Tnb(3,3));flag_head=atan(-Tnb(1,2)/Tnb(2,2));if(Tnb(3,3)<0)if(flag_roll<0)flag_roll=flag_roll+pi;endif(flag_roll>0)flag_roll=flag_roll-pi;endend% 偏航角范围 -180度——180度北偏西为正if(Tnb(2,2)<0)if(flag_head<0)flag_head=flag_head+pi;endif(flag_head>0)flag_head=flag_head-pi;endend% 姿态角更新pitch_err(i+1)=flag_pitch;head_err(i+1)=flag_head;roll_err(i+1)=flag_roll;% 解算完毕由对准结果、陀螺、加表的输出解算出载体的位置、速度、姿态%----------------------计算解算误差------------------ddLat(i)=(Lat_err(i)-latitude(i))*rad_deg; %纬度误差单位:度ddLog(i)=(Lon_err(i)-longitude(i))*rad_deg; %经度误差单位:度ddHigh(i)=High_err(i)-High(i); %高度误差单位:米ddVe(i)=Ve_err(i)-Ve(i);ddVn(i)=Vn_err(i)-Vn(i); % 速度误差单位:米/妙2ddVu(i)=Vu_err(i)-Vu(i);ddpitch(i)=(pitch_err(i)-pitch(i))*rad_deg*3600; %姿态误差单位:度ddhead(i)=(head_err(i)-head(i))*rad_deg*3600;ddroll(i)=(roll_err(i)-roll(i))*rad_deg*3600;endfclose(fid_read);%---------------------------绘图开始--------------------------------- figure(1)plot(Time,ddLog)ylabel('经度误差(度)'),xlabel('时间(秒)');figure(2)plot(Time,ddLat)ylabel('纬度误差(度)'),xlabel('时间(秒)');figure(3)plot(Time,ddHigh);ylabel('高度误差(米)'),xlabel('时间(秒)');figure(4)plot(Time,ddhead)ylabel('偏航角误差(角妙)'),xlabel('时间(秒)'); figure(5)plot(Time,ddpitch)ylabel('俯仰角误差(角妙)'),xlabel('时间(秒'); figure(6)plot(Time,ddroll);ylabel('滚转角误差(角妙)'),xlabel('时间(秒)'); figure(7)plot(Time,ddVe);ylabel('东向速度误差(米/秒)'),xlabel('时间(秒)'); figure(8)plot(Time,ddVn)ylabel('北向速度误差(米/秒)'),xlabel('时间(秒)'); figure(9)plot(Time,ddVu)ylabel('天向速度误差(米/秒)'),xlabel('时间(秒)');%------------------------------绘图结束-------------------------------。
导航原理之捷联惯导系统-姿态算法(矩阵)
C(n) I3
0 z y z 0 x y 0.006 0.004 0 x 0.006 0 0.002 0.004 0.002 0 0
C(n 1) C(n)I 3
C C
R
也可用欧拉角、四元数等表示姿态
Lecture 10 -- Algorithms for SINS
4
1.3 SINS的示意框图
AX AY AZ
姿态信息 沿载体轴的 加速度输出 对加速度分量 进行坐标变换 沿地理坐标 系各轴的加 速度 导 航 计 算 位置 速度
显 示
GX GY GZ
:
:
C I
1 C I 2 2 ………..
许多类型的陀螺仪可用内部 硬件完成对角速率的积分, 从而直接输出角增量.
Lecture 10 --ห้องสมุดไป่ตู้Algorithms for SINS
14
3.6 地理坐标系的修正
G G CB 0 (T ) CB 0 (0)C
12
3.2*毕-卡解
0 IB (t ) dt G C (T ) C (0) e CB 0 (0) e
B T
G0 B
G0 B
sin 0 1 cos 0 2 C (0) I 2 0 0 ------ 毕-卡形式的解
Lecture 10 -- Algorithms for SINS
3
1.2 姿态变换
z, 方位轴
加速度需要变换:
fE f bx f N C f by f f bz
matlab典型飞机的飞行控制律设计
matlab典型飞机的飞行控制律设计1.引言1.1 概述正文概述飞行控制律是飞机自动驾驶系统中的重要组成部分,通过设计飞行控制律可以实现对飞机的稳定性和操纵性的控制。
在过去的几十年中,随着飞机自动化技术的发展,飞行控制律设计已经成为飞机设计中不可或缺的环节。
本文旨在介绍MATLAB在典型飞机飞行控制律设计中的应用。
首先将从飞行控制律设计的原理入手,解释飞行控制律设计的基本概念和目标。
然后,将重点介绍MATLAB在飞行控制律设计中的应用,包括MATLAB 工具箱的使用和MATLAB编程的技巧。
最后,通过实验和案例分析,评估和总结飞行控制律设计的效果,并对未来的研究方向进行展望。
本文的主要目的是提供给研究者、工程师和学生一个全面了解MATLAB在飞行控制律设计中应用的指南,以及对飞行控制律设计的原理和方法有一个清晰的理解。
通过本文的学习和实践,读者可以掌握MATLAB在飞行控制律设计中的应用技能,提高自己在飞机设计和飞行控制领域的能力。
在接下来的章节中,我们将首先介绍飞行控制律设计的原理,包括传统的PID控制器和现代控制理论。
然后,我们将详细讨论MATLAB在飞行控制律设计中的应用,包括如何使用MATLAB工具箱进行控制律设计和仿真。
最后,我们将通过实验和案例,评估和分析设计结果,并对未来的研究方向进行展望。
在本文的结尾部分,我们将总结本文的主要内容并对未来的研究进行展望。
通过本文的阅读和学习,我们相信读者将能够深入了解飞行控制律设计中MATLAB的应用,并能在实际工程中灵活运用这些知识。
1.2文章结构文章结构部分主要介绍了文章的整体结构和各章节内容的概括。
这样可以帮助读者更好地理解文章的结构和组织,以便更好地阅读和理解文章的内容。
以下是关于文章结构的内容:文章结构:本文主要分为引言部分、正文部分和结论部分三个主要部分。
引言部分:引言部分首先对文章的主题进行概述,简要介绍了MATLAB飞行控制律设计的研究背景和意义,并阐述了文章的目的和重要性。
(精品)捷联式惯性导航系统
1 绪论00随着计算机和微电子技术的迅猛发展,利用计算机的强大解算和控制功能代替机电稳定系统成为可能。
于是,一种新型惯导系统--捷联惯导系统从20世纪60年代初开始发展起来,尤其在1969年,捷联惯导系统作为"阿波罗"-13号登月飞船的应急备份装置,在其服务舱发生爆炸时将飞船成功地引导到返回地球的轨道上时起到了决定性作用,成为捷联式惯导系统发展中的一个里程碑。
00捷联式惯性导航(strap-down inertial navigation),捷联(strap-down)的英语原义是“捆绑”的意思。
因此捷联式惯性导航也就是将惯性测量元件(陀螺仪和加速度计)直接装在飞行器、舰艇、导弹等需要诸如姿态、速度、航向等导航信息的主体上,用计算机把测量信号变换为导航参数的一种导航技术。
现代电子计算机技术的迅速发展为捷联式惯性导航系统创造了条件。
惯性导航系统是利用惯性敏感器、基准方向及最初的位置信息来确定运载体的方位、位置和速度的自主式航位推算导航系统。
在工作时不依赖外界信息,也不向外界辐射能量,不易受到干扰破坏。
它完全是依靠载体自身设备独立自主地进行导航,它与外界不发生任何光、声、磁、电的联系,从而实现了与外界条件隔绝的假想的“封闭”空间内实现精确导航。
所以它具有隐蔽性好,工作不受气象条件和人为的外界干扰等一系列的优点,这些优点使得惯性导航在航天、航空、航海和测量上都得到了广泛的运用[1]001.1 捷联惯导系统工作原理及特点惯导系统主要分为平台式惯导系统和捷联式惯导系统两大类。
惯导系统(INS)是一种不依赖于任何外部信息、也不向外部辐射能量的自主式导航系统,具有隐蔽性好,可在空中、地面、水下等各种复杂环境下工作的特点。
捷联惯导系统(SINS)是在平台式惯导系统基础上发展而来的,它是一种无框架系统,由三个速率陀螺、三个线加速度计和微型计算机组成。
平台式惯导系统和捷联式惯导系统的主要区别是:前者有实体的物理平台,陀螺和加速度计置于陀螺稳定的平台上,该平台跟踪导航坐标系,以实现速度和位置解算,姿态数据直接取自于平台的环架;后者的陀螺和加速度计直接固连在载体上作为测量基准,它不再采用机电平台,惯性平台的功能由计算机完成,即在计算机内建立一个数学平台取代机电平台的功能,其飞行器姿态数据通过计算机计算得到,故有时也称其为"数学平台",这是捷联惯导系统区别于平台式惯导系统的根本点。
Matlab火箭动力学模拟与控制方法讲解
Matlab火箭动力学模拟与控制方法讲解导言:随着航空航天技术的不断发展,火箭动力学在航天领域中扮演着至关重要的角色。
而Matlab作为一种强大的仿真工具,能够为火箭动力学的模拟和控制提供便利。
本文将会对Matlab火箭动力学模拟与控制方法进行详细讲解。
一、火箭动力学模拟火箭动力学模拟是对火箭在飞行过程中的运动进行数学建模,并在计算机上进行仿真。
在Matlab中,利用动力学方程和控制方程可以模拟出火箭的姿态、速度、加速度等参数,从而为火箭设计和控制提供重要的参考依据。
1. 火箭动力学方程火箭动力学方程是描述火箭运动规律的重要基础。
通常来说,火箭的动力学方程可以分为姿态方程和运动学方程。
姿态方程用于描述火箭在三维空间中的姿态变化。
通过旋转矩阵和四元数等方法,可以得到火箭的姿态矩阵,并计算出姿态控制所需的力矩。
运动学方程则用于描述火箭的速度、加速度等关键参数。
通过质量、推力、空气阻力等因素的综合考虑,可以计算出火箭的运动学参数。
2. 火箭控制方程火箭的控制方程是实现姿态控制的重要手段。
通过使用比例控制、积分控制、微分控制等方法,可以将火箭的姿态与期望姿态进行对比,并计算出所需的控制力矩。
在Matlab中,可以利用控制工具箱提供的函数和工具,快速实现火箭的控制方程。
通过调整控制参数和控制策略,可以使火箭在飞行过程中实现精确的姿态控制。
二、火箭动力学控制方法在实际的火箭发射过程中,控制是保证火箭正确运行的重要手段。
Matlab提供了一系列的控制方法,可以帮助设计师更好地实现火箭动力学控制。
1. PID控制PID控制是一种经典的控制方法,适用于各种控制系统。
在火箭动力学模拟中,PID控制可以通过调节比例、积分和微分参数,实现控制系统的稳定性和精确性。
在Matlab中,可以通过使用pid函数来设计PID控制器,并将其应用于火箭动力学模拟中。
通过模拟不同参数的效果,可以找到最优的控制参数,从而实现火箭的稳定飞行。
捷联惯性导航积分算法设计--第一部分:姿态算法
为 安装 在 坐标 ; J
∞ : 坐标 系 A 相对 坐标 系 A。 = 的运 动角速 率 ; 当 A。 为惯 性 系 i , 时
,
上 的角速 率传感 器所 测得 到 的角速率 。
修 回 日期 :2 1 - 7 3 0 10 — 0
角速 率/口 力 速度 效 应 ( 姿态 更新 中的 圆锥 效应 ,速 度更 新 中的划船 效 应 ,高分 辨 率位 置更 新 中的 涡卷 效 应 ( 由作 者定 义 的术语 ) ; 另一路 中速 算法 用于 参数 积分 算法 ( 态 ,速度 或位 置 ) ) 姿 ,其
中前 一路 的输 出为后 一路 的输 入。 算 法的设 计步 骤是 对捷 联 惯 导 系统传 感器 测 量得 到 的角速 率/ 比力进 行运 算 ,又 是姿 态 基准 用 导航 坐标 系旋 转及 速度 的积 分运 算 。本 文作 为 第 一部 分 .定 义 了全 面 的捷联 惯 导 系统 积分 算 法 的设计 需 求 ,给 出 了方 向余 弦矩 阵形 式和 四元数 形 式 的姿 态 更 新算 法。 第二部 分 ( aae . . 捷联 惯 性 导航 积 分算 法设 计第 一部 分 :姿态 算 法” ora o S vg , G,“ P ,Jun l f G ia c ,C nrla d D n m c 即将 发 表 ) ud n e o t n y a is( o )论 述 了速 度 、位 置 积分 算 法 的设 计 方 法 。 第 一 、
, 单位 阵 : _
g 将某 一 四元数 向量 的各 分 量从 A: 坐标 系 转换 到 A 坐标 系的姿 态 四元 数 ;
AI *
,
A
g :g
I共 元 , 一 元 与g的 一 元 相 , -个 素 对 元 的 轭四 数 第 个 素 : 第 个 素 同 第2 元 是q的 应 4 A , I
基于MATLAB的捷联惯组测量数据分析平台
基于MATLAB的捷联惯组测量数据分析平台作者:陈春歌宋玉珍来源:《数字技术与应用》2020年第09期摘要:针对某型飞行器的运动轨迹参数的计算问题,建立了基于MATLAB的捷联惯组测量数据分析平台。
该平台采用MATLAB GUI图形化编程语言编制,功能设计兼具模块化和结构化,通过设定初始参数生成飞行器运动轨迹。
利用仿真试验数据结果表明,该平台实现了捷联惯组数据在发射坐标下的解算,可用于某飞行器试验数据事后处理和运动轨迹复现工作。
关键词:飞行器;捷联惯组;运动轨迹;MATLAB GUI中图分类号:TP273 文献标识码:A 文章编号:1007-9416(2020)09-0161-040 引言某飞行器惯性测量装置用于测量飞行器相对惯性空间转动的角速度和视加速度在载体坐标系三个轴上的投影[1]。
然而在实际应用中,由于测量所得角速率和加速度为载体坐标下数据,在事后数据处理中需将其转换到发射坐标系下进行分析,以复现出发射坐标下的弹道数据,并需要将数据进行存储再利用。
MATLAB GUI是基于MATLAB的图形化编程语言,基于MATLAB GUI的编程既能有效利用MATLAB的计算功能,又能通过GUI直观显示计算结果及曲线等,能更直观地分析飞行器飞行弹道特征及捷联惯组性能。
本文捷联惯组测量数据分析平台各部分功能相互独立,初始参数、原始测量数据读取部分根据飞行器的运动特征和初始环境,设定初始参数选取原则,并在弹道复现计算中进行了初始误差补偿;导航数据解算部分是分析平台的核心部分,对飞行器的姿态矩阵更新选取了两种算法:欧拉角法和四元数法,实现了两种算法下姿态解算的精度比较;该平台另一特色即是结合飞行器飞行弹道特征点,选取主要特征点进行解算分析。
通过设置不同初始参数,复现不同初始条件下各时刻载体的运动信息、姿态信息及弹道特征点信息,解算结果明确,便于工程技术人员进行事后数据分析。
1 捷联惯组测量数据分析建模1.1 选取坐标系捷联惯性测量装置固连于飞行器载体上,测量到的是载体坐标系轴向上的分量,飞行器运动轨迹的观测点在发射坐标系,初始运动参数的设置建立在艇体坐标系[1]。
捷联惯导系统_姿态算法(矩阵)
m主ajor 1800 (900 ,1800 )
m主ajor 1800 (1800 ,2700 )
Lecture 10 -- Algorithms for SINS
23
Outline
捷联惯导系统概述 使用欧拉角的姿态算法 方向余弦矩阵微分方程的推导 方向余弦矩阵微分方程的求解
基于Peano-Baker 解的角增量算法 数值积分 角速率提取
Strap-down Inertial Navigation System
Introduction and Algorithms
捷联惯导系统——介绍及算法(DCM)
Lecture 10 -- Algorithms for SINS
1
Outline
捷联惯导系统概述 使用欧拉角的姿态算法 方向余弦矩阵微分方程的推导 方向余弦矩阵微分方程的求解
C
E b
C
E b
b Eb
其中
0
b Eb
z
z
0
y
x
y x
0
陀螺仪敏感到的是载体的绝 对角速度 bib , 因此
b Eb
b ib
b iE
导航计算可以得到
E IE
并且
b iE
C
b E
E iE
CbE
因此
b Eb
b ib
C
b E
E iE
CbE
所 iE
C
E b
第二项可相对较慢更新
cos cos
cos sin sin sin cos
cos sin cos sin sin
sin cos sin sin sin cos cos sin sin cos cos sin
飞行器姿态控制算法设计与仿真
飞行器姿态控制算法设计与仿真在现代科技发展的背景下,飞行器已经成为了人类生活中必不可少的工具。
无论是在军事、民用、科研还是其他领域,飞行器都发挥着不可替代的作用。
而飞行器的姿态控制则是保证其安全、稳定和精确的关键。
在本文中,我们将探讨飞行器姿态控制算法的设计与仿真,以及其在飞行器控制中的实际应用。
一、飞行器姿态控制的背景在飞行器的飞行过程中,外部环境的干扰和飞行器内部的不稳定因素都会影响到其飞行姿态。
而对于飞行器来说,正确掌握良好的姿态稳定性是保证其飞行安全和飞行效率的关键因素。
因此,如何实现精确的飞行姿态控制成为了当代飞行器设计领域中的一个重要研究方向。
二、姿态控制算法设计的基本原理姿态控制算法是实现飞行器姿态控制的关键。
在设计飞行器姿态控制算法时,需要考虑多个因素,例如外部环境、应用场景等。
基于控制理论的基本原理,姿态控制算法主要包括姿态估计和姿态控制两个部分。
(1)姿态估计姿态估计是指通过飞行器上安装的多种传感器(如三轴加速度计、陀螺仪等),实时测量飞行器的姿态信息(如欧拉角),并运用一定的滤波算法对传感器数据进行融合,以提高姿态估计的正确性和稳定性。
姿态估计的准确性和稳定性直接影响到姿态控制的实时性和效果。
(2)姿态控制姿态控制是指在获得飞行器姿态信息的基础上,通过控制算法产生相应的控制指令,实现飞行器对目标姿态的控制。
姿态控制的过程可以通过神经网络、模糊逻辑和模型预测等算法来实现。
姿态控制的效果不仅受到算法准确性和稳定性的影响,而且还受到外部干扰的影响。
三、飞行器姿态控制算法的仿真广泛地应用数学模型与仿真技术,在模拟环境下对飞行器的控制算法进行研究和验证,是飞行器控制中不可或缺的一环。
飞行器的姿态控制算法仿真可以采用多种不同的仿真软件,包括Matlab/Simulink、C++、python等。
其中,Matlab/Simulink是一种基于图形化环境的多领域建模仿真软件,具有操作方便、可视化、效率高等特点,被广泛用于复杂系统的仿真与控制算法的开发。
四旋翼飞行器建模与仿真Matlab概要
四轴飞行器的建模与仿真摘要四旋翼飞行器是一种能够垂直起降的多旋翼飞行器,它非常适合近地侦察、监视的任务,具有广泛的军事和民事应用前景。
本文根据对四旋翼飞行器的机架构造和动力学特性做详尽的分析和研究,在此根底上建立四旋翼飞行器的动力学模型。
四旋翼飞行器有各种的运行状态,比方:爬升、下降、悬停、滚转运动、俯仰运动、偏航运动等。
本文采用动力学模型来描述四旋翼飞行器的飞行姿态。
在上述研究和分析的根底上,进展飞行器的建模。
动力学建模是通过对飞行器的飞行原理和各种运动状态下的受力关系以及参考牛顿-欧拉模型建立的仿真模型,模型建立后在Matlab/simulink软件中进展仿真。
关键字:四旋翼飞行器,动力学模型,Matlab/simulinkModeling and Simulating for a quad-rotoraircraftABSTRACTThe quad-rotor is a VTOL multi-rotor aircraft. It is very fit for the kind of reconnaissance mission and monitoring task of near-Earth, so it can be used in a wide range of military and civilian applications. In the dissertation, the detailed analysis and research on the rack structure and dynamic characteristics of the laboratory four-rotor aircraft is showed in the dissertation. The dynamic model of the four-rotor aircraft areestablished. It also studies on the force in the four-rotor aircraft flight principles and course of the campaign to make the research and analysis. The four-rotor aircraft has many operating status, such as climbing, downing, hovering and rolling movement, pitching movement and yawing movement. The dynamic model is used to describe the four-rotor aircraft in flight in the dissertation. On the basis of the above analysis, modeling of the aircraft can be made. Dynamics modeling is to build models under the principles of flight of the aircraft and a variety of state of motion, and Newton - Euler model with reference to the four-rotor aircraft.Then the simulation is done in the software of Matlab/simulink.Keywords: Quad-rotor,The dynamic mode, Matlab/simulink目录一.引言11.1 简介11.2研究背景21.3目标和容2二.飞行器建模22.1 机体质心运动模型22.2 机体角运动模型4三.仿真与分析63.1仿真平台和参数选取63.2仿真过程83.2.1飞行器的升降运动仿真83.2.2飞行器的滚转运动仿真93.2.3飞行器的俯仰运动仿真93.2.4飞行器的偏航运动103.3 仿真结果分析11四.结论12参考文献13一.引言1.1 简介四旋翼飞行器也称为四轴飞行器,是一种有4个螺旋桨且螺旋桨呈十字形穿插的飞行器,可以实现各种的运行状态,如:爬升、下降、悬停、滚转运动、俯仰运动、偏航运动等四旋翼飞行器是一种无人机,无人机和有人飞机比拟,具有体积相对较小,造价也比载人机低很多,使用非常的方便,在各种复杂的作战环境都可以进展作战等优点。
捷联惯性导航系统的姿态算法
收稿日期 : 2003207225 基金项目 : 国防预研资助项目 (18 YXGFK D118) 作者简介 : 刘 危 (1974 - ) ,男 ,江西都昌人 ,博士生 , bullkill @21cn. com.
© 1994-2007 China Academic Journal Electronic Publishing House. All rights reserved.
2005 年 1 月 第 31 卷 第 1 期
北京航空航天大学学报 Journal of Beijing University of Aeronautics and Astronautics
January 2005 Vol. 31 No11
捷联惯性导航系统的姿态算法
刘 危 解旭辉 李圣怡
( 19)
Δ T ,则近似中的算法误差为 若令 λ= Ω Δ δ ^Φ - δ Φ ≈δ Φ =
N
- 2 ( p + N)
2
p + N +1
∏
( p + N) ! 2 ( p + N ) +1 λ ab p + N +1 ( 2 k - 1) k =1
( 13)
A =
… … … … … … … A i ,1 … A i , N - 1 A i , N … A i , N + p - 1 A i , N + p … … … … …
第 1 期 刘 危等 : 捷联惯性导航系统的姿态算法
47
k1 K( N + p - 1) × 1 = k2
d1
其中 , A ij ( j ≠( N + p) ) 的定义如式 ( 11) ; 而 A i , N + P 的定义如下 :
四轴飞行器1.4姿态解算和Matlab实时姿态显示
四轴飞⾏器1.4姿态解算和Matlab实时姿态显⽰原创⽂章,欢迎转载,转载请注明出处MPU6050数据读取出来后,经过⼀个星期的努⼒,姿态解算和在matlab上的实时显⽰姿态终于完成了。
1:完成matlab的串⼝,并且实时通过波形显⽰数据2:添加RTT查看CPU使⽤率的扩展功能,MPU6050读取数据的优化3:四元素表⽰的坐标变化,四元素与欧拉⾓的关系和Madgwick的IMUupdate算法4:飞控数据采集线程和数据处理线程的安排,类似于⽣产者与消费者的关系。
先放个效果视频。
1:matlab串⼝初始化还是⽐较简单的,⽹上的资料也很多,这⾥就直接贴初始化代码了。
1 % --- Executes on button press in pb_OpenSerialPort.2 function pb_OpenSerialPort_Callback(hObject, eventdata, handles)3 % hObject handle to pb_OpenSerialPort (see GCBO)4 % eventdata reserved - to be defined in a future version of MATLAB5 % handles structure with handles and user data (see GUIDATA)6 %7global o_SerialPort;8 %______________________________________________9 %GUI全局变量101112 %---------------------串⼝初始化-----------------------13 %%%COM端⼝初始化14 int_Index_COM=get(handles.pop_SerialPort,'Value');15 string_COM=get(handles.pop_SerialPort,'String');16 string_Select_COM=string_COM{int_Index_COM};17 o_SerialPort=serial(string_Select_COM);18 %%%Baud初始化19 int_Index_Baud=get(handles.pop_BaudRate,'Value');20 string_Baud=get(handles.pop_BaudRate,'String');21 string_Select_Baud=string_Baud{int_Index_Baud};22 double_Baud=str2double(string_Select_Baud);23set(o_SerialPort,'BaudRate',double_Baud);24 %%%设置数据长度25 int_Index_DataBit=get(handles.pop_DataBit,'Value');26 string_DataBit=get(handles.pop_DataBit,'String');27 string_Select_DataBit=string_DataBit(int_Index_DataBit);28 double_DataBit=str2double(string_Select_DataBit);29set(o_SerialPort,'DataBits',double_DataBit);30 %%%设置停⽌位长度31 int_Index_StopBits=get(handles.pop_StopBits,'Value');32 string_StopBits=get(handles.pop_StopBits,'String');33 string_Select_StopBits=string_StopBits(int_Index_StopBits);34 double_StopBits=str2double(string_Select_StopBits);35set(o_SerialPort,'StopBits',double_StopBits);36 %%%设置输⼊缓冲区⼤⼩为1M37set(o_SerialPort,'InputBufferSize',1024000);38 %%%串⼝事件回调设置3940set(o_SerialPort,'BytesAvailableFcnMode','terminator');41set(o_SerialPort,'terminator','!'); %!标识结束符结束,⽅便处理和读取数据4243 o_SerialPort.BytesAvailableFcn={@EveBytesAvailableFcn,handles};44 % ----------------------打开串⼝-----------------------45 fopen(o_SerialPort);matlab串⼝我们采⽤回调函数,类似于中断⽅式哈,但是mtalb的串⼝⼗分的不好⽤哈,没有多线程,⽽我们在中断⾥⾯需要进⾏波形显⽰,四元素旋转等各种数据操作,是需要花费点时间的,这就导致我们的数据平率不能很⾼。
飞机惯性导航Matlab语言实现
%这是研究惯性导航的最好代码。
记得自己添加测试数据% 此为基于四元素法,角增量法的捷连惯导系统程序算法% > 飞行器飞行过程中飞行高度不变% > 航向角以逆时针为正% > 以地理系为导航坐标系% > 运行程序时需导入比力信息及陀螺议角速率信息clcclearclose allData = load('Data1.txt');f_INS = Data(:,2:4);% 加载加表数据wib_INS = Data(:,5:7);% 加载陀螺数据L0 = size(Data,1);Wie = 7.292115147e-5; %> 地球自传角速度Re = 6378245; %> 地球椭球长半径h = 30;% > 飞行高度e = 1/298.3;%> 初始经纬度Lamda(1) = 116.344695283*pi/180;% > 初始经度(弧度)L(1) = 39.975172*pi/180;% > 初始纬度(弧度)%> 初始姿态角Seita(1) = 0.120992605*pi/180; %> 俯仰角(弧度)Gama(1) = 0.010445947*pi/180; %> 横滚角(弧度)Ksai(1) = 91.637207*pi/180;% > 航向角(弧度)%> 初始速度Vx(1) = 0.000048637; %> x通道速度Vy(1) = 0.000206947;% > y通道速度Vz(1) = 0.007106781; %> z通道速度%> 重力加速度计算参数g0 = 9.7803267714;gk1 = 0.00193185138639;gk2 = 0.00669437999013;Vx = zeros(1,L0);Vy = zeros(1,L0);Vz = zeros(1,L0);Lamda = zeros(1,L0);L = zeros(1,L0);Seita = zeros(1,L0);Gama = zeros(1,L0);Ksai = zeros(1,L0); %> 四元素初始值e0 = cos(0.5*Ksai(1))*cos(0.5*Seita(1))*cos(i0.5*Gama(1))-sin(0.5*Ksai(1))*sin(0.5*Seita(1))*sin(0.5* Gama(1));e1 = -cos(0.5*Ksai(1))*sin(0.5*Seita(1))*cos(0.5*Gama(1))+sin(0.5*Ksai(1))*cos(0.5*Seita(1))*sin(0.5* Gama(1));e2 = -cos(0.5*Ksai(1))*cos(0.5*Seita(1))*sin(0.5*Gama(1))-sin(0.5*Ksai(1))*sin(0.5*Seita(1))*cos(0.5* Gama(1));e3 = cos(0.5*Ksai(1))*sin(0.5*Seita(1))*sin(0.5*Gama(1))+sin(0.5*Ksai(1))*cos(0.5*Seita(1))*cos(0.5* Gama(1));Ctb = [e0^2+e1^2-e2^2-e3^2 2*(e1*e2+e0*e3) 2*(e1*e3-e0*e2); %> 用四元素表示得姿态矩阵2*(e1*e2-e0*e3) e0^2-e1^2+e2^2-e3^2 2*(e2*e3+e0*e1);2*(e1*e3+e0*e2) 2*(e2*e3-e0*e1) e0^2-e1^2-e2^2+e3^2];E = [e0 e1 e2 e3]';%> 四元素的四个元素值for i = 1:L0f_INSc = f_INS(i,:)';wib_INSc = wib_INS(i,:)';Ry(i) = Re*(1-2*e+3*e*(sin(L(i)))^2);% > 计算子午圈主曲率半径Rx(i) = Re*(1+e*(sin(L(i)))^2); %> 计算卯酉圈主曲率半径g = g0*(1+gk1*(sin(L(i)))^2)*(1-2*h/Re)/sqrt(1-gk2*(sin(L(i)))^2);% > 重力加速度计算Cbt = Ctb';f_t = Cbt*f_INSc;% > 将体轴系中的比例转化到地理系Vx(i) = (f_t(1)+2*Wie*sin(L(i))*Vy(i)+Vx(i)*Vy(i)*tan(L(i))/Rx(i))/80+Vx(i);% > x通道速度计算Vy(i) = (f_t(2)-2*Wie*sin(L(i))*Vx(i)-Vx(i)*Vx(i)*tan(L(i))/Rx(i))/80+Vy(i);% > y通道速度计算Vz(i) = (f_t(3)+2*Wie*cos(L(i))*Vx(i)+Vx(i)*Vx(i)/Rx(i)+Vy(i)*Vy(i)/Ry(i)-g)/80+Vz(i);% > z通道速度计算Lamda(i) = Vx(i)/cos(L(i))/Rx(i)/80+Lamda(i);% > 经度计算if Lamda(i)>piLamda(i) = Lamda(i)-2*pi;% >经度在-180度(西经)到180(东经)范围endL(i) = Vy(i)/Ry(i)/80+L(i); %> 纬度计算if L(i)>(pi/2)L(i) = pi-L(i);% >纬度小于90度(北纬)endWetx_t(i) = -Vy(i)/Ry(i);Wety_t(i) = Vx(i)/Rx(i);Wetz_t(i) = Vx(i)*tan(L(i))/Rx(i);% > 在地理坐标系的位移角速率Wet_t = [Wetx_t(i) Wety_t(i) Wetz_t(i)]'; %> 在地理坐标系的位移角速率Wib_b = [wib_INSc(1) wib_INSc(2) wib_INSc(3)]';% > 陀螺仪测的角速率值Wie_t = [0 Wie*cos(L(i)) Wie*sin(L(i))]'; %> 在地理坐标系的地球角速率Wtb_b = Wib_b-Ctb*(Wie_t+Wet_t); %> 姿态矩阵角速率%> 用角增量法计算四元素姿态矩阵Mwtb = [0 -Wtb_b(1) -Wtb_b(2) -Wtb_b(3);Wtb_b(1) 0 Wtb_b(3) -Wtb_b(2);Wtb_b(2) -Wtb_b(3) 0 Wtb_b(1);Wtb_b(3) Wtb_b(2) -Wtb_b(1) 0]/80;derta = sqrt((Mwtb(1,2))^2+(Mwtb(1,3))^2+(Mwtb(1,4))^2);E = [eye(4)*(1-derta^2/8+derta^4/384)+(1/2-derta^2/48)*Mwtb]*E;% > E = (cos(0.5*derta)*eye(4)+Mwtb*sin(0.5*derta)/derta)*E,采用四阶近似算法e0 = E(1);e1 = E(2);e2 = E(3);e3 = E(4);Ctb = [e0^2+e1^2-e2^2-e3^2 2*(e1*e2+e0*e3) 2*(e1*e3-e0*e2);% > 用四元素表示得姿态矩阵2*(e1*e2-e0*e3) e0^2-e1^2+e2^2-e3^2 2*(e2*e3+e0*e1);2*(e1*e3+e0*e2) 2*(e2*e3-e0*e1) e0^2-e1^2-e2^2+e3^2];%> 姿态角计算Seita(i) = asin(Ctb(2,3)); %> 俯仰角计算Gama(i) = atan(-Ctb(1,3)/Ctb(3,3)); %> 横滚角计算if abs(Ctb(3,3))>epsGama(i) = atan(-Ctb(1,3)/Ctb(3,3));if Ctb(3,3)>0Gama(i) = Gama(i);elseif -Ctb(1,3)> 0Gama(i) = Gama(i)+pi;else Gama(i) = Gama(i)-pi;endelseif -Ctb(1,3)> 0Gama(i) = pi/2;else Gama(i) = -pi/2;endKsai(i) = atan(Ctb(2,1)/Ctb(2,2));% > 航向角计算if abs(Ctb(2,2))>epsKsai(i) = atan(Ctb(2,1)/Ctb(2,2));if Ctb(2,2)>0Ksai(i) = Ksai(i);elseif Ctb(2,1)> 0Ksai(i) = Ksai(i)+pi;else Ksai(i) = Ksai(i)-pi;endelseif Ctb(2,1)>0Ksai(i) = pi/2;else Ksai(i) = -pi/2;endend%> 将弧度换算为角度Seita = Seita*180/pi;Gama = Gama*180/pi;Ksai = Ksai*180/pi;L = L*180/pi;Lamda = Lamda*180/pi;t = 0.01:0.01:L0*0.01;%> 绘制曲线图figureplot(L,Lamda)% > 绘制经度变化曲线图grid onXlabel('经度');Ylabel('维度');title('经维度变化曲线图');figureplot(t,Seita)% > 绘制俯仰角变化曲线图grid onXlabel('时间/秒');Ylabel('俯仰角Seita/度');title('俯仰角变化曲线图');figureplot(t,Gama)% > 绘制横滚角变化曲线图grid onXlabel('时间/秒');Ylabel('横滚角Gama/度');title('横滚角变化曲线图'); figureplot(t,Ksai) %> 绘制航向角变化曲线grid onXlabel('时间/秒');Ylabel('航向角Ksai/度');title('航向角变化曲线图'); figureplot(t,Vx)% > 绘制东向速度变化曲线grid onXlabel('时间/秒');Ylabel('东向速度Vx 米/秒');title('东向速度变化曲线图'); figureplot(t,Vy)% > 绘制北向速度变化曲线grid onXlabel('时间/秒');Ylabel('北向速度Vy 米/秒');title('北向速度变化曲线图'); figureplot(t,Vz)% > 绘制垂直速度变化曲线grid onXlabel('时间/秒');Ylabel('垂直速度Vz 米/秒');title('垂直速度变化曲线图');。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
捷联惯导程序,依据加表和陀螺仪的输出数据来求解飞行器的姿态clc;clear;format long; %设置数据精度为15位小数Data=importdata(''); % 导入实验所采集的数据,以矩阵形式赋给Data变量,必须与该M文件在同一个文件夹中Px=Data(:,3); % Px,Py,Pz为陀螺仪的输出值Py=Data(:,4);Pz=Data(:,5);Nx=Data(:,6); % Nx,Ny,Nz为加速度计的输出值Ny=Data(:,7);Nz=Data(:,8);% 陀螺仪模型参数标定如下:Sx = ; Sy = ; Sz = ;Mxy = ; Mxz = ; Myx = ;Myz = ; Mzx = ; Mzy = ;Dx = ; Dy = ; Dz = ;GyroCali_A = [ 1 -Mxy -Mxz ; -Myx 1 -Myz ; -Mzx -Mzy 1 ];% 加速度计模型参数标定如下:Kx = ; Ky = ; Kz = ;Ixy = ; Ixz = ; Iyx = ;Iyz = ; Izx = ; Izy = ;Bx = ; By = ; Bz = ;AccCali_A = [1 -Ixy -Ixz ; -Iyx 1 -Iyz ; -Izx -Izy 1 ];Delta_t = ; %采样时间为秒Delta_Theta_x = 0;Delta_Theta_y = 0;Delta_Theta_z = 0; %定义陀螺仪输出的角度增量Delta_Vx = 0;Delta_Vy = 0;Delta_Vz = 0; %定义加速度计输出的速度增量L = zeros(1,12001);L(1)= *pi/180 ; %纬度用L表示,纬度的初始值划为弧度形式,因为后面计算位置矩阵更新L(2)= *pi/180 ; %时需要用到前两次的L值来计算当前L值,所以在此定义2个初始L值Lamda = *pi/180 ; %经度用Lamda表示,经度的初始值划为弧度形式h = 136 ; %高度用h表示V = [ 0 ; 0 ; 0 ]; %导航坐标系中的东北天初始速度都为0Vx = 0; %方便后面的速度计算与速度更新Vy = 0;Vz = 0;Theta = 0;Gama = 0;Fai = 0; %初始姿态角(俯仰角/倾斜角/航向角)都为0,此处均为弧度Re = 6378254 ; Rp = 6356803 ;%定义地球的半长轴与半短轴e = (Re - Rp)/Re ; %定义旋转椭球扁率(椭球度)Wie = 180*pi ; %定义地球自转角速度,地球坐标系相对于惯性坐标系的角速度Theta_Matrix = zeros(1,12000); %定义姿态角矩阵,供画图用Gama_Matrix = zeros(1,12000);Fai_Matrix = zeros(1,12000);L_Matrix = zeros(1,12001); %定义经纬度矩阵,供画图用,L的特殊性决定了其数据个数为12001L_Matrix(1) = ;Lamda_Matrix = zeros(1,12000);Ve_Matrix = zeros(1,12000); %定义速度矩阵,供画图用Vn_Matrix = zeros(1,12000);Vu_Matrix = zeros(1,12000);%以下计算捷联矩阵的初始值,捷联矩阵的初始值仅仅由Theta,Gama,Fai的初始值决定T = [ cos(Gama)*cos(Fai)-sin(Gama)*sin(Theta)*sin(Fai) -cos(Theta)*sin(Fai) sin(Gama)*cos(Fai)+cos(Gama)*sin(Theta)*sin(Fai) ;cos(Gama)*sin(Fai)+sin(Gama)*sin(Theta)*cos(Fai) cos(Theta)*cos(Fai) sin(Gama)*sin(Fai)-cos(Gama)*sin(Theta)*cos(Fai) ;-sin(Gama)*cos(Theta) sin(Theta) cos(Gama)*cos(Theta) ];%由捷联矩阵的初始值计算初始四元数值,为捷联矩阵的实时更新做准备if(T(3,2)-T(2,3)>0)Q1 = *sqrt(1+T(1,1)-T(2,2)-T(3,3));else if (T(3,2)-T(2,3)==0)Q1 = 0;else Q1 = *sqrt(1+T(1,1)-T(2,2)-T(3,3));end %求解Q1endif(T(1,3)-T(3,1)>0)Q2 = *sqrt(1-T(1,1)+T(2,2)-T(3,3));else if (T(1,3)-T(3,1)==0)Q2 = 0;else Q2 = *sqrt(1-T(1,1)+T(2,2)-T(3,3));end %求解Q2endif(T(2,1)-T(1,2)>0)Q3 = *sqrt(1-T(1,1)-T(2,2)+T(3,3));else if (T(2,1)-T(1,2)==0)Q3 = 0;else Q3 = *sqrt(1-T(1,1)-T(2,2)+T(3,3));end %求解Q3endQ0 = *sqrt(1-Q1*Q1-Q2*Q2-Q3*Q3); %求解Q0Q = [Q0 ; Q1 ; Q2 ; Q3]; %四元数初始值Q = Q / sqrt(Q0*Q0+Q1*Q1+Q2*Q2+Q3*Q3); %四元数的初始归一化,为得到最小漂移误差%以下求位置矩阵的初始值,通过位置矩阵更新后,反过来算运载体所在的经纬度%位置矩阵仅仅与经纬度有关系,Ce2n表示把地球坐标系转换为导航坐标系的转换矩阵Ce2n = [ -sin(Lamda) cos(Lamda) 0 ;-sin( L(1) )*cos(Lamda) -sin(L(1))*sin(Lamda) cos( L(1) );cos( L(1) )*cos(Lamda) cos( L(1) )*sin(Lamda) sin( L(1) ) ];%大循环,共执行12000次,实时更新捷联矩阵,速度矩阵,位置矩阵,保存作图所需数据for k = 1:12000;GyroCali_B = [Sx*Px(k)-Dx*Delta_t ; Sy*Py(k)-Dy*Delta_t ; Sz*Pz(k)-Dz*Delta_t ];Delta_Theta = GyroCali_A * GyroCali_B ; %计算陀螺仪输出的角度增量Delta_Theta_x = Delta_Theta(1);Delta_Theta_y = Delta_Theta(2);Delta_Theta_z = Delta_Theta(3);Delta_Theta_Module = sqrt( Delta_Theta_x * Delta_Theta_x + Delta_Theta_y * Delta_Theta_y + Delta_Theta_z * Delta_Theta_z );AccCali_B = [Kx*Nx(k)-Bx*Delta_t ; Ky*Ny(k)-By*Delta_t ; Kz*Nz(k)-Bz*Delta_t ];Delta_V = AccCali_A * AccCali_B ; %计算加速度计输出的速度增量Delta_Vx = Delta_V(1);Delta_Vy = Delta_V(2);Delta_Vz = Delta_V(3);Delta_V_Module = sqrt( Delta_Vx * Delta_Vx + Delta_Vy * Delta_Vy + Delta_Vz * Delta_Vz );%使用毕卡法求解四元数更新矩阵,即捷联矩阵Bika = zeros(4);Bika(1,1) = cos * Delta_Theta_Module);Bika(1,2) = -Delta_Theta_x / Delta_Theta_Module * sin * Delta_Theta_Module);Bika(1,3) = -Delta_Theta_y / Delta_Theta_Module * sin * Delta_Theta_Module);Bika(1,4) = -Delta_Theta_z / Delta_Theta_Module * sin * Delta_Theta_Module);Bika(2,1) = -Bika(1,2);Bika(2,2) = Bika(1,1);Bika(2,3) = -Bika(1,4);Bika(2,4) = Bika(1,3);Bika(3,1) = -Bika(1,3);Bika(3,2) = -Bika(2,3);Bika(3,3) = Bika(1,1);Bika(3,4) = -Bika(1,2);Bika(4,1) = -Bika(1,4);Bika(4,2) = -Bika(2,4);Bika(4,3) = -Bika(3,4);Bika(4,4) = Bika(1,1);Q = Bika * Q; % 每循环一次,更新一次四元素Q值,为求捷联矩阵Q = Q / sqrt(Q0*Q0+Q1*Q1+Q2*Q2+Q3*Q3); %四元数的归一化,为得到最小漂移误差Q0 = Q(1);Q1 = Q(2);Q2 = Q(3);Q3 = Q(4);%捷联矩阵的四元数表达式T = [ Q0*Q0+Q1*Q1-Q2*Q2-Q3*Q3 2*(Q1*Q2-Q0*Q3) 2*(Q1*Q3+Q0*Q2) 2*(Q1*Q2+Q0*Q3) Q0*Q0-Q1*Q1+Q2*Q2-Q3*Q3 2*(Q2*Q3-Q0*Q1)2*(Q1*Q3-Q0*Q2) 2*(Q2*Q3+Q0*Q1) Q0*Q0-Q1*Q1-Q2*Q2+Q3*Q3 ];%*********************************************************************%********************求三个姿态角Theta,Gama和Fai ********************%*********************************************************************Theta_Main = asin( T(3,2) );Gama_Main = atan( -T(3,1) / T(3,3));Fai_Main = atan( -T(1,2) / T(2,2));Theta = Theta_Main;if (T(3,3)>0)Gama = Gama_Main ;else if (T(3,3)<0 && Gama_Main > 0)Gama = Gama_Main + pi;else Gama = Gama_Main - pi; %此处用else实为不妥,不过为了程序的完善性,只能这样了endendif ( T(2,2)<0 )Fai = Fai_Main + pi ;else if (T(2,2)==0)Fai = pi/2;else if ( Fai_Main>0)Fai = Fai_Main;else Fai = Fai_Main + 2*pi ;endendend%以下存储姿态角到三个矩阵里面,为画图做准备Theta_Matrix(k) = Theta*180/pi; %作图用矩阵,以角度表示Gama_Matrix(k) = Gama*180/pi; %作图用矩阵,以角度表示if (Fai<2*pi)Fai_Matrix(k) = Fai*180/pi;else Fai_Matrix(k) = Fai*180/pi-360; %作图用矩阵,以角度表示end%到此为止,姿态角的求解完毕,以下先求速度%*********************************************************************%********************求飞行器相对于东北天的速度************************* %*********************************************************************Rm = Re*( 1-2*e+3*e*sin( L(k+1) )^2 );Rn = Re*( 1+e*sin(L(k+1))^2 );LL = 3/2*L(k+1) - 1/2*L(k) ;F = [ 0 -1/(Rm + h) 0 ; 1/(Rn + h) 0 0 ; tan( LL )/(Rn + h) 0 0];g = +*sin(L(k+1))^*h;G = [0;0;-g];Wen2n = F*V;Wie2n = [0 ; Wie*cos(L(k+1)); Wie*sin(L(k+1))];W = 2*Wie2n + Wen2n;W_X = [ 0 -W(3) W(2) ; W(3) 0 -W(1) ; -W(2) W(1) 0 ]; %此式中W_X为2*Wie+Wen2n 的反对称矩阵V = V + T*( Delta_V+ [ 0 -Delta_Theta_z Delta_Theta_y ; Delta_Theta_z 0 -Delta_Theta_x ; -Delta_Theta_y Delta_Theta_x 0 ]*Delta_V ) + Delta_t*(G-W_X*V);Vx = V(1);Vy = V(2);Vz = V(3);Ve_Matrix(k) = V(1);Vn_Matrix(k) = V(2);Vu_Matrix(k) = V(3);%*********************************************************************%********************求飞行器所在的经纬度******************************%*********************************************************************Epsilon = F*V*Delta_t;Ce2n =( eye(3) - [ 0 -Epsilon(3) Epsilon(2) ; Epsilon(3) 0 -Epsilon(1) ; -Epsilon(2) Epsilon(1) 0 ] )*Ce2n ; %位置矩阵实时更新%下面通过位置矩阵来实时更新经纬度L(k+2) = asin( Ce2n(3,3)); %由于L本来就是以矩阵形式定义的,下面定义一个把L用角度表示的矩阵L_Matrix(k+1) = L(k+2)*180/pi;Lamda_Main = atan( Ce2n(3,2)/Ce2n(3,1) ); %计算出来的L和Lamda都是弧度制的if (Ce2n(3,1)>0)Lamda = Lamda_Main;else if (Lamda_Main<0)Lamda = Lamda_Main + pi;else Lamda = Lamda_Main - pi;endendLamda_Matrix(k) = Lamda*180/pi; %作图用矩阵,以角度表示end%**************************************************************************%********************以下是画图程序*****************************************%**************************************************************************k=1:1:12000; %绘制三轴姿态变化图线-绿色figure(1);plot(k/20,Theta_Matrix(k),'g');xlabel('Time(second)');ylabel('Angle(degree)');title('Theta(俯仰角)');grid on;figure(2);plot(k/20,Gama_Matrix(k),'g');xlabel('Time(second)');ylabel('Angle(degree)');title('Gama(滚转角)');grid on;figure(3);plot(k/20,Fai_Matrix(k),'m');xlabel('Time(second)');ylabel('Angle(degree)');title('Fai(偏航角)');grid on;%绘制东北天个方向的速度变化曲线-红色figure(4);plot(k/20,Ve_Matrix(k),'r');xlabel('Time(second)');ylabel('Velocity(m/s)');title('Ve(东向速度)');grid on;figure(5);plot(k/20,Vn_Matrix(k),'r');xlabel('Time(second)');ylabel('Velocity(m/s)');title('Vn(北向速度)');grid on;figure(6);plot(k/20,Vu_Matrix(k),'r');xlabel('Time(second)');ylabel('Velocity(m/s)');title('Vu(天向速度)');grid on;%绘制飞行器所在经纬度曲线-蓝色figure(7);plot(k/20,L_Matrix(k),'b');xlabel('Time(second)');ylabel('Degree');title('Latitude L(纬度)');grid on;figure(8);plot(k/20,Lamda_Matrix(k),'b');xlabel('Time(second)');ylabel('Degree');title('Longitude Lamda(经度)');grid on;。