Safety Fans GUI Content

Safety Fans GUI Home

This project dealt with the development of mathematical foundation and practical algorithms to compute the safety fans to be used in conjunction with the aerodynamic decelerators tests. It started from the development of the mathematical models to compute a descent / gliding trajectory for a generic multi-stage system in the nominal (controlled) configuration and with a series of different failure modes (of canopy and controls).

Within this project the concept of the ballistic winds was introduced and mathematically verified in multiple simulations. These ballistic winds simplify calculation of the safety fans to the degree which the computer might not be needed at all. They can be calculated based on the best known winds aloft (measured or predicted).

The graphical user interface (GUI) was developed as a standalone Windows-friendly application and then fully tested using the YPG wind profiles and aerial delivery system database. This GUI provides test planning officers with a unique variety of trade-off options, as well as allows effective representation of all safety-related information both to the ground personal and crew executing a payload delivery from a transport aircraft or helicopter. Figure A presents a screenshot of the developed GUI, which performs various computations and manipulations (factual data is replaced with fake data). This GUI was developed in the MATLAB development environment using the Open GUI Layout Editor GUIDE. The GUI itself is subdivided into several panels.

Fan GUI image

                                                      Figure A. Safety fans GUI.

The Winds panel allows the user to browse for the wind files and chose the most appropriate one. The wind source files are the sounding, Windpack, balloon and JAAWIN winds. The GUI automatically recognizes what type of file was chosen and reads it in. Wind data is then loaded into the appropriate winds matrix. Auxiliary data such as the name and type of the file, when and where the winds data were taken, and altitude range are also read and displayed in the corresponding fields.

The Drop Zone panel allows the user to choose one of the drop zones stored in an ASCII file. The script behind this panel loads latitude, longitude and mean-sea-level altitude of a chosen drop zone. The corresponding map appears on the left. By default the center of the chosen DZ becomes an intended point of impact (IPI). It can be changed by selecting a new point on the map or typing new geodectic coordinates.

The map uses the Universal Transverse Mercator (UTM) coordinates. The user can zoom the map in and out, move it, measure distances between selected points, get the coordinates of any point selected with the cursor, and displays them in one of the chosen formats (UTM on the map, or Lat/Lon in the corresponding fields).

The Test System panel allows the user to choose one of the ADSs stored in an Excel file. This system can have one, two, or three stages. The corresponding windows for unused stages are shadowed. The only ADS data needed for safety fan computation are the system’s descent rate, glide ratio and altitude to deploy. The user is allowed to change any of these three parameters in the corresponding fields or create an entirely new system.

The idea behind the Release Point panel is that based on the system being tested and available winds data, the user enters various release points and computes the safety fans. If safety requirements are not met, the user moves the release point causing a new safety fan generated. The release point can be moved by clicking on a new location in the map, in which case the new coordinates immediately appear in the corresponding panel fields, or by entering a new latitude and longitude in the panel fields. Altitude, airspeed, and direction at the release point are also provided by the user. When a satisfactory release point is found, its coordinates are provided to the crew for execution.

Since the ground crew and the deployment crew may in general speak different technical languages (units), the Units panel allows the user to change units from the International System of Units (SI) to English and back. In addition, Lat/Lon coordinates can be visualized throughout all panels in one of the following three formats:

Deg – degrees.decimal degrees
DM – degrees, minutes.decimal minutes
DMS – degrees, minutes, seconds.decimal seconds

When using the DM or Deg formats, the unused fields are shadowed (like the Stage 3 fields in Fig.A).

Other operational functions of the GUI include timing, fan computation, loading data, saving data, and commenting. The Start Clock button asks the user for the computer’s time zone setting and starts a clock using Coordinated Universal Time (UTC). When all necessary data for the fan computation is selected/entered, the user can compute the current safety fan. Corresponding graphics appear on the map. The time of the most recent calculation appears under the running clock. The GUI can be saved with the Save Data button. Once the GUI has been saved, it can be loaded with the Load Data button. When reloaded, the GUI is still interactive. This means that while it can still be used as a simple figure capturing one state in time, it can also be used as the starting point for follow-on operations. If using a loaded GUI the clock must be restarted. The user can enter his comments in the Comments panel. These comments are saved with the GUI. The Stop GUI button stops all activity within the GUI and is used just prior to closing the application.

 

Downloads

Downloads

You are welcome to download and use the following MATLAB scripts that are used in the Safety Fans GUI (when downloaded change their extension to .m):

% Note, the output of BalloonWinds file is a matrix Winds, where:
%               the  first column contains altitude AGL in ft
%               the second column contains wind direction in deg
%               the  third column contains wind speed in kn
% Also, the outputs are the numerical values of lat, lon in deg
%                   and Ltime, Ldate - when the measurments were taken as char

%% Reading heading information
lat= textread(FileName,'Latitude:  %f',1,'headerlines',3);
lon= textread(FileName,'Longitude: %f',1,'headerlines',4);
[Ltime,Ldate]=...
    textread(FileName,'Launch Time: %s UTC Sounding Started on: %s',1,...
                                              'headerlines',10);
Ltime=char(Ltime); Ldate=char(Ldate);
file = textread(FileName, '%s', 'delimiter', '\n');

%% Reading numerical data
N=length(file);
i=17;
Winds=[0 0 0];
while i <= N
H=textread(FileName,'%c',1,'headerlines',i);
if H=='-'
    i=i+5;
    continue
end
[q,w,e,r,t,y,u,o]=...
       textread(FileName,'%f %f %f %f %f %f %f %f',1,'headerlines',i);
Winds=vertcat(Winds,[q u o]); % the format is altitude, Wdir, Wspeed
i=i+1;
end
Winds(1,:)=[]; Winds(:,1)=Winds(:,1)-Winds(1,1);
clear q w e r t y u o H i N file
% Note, the output of SoundingWinds file is a matrix Winds, where:
%               the  first column contains altitude AGL in ft
%               the second column contains wind direction in deg
%               the  third column contains wind speed in kn
% Also, the outputs are the numerical values of lat, lon in deg
%                   and Ltime, Ldate - when the measurments were taken as char

%% Reading heading information
[Y,M,D,H,f1,f2,f3,lat,lon]=...
       textread(FileName,'%4c-%2c-%2c_%2c %s i,j=( %f , %f ),lat,long=( %f , %f',...
       1,'headerlines',2);
Ldate=[M '/' D '/' Y];, Ltime=[H ':00'];
file = textread(FileName, '%s', 'delimiter', '\n');

%% Reading numerical data
N=length(file);
i=6;
Winds=[0 0 0];
while i <= N
[q,w,e,r,t,y,u]=...
       textread(FileName,'%f %f %f %f %f %f %f',1,'headerlines',i);
Winds=vertcat(Winds,[w y t]); % the format is altitude, Wdir, Wspeed
i=i+1;
end
Winds(1,:)=[];
clear q w e r t y u H i N file

%% Conversion to English units
Winds(:,1)=Winds(:,1)*3.2808; % converting altitude to ft to make outputs the same
Winds(:,3)=Winds(:,3)/0.514;  % converting Wspeed to kn to make outputs the same
% Note, the output of JAAWINWinds file is a matrix Winds, where:
%               the  first column contains altitude AGL in ft
%               the second column contains wind direction in deg
%               the  third column contains wind speed in kn
% Also, the outputs are the numerical values of lat, lon in deg
%                   and Ltime, Ldate - when the measurments were taken as char

%% Reading numerical data
[lat,lon]=textread(FileName,...
    'Forecast Model Grid Pt:  Latitude-> %f N  Longitude-> %f',1,'headerlines',4);
[f1,f2,f3,f4]=textread(FileName,...
    'Valid Time: %f Z %f %s %f',1,'headerlines',2);
Ltime=[num2str(fix(f1/100)) ':' num2str(f1-fix(f1/100)*100,'%02.0f')];
Ldate=datevec([char(f3) num2str(f2) ',' num2str(f4)]);
Ldate=[num2str(Ldate(2),'%02.0f') '/' num2str(Ldate(3),'%02.0f') '/' num2str(Ldate(1))];
file = textread(FileName, '%s', 'delimiter', '\n');

%% Reading numerical data
N=length(file);
i=19;
Winds=[0 0 0];
while i <= N
[q,w,e,r]=...
       textread(FileName,'%f ( %f ) %f %f',1,'headerlines',i);
Winds=vertcat(Winds,[q e r]); % the format is altitude, Wdir, Wspeed
i=i+1;
end
[w,e,r]=...
       textread(FileName,'SFC( %f ) %f %f',1,'headerlines',18);
Winds(1,2:3)=[e r];
clear q w e r t y u o H i N file f1 f2 f3 f4

%% Conversion to English units
Winds(:,1)=Winds(:,1)*1000;   % converting altitude to ft to make outputs the same
function [Lat,Lon]=utm2wgs(xx,yy,utmzone)
% This function converts the vectors of UTM coordinates into Lat/Lon vectors.
% Inputs:
%    x       - UTM easting in meters
%    y       - UTM northing in meters
%    utmzone - UTM longitudinal zone
% Outputs:
%    Lat (WGS84 Latitude vector)  in decimal degrees:  ddd.dddddddd
%    Lon (WGS84 Longitude vector) in decimal degrees:  ddd.dddddddd
%
% Example:
%     x=[ 458731;  407653;  239027;  362850];
%     y=[4462881; 3171843; 4302285; 2772478];
%     utmzone=['30T'; '32T'; '01S'; '51R'];
%    [Lat,Lon]=utm2wgs(x,y,utmzone);
%       returns
% Lat =
%    40.3154
%    28.6705
%    38.8307
%    25.0618
% Lon =
%    -3.4857
%     8.0549
%  -180.0064
%   121.6403
%
% Source: DMA Technical Manual 8358.2, Fairfax, VA

%% Argument checking
error(nargchk(3,3,nargin));         % 3 arguments are required
n1=length(xx);
n2=length(yy);
n3=size(utmzone,1);
if (n1~=n2 || n1~=n3)
   error('x, y and utmzone vectors should have the same number or rows');
end
c=size(utmzone,2);
if (c~=3)
   error('utmzone should be a vector of strings like "30T"');
end

%% Computing Lat/Lon coordinates for each input
for i=1:n1
      if (utmzone(i,end)>'X' || utmzone(i,end)<'C')
      fprintf('utm2wgs: Warning you cannot use lowercase letters in UTM zone\n');
      end
   if (utmzone(i,end)>'M')
   hemis='N';    % Northern hemisphere
   else
   hemis='S';    % Southern hemisphere
   end

   x=xx(i);
   y=yy(i);
   zone=str2double(utmzone(i,1:2));
sa = 6378137.000000;                % semi-major axis of the Earth ellipsoid
sb = 6356752.314245;                % semi-minor axis of the Earth ellipsoid
   e=(((sa^2)-(sb^2))^0.5)/sb;      % squared second eccentricity
   e2= e^2;
   c=sa^2/sb;
 X = x - 500000;
    if hemis=='S' || hemis=='s'
    Y=y-10000000;
    else
    Y=y;
    end

S=((zone*6)-183);
lat=Y/(6366197.724*0.9996);
v=(c/((1+(e2*(cos(lat))^2)))^0.5)*0.9996;
a=X/v;
a1=sin(2*lat);
a2=a1*(cos(lat))^2;
j2=lat+(a1/2);
j4=((3*j2)+a2)/4;
j6=((5*j4)+(a2*(cos(lat))^2))/3;
alpha=(3/4)*e2;
beta=(5/3)*alpha^2;
gamma=(35/27)*alpha^3;
Bm=0.9996*c*(lat-alpha*j2+beta*j4-gamma*j6);
b=(Y-Bm)/v;
Epsi=((e2*a^2)/2)*(cos(lat))^2;
Eps=a*(1-(Epsi/3));
nab=(b*(1-Epsi))+lat;
senoheps=(exp(Eps)-exp(-Eps))/2;
Delta=atan(senoheps/(cos(nab)));
TaO=atan(cos(Delta)*tan(nab));
longitude=(Delta*(180/pi))+S;
latitude=(lat+(1+e2*(cos(lat)^2)-(3/2)*e2*sin(lat)*...
          cos(lat)*(TaO-lat))*(TaO-lat))*(180/pi);
Lat(i)=latitude;
Lon(i)=longitude;
end                 % For-loop end
Lat=Lat';
Lon=Lon';
function  [x,y,utmzone] = wgs2utm(Lat,Lon)
% This function converts the vectors of Lat/Lon coordinates to those of UTM.
% Inputs:
%    Lat (WGS84 Latitude vector)  in decimal degrees
%    Lon (WGS84 Longitude vector) in decimal degrees
% Outputs:
%    x       - UTM easting in meters
%    y       - UTM northing in meters
%    utmzone - UTM longitudinal zone
%
% Example:
%    Lat=[48.866667; 34.05;   -36.85];
%    Lon=[2.333056;  -118.25; 174.783333];
%    [x,y,utmzone]=wgs2utm(Lat,Lon)
%       returns
% x =
%   1.0e+005 *
%     4.5109
%     3.8463
%     3.0237
% y =
%   1.0e+006 *
%     5.4128
%     3.7684
%     5.9195
% utmzone =
% 31U
% 11S
% 60H
%
% Source: DMA Technical Manual 8358.2, Fairfax, VA

%% Argument checking
error(nargchk(2,2,nargin));         % 2 arguments are required
n1=size(Lat);
n2=size(Lon);
if (n1~=n2)
   error('Lat and Lon should have same size'); return
end

%% Converting coordinates to radians
lat = Lat*pi/180;
lon = Lon*pi/180;

%% WGS84 parameters
a = 6378137;            % semi-major axis of the Earth ellipsoid
b = 6356752.314245;     % semi-minor axis of the Earth ellipsoid
e = sqrt(1-(b/a)^2);    % first eccentricity

%% UTM parameters
Lon0 = floor(Lon/6)*6+3;    % reference longitude in degrees
lon0 = Lon0.*pi/180;        % reference longitude in radians
k0 = 0.9996;                % scale on central meridian

FE = 500000;                % false easting
FN = (Lat < 0).*10000000;   % false northing

%% Equations parameters
eps = e^2/(1-e^2);          % squared second eccentricity
% N is the radius of curvature of the earth perpendicular to meridian plane
% Also, distance from a point to polar axis
N = a./sqrt(1-e^2*sin(lat).^2);
T = tan(lat).^2;
C = eps*(cos(lat)).^2;
A = (lon-lon0).*cos(lat);
% M: true distance along the central meridian from the equator to lat
M = a*(  (1 - e^2/4 - 3*e^4/64 - 5*e^6/256)* lat         ...
        -(3*e^2/8 + 3*e^4/32 + 45*e^6/1024)* sin(2*lat) ...
        +(15*e^4/256 + 45*e^6/1024)        * sin(4*lat) ...
        -(35*e^6/3072 )                    * sin(6*lat));

%% Computing easting
x = FE + k0*N.*(                             A      ...
               +(1-T+C)                   .* A.^3/6 ...
               +(5-18*T+T.^2+72*C-58*eps) .* A.^5/120);

%% Computing northing
y = FN + k0*M + k0*N.*tan(lat).*(                                 A.^2/2  ...
                                 +(5-T+9*C+4*C.^2)             .* A.^4/24 ...
                                 +(61-58*T+T.^2+600*C-330*eps) .* A.^6/720);

%% Determining the UTM zone
lonzone = floor(Lon0./6)+31;
latband = floor((Lat+80)./8)+1;
LB='CDEFGHJKLMNPQRSTUVWX';
latband=LB(latband)';
utmzone = [num2str(lonzone,'%02g') latband];