Разработка системы отображения информации с элементами виртуальной реальности для выполнения посадки неманевренного самолета, страница 31

  ssSetOptions( S, 0);

}

//=====================================================

//Установка временных харастерисик блока S-function

static void mdlInitializeSampleTimes(SimStruct *S)

{

  ssSetSampleTime(S, 0, DISCRETE_STEP);

  ssSetOffsetTime(S, 0, 0.0);

}

//=====================================================

//Функция, которая выполняется при запуске имитационного моделирования

static void mdlStart(SimStruct *S)

{ StartTime=clock();

}

//=====================================================

//Вычисление выхода блока S-function

static void mdlOutputs(SimStruct *S, int_T tid)

{ const mxArray *para = (const mxArray *) SYNCHR_R_PARAM(S);

  double *N= mxGetPr(para);

  clock_t NowTime;

  DWORD diff_M_PC;

  real_T InTime=(real_T)ssGetT(S); //Имитационное время модели

  long Tr_Hold = 1000*DISCRETE_STEP/N[0];

  NowTime=clock();

  diff_M_PC=NowTime-StartTime;

  if ((diff_M_PC>=0) && (diff_M_PC<Tr_Hold))

     Sleep(Tr_Hold-diff_M_PC);

  StartTime=clock();

}

//=====================================================

static void mdlTerminate(SimStruct *S)

{}

//=====================================================

#ifdef  MATLAB_MEX_FILE

#include "simulink.c"  

#else

#include "cg_sfun.h"

#endif

30.  Приложение 3

30.1  Вычисление координат прямоугольников для прямолинейной траектории посадки

z=0:10:400

y=-0.049*z+50

30.2  Вычисление координат прямоугольников для посадки с радиусом разворота 20000м

fi=0:0.005:pi/2;

x=2000*cos(fi);

y=31.2102*(fi)+1

z=sqrt(2000.^2-x.^2)-2000

x=x*(-1)+2000

fi=57.3*(fi)

30.3  Вычисление координат прямоугольников для посадки с радиусом разворота 20000м

fi=0:0.005:pi/2;

z=1000*cos(fi);

y=-0.049*z+50

x=-sqrt(1000.^2-z.^2)+1000

z=z*(1)-1000

31.  Приложение 4

31.1  Программа расчета дисперсии ошибки для прямолинейной траектории захода на посадку.

for i=1:5

link='C:\fly\';

link_2='Fly_line_200_75';

object='\traekt_';

type='_p3';

object_ip=['1' '2' '3' '4' '5'];

load([link link_2 object object_ip(i) ]);

x=0;

y=0.049*koord(4,:)+50;

z=koord(4,:);

l=koord(4,:)+1000;

otkly=koord(3,:)-(y+0.375)

otklx=koord(2,:)-x

otklz=koord(4,:)-(z)

otkleps=sqrt(otklx.^2+otklz.^2)

l_massiv=0:0.5:200;

otkl_massiv(:,:,i)=[l_massiv;interp1(l,otkleps,l_massiv);interp1(l,otkly,l_massiv)];

end

[n m r]=size(otkl_massiv);

for i=1:n

    for j=1:m

        mat_oszid(i,j)=sum(abs(otkl_massiv(i,j,:)))/r;

        disp(i,j)=(1/4).*sum((otkl_massiv(i,j,:)-mat_oszid(i,j)).^2);    

    end

end

figure(1)

subplot(4,1,1)

plot(mat_oszid(1,:),mat_oszid(2,:),'b'),YLABEL('Мат. ожид. бок. ошибки '),hold on, grid on

subplot(4,1,2)

plot(mat_oszid(1,:),mat_oszid(3,:),'b'),YLABEL('Мат. ожид. ошибки по H'),hold on, grid on

subplot(4,1,3)

plot(mat_oszid(1,:),disp(2,:),'b'),YLABEL('Дисп. бок. ошибки'),hold on, grid on

subplot(4,1,4)

plot(mat_oszid(1,:),disp(3,:),'b'),YLABEL('Дисп. ошибки по H'),hold on, grid on

mat_eps_max=max(mat_oszid(2,1:240));

mat_y_max=max(mat_oszid(3,1:240));

mat_mid_eps=sum(mat_oszid(2,1:240))/240;

mat_mid_y=sum(mat_oszid(3,1:400))/240;

disp_eps_max=max(disp(2,1:240));

disp_y_max=max(disp(3,1:240));

disp_mid_eps=sum(disp(2,1:240))/240;;

disp_mid_y=sum(disp(3,1:240))/240;

save([link link_2 '.mat'],'mat_oszid','disp','mat_eps_max','mat_y_max','mat_mid_eps',...

    'mat_mid_y','disp_eps_max','disp_y_max','disp_mid_eps','disp_mid_y');

31.2  Программа расчета дисперсии ошибки для захода на посадкус радиусом разворота 20000 м

for i=1:5

link='C:\fly\';

link_2='Fly_curve_20_200_75';

object='\traekt_';

type='_p3';

object_ip=['1' '2' '3' '4' '5'];

load([link link_2 object object_ip(i) type]);

Rtek=sqrt((koord(2,:)-2000).^2+(koord(4,:)+2000).^2); %x^2+z^2=R*^2

Ltek=-2000-koord(4,:);

fi=-asin(Ltek./Rtek);

x=2000*cos(fi);

y=31.2102*(fi)+1;

z=sqrt(2000.^2-x.^2)-2000;

x=x*(-1)+2000;