Skip to content
Snippets Groups Projects
Commit c964fbaa authored by davideperani's avatar davideperani
Browse files

Added functions to estimate parachute opening force

parent b30a4fcd
No related branches found
No related tags found
No related merge requests found
...@@ -63,7 +63,11 @@ A_dcm = (qs.^2 - pagemtimes(qq, 'transpose', qq, 'none')) .* eye(3) + ... ...@@ -63,7 +63,11 @@ A_dcm = (qs.^2 - pagemtimes(qq, 'transpose', qq, 'none')) .* eye(3) + ...
% A_dcm = repmat(eye(3), [1 1 10]); % A_dcm = repmat(eye(3), [1 1 10]);
animateOrientation(A_dcm, time_qq); % animateOrientation(A_dcm, time_qq);
%% Opening force estimation
function para = descentPost(main, desc, h0, name, S, M) function para = descentPost(main, desc, h0, name, S, M)
......
function FRF = computeForceReductionFactorFromBallisticParameter(A, n)
%%%%%%%%%%%%%% INFO %%%%%%%%%%%%%
% Function to compute the Force Reduction Factor from the ballistic
% parameter, equivalent to using the graph on fig. 5.51 of La Bibbia
%
% INPUT:
% A [1] Ballistic Parameter, must be between 0.01 and 1000, otherwise
% the function returns an error
% n [1] exponent of drag area vs time. Can be either 1, 2 or 1/2 (0.5)
% otherwise the function returns an error
%
% OUTPUT:
% FRF [1] = Force Reduction Factor
%
% CONTRIBUTORS:
% Tommaso Mauriello
%
% VERSION:
% 9 nov 2020, Fourth version
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A_min = 0.01;
A_max = 1000;
errorMessageOutOfBounds = ['The input Ballistic Parameter A (%d) is out of the graph',...
'bounds. It must be between 0.01 and 1000.'];
errorMessageWrongN = 'The requested n index (%d) is not valid. It must be 1, 2 or 0.5.';
if A < A_min || A > A_max
% if the input Ballistic Parameter A is out of the graph bounds
% then return error
error(errorMessageOutOfBounds, A);
else
switch n
case 1
% if evalin('caller', 'exist(''FRF_A_n_1_curve'',''var'')')
% % if the FRF_A_curve has already been created it's saved in
% % the workspace. We use it instead of computing it once again
% savedCurve = evalin('caller', 'FRF_A_n_1_curve');
%
% % we return the value of FRF
% FRF = savedCurve(A);
% else
% it's the first time that the FRF_PCF_curve is needed. We
% get it by interpolating the data obtained from the graph
% and then we save it in the workspace for further usage
% data obtained from La Bibbia fig. 5.51, curve for n = 1
A_data_n_1 = [0.01, 0.011270759, 0.012329285, 0.013357006, 0.014192211, ...
0.015189805, 0.016336641, 0.017274183, 0.018309839, 0.019407636, ...
0.020923608, 0.022285936, 0.023622127, 0.0250384, 0.02719134, ...
0.029601226, 0.033581491, 0.037729032, 0.040973288, 0.045148972, ...
0.047855955, 0.050848421, 0.054290733, 0.058106995, 0.062342461, ...
0.067867424, 0.072111222, 0.077180042, 0.082405255, 0.088626656, ...
0.096247268, 0.101032694, 0.109189228, 0.11714812, 0.123871122, ...
0.13225672, 0.140527185, 0.152981682, 0.162547111, 0.173973269, ...
0.191237662, 0.208692039, 0.225539798, 0.239643573, 0.257735764, ...
0.277194555, 0.298846433, 0.324543738, 0.347356469, 0.366400631, ...
0.387427465, 0.406689369, 0.436334405, 0.467003898, 0.502262865, ...
0.534965691, 0.576753004, 0.615797749, 0.647984231, 0.688504902, ...
0.766069417, 0.817932502, 0.866971916, 0.941521382, 1.015064333, ...
1.075924225, 1.154349222, 1.238492263, 1.32233511, 1.432554313, ...
1.590063152, 1.689484446, 1.852635856, 2.021711541, 2.233124572,...
2.401701751, 2.558062553, 2.737852125, 2.951681429, 3.159131874,...
3.405859244, 3.636394917, 3.882530119, 4.145330673, 4.404490468, ...
4.748461814, 5.020913071, 5.334819769, 5.751453094, 6.155661708, ...
6.524659739, 7.017166357, 7.528576382, 8.077226926, 8.58220292, ...
9.388057159, 10, 40, 1000]';
FRF_data_n_1 = [0.044144116, 0.046906657, 0.049002192, 0.05119117, ...
0.052704682, 0.054527041, 0.056824631, 0.058646726, 0.060234291, ...
0.062165769, 0.064785286, 0.066700777, 0.06883961, 0.070874854, ...
0.073861539, 0.077536487, 0.082789711, 0.087970619, 0.092123686, ...
0.097178101, 0.100294224, 0.103510357, 0.106829803, 0.110792127, ...
0.114623062, 0.11945341, 0.12328392, 0.127546683, 0.132598623, ...
0.137516949, 0.143311949, 0.147190898, 0.153765934, 0.159082803, ...
0.164183828, 0.169038355, 0.175307551, 0.184029901, 0.188553697, ...
0.196022204, 0.204283502, 0.21444772, 0.223484223, 0.231772675, ...
0.23978704, 0.249285296, 0.25916001, 0.271394878, 0.280778843, ...
0.289079578, 0.297625962, 0.304201871, 0.316251407, 0.325602491, ...
0.33932231, 0.350203649, 0.364960391, 0.37666421, 0.385921999, ...
0.400234849, 0.423221013, 0.438917934, 0.451894544, 0.473228353, ...
0.491973921, 0.507749605, 0.525306407, 0.544790521, 0.562261264, ...
0.583118056, 0.604753671, 0.619619637, 0.64104956, 0.66321952, ...
0.679531947, 0.694551811, 0.708180878, 0.722078615, 0.738039527, ...
0.750699572, 0.765433677, 0.776676208, 0.786174035, 0.797721197, ...
0.805518179, 0.815371487, 0.823339581, 0.833406626, 0.845650412, ...
0.85599244, 0.864358233, 0.874930543, 0.887782854, 0.894290683, ...
0.903031541, 0.911867156, 0.918549968, 0.98, 1]';
% we interpolate using 'pchipinterp' (Piecewise Cubic Hermite 7
% Interpolating Polynomial) since it looks better than 'smoothingspline'
interpolatedCurve = fit(A_data_n_1, FRF_data_n_1, 'pchipinterp');
% we save the curve object in the workspace for further usage
% assignin('caller', 'FRF_A_n_1_curve', interpolatedCurve);
% we return the value of FRF
FRF = interpolatedCurve(A);
% end
case 2
% if evalin('caller', 'exist(''FRF_A_n_2_curve'',''var'')')
% % if the FRF_A_curve has already been created it's saved in
% % the workspace. We use it instead of computing it once again
% savedCurve = evalin('caller', 'FRF_A_n_2_curve');
%
% % we return the value of FRF
% FRF = savedCurve(A);
% else
% it's the first time that the FRF_PCF_curve is needed. We
% get it by interpolating the data obtained from the graph
% and then we save it in the workspace for further usage
% data obtained from La Bibbia fig. 5.51, curve for n = 2
A_data_n_2 = [0.01, 0.011130674, 0.011898702, 0.012675246, 0.01352295, ...
0.014317013, 0.016825234, 0.017919619, 0.018925181, 0.020431782, ...
0.021758606, 0.023189558, 0.024864972, 0.026661561, 0.028701934, ...
0.030870314, 0.032968083, 0.035890116, 0.038134752, 0.040274559, ...
0.042325435, 0.045523046, 0.048176292, 0.05139804, 0.055043372, ...
0.059379339, 0.063284615, 0.068780331, 0.073871615, 0.080663463, ...
0.087017618, 0.092041134, 0.098242012, 0.104702883, 0.113294043, ...
0.125982261, 0.134675807, 0.142233154, 0.151587339, 0.161556716, ...
0.17428285, 0.185744833, 0.207804985, 0.223496266, 0.239156198, ...
0.257738975, 0.273027679, 0.289223286, 0.304866904, 0.322592066, ...
0.345899465, 0.368647493, 0.397687202, 0.429014475, 0.457227089, ...
0.487295783, 0.509975841, 0.545163809, 0.581014571, 0.631527836, ...
0.690658392, 0.751872947, 0.818510465, 0.885660179, 0.94964643, ...
1.018250614, 1.095124364, 1.181379986, 1.243880326, 1.308129232, ...
1.395597368, 1.476918875, 1.575666424, 1.66748056, 1.784415453, ...
1.901742972, 2.008430599, 2.146990295, 2.27431396, 2.458716584, ...
2.623107629, 2.881136272, 3.05199236, 3.232985657, 3.456004146, ...
3.660944989, 3.961246992, 4.296621994, 4.540330935, 4.809572293, ...
5.125758482, 5.4627398, 5.839562325, 6.284157152, 6.774908483, ...
7.220309412, 7.671685259, 8.102001474, 9.118993962, 10, 40, 1000]';
FRF_data_n_2 = [0.021215028, 0.022817684, 0.023880278, 0.025083749, ...
0.026332378, 0.027624349, 0.031212646, 0.032840164, 0.034369347, ...
0.036109668, 0.037874089, 0.039637801, 0.041609741, 0.044079027, ...
0.04678896, 0.049517293, 0.052084568, 0.055175765, 0.058096452, ...
0.060433984, 0.062622328, 0.066273927, 0.06957274, 0.072447286, ...
0.076108691, 0.080381293, 0.084636305, 0.090149118, 0.095268682, ...
0.101536986, 0.107237085, 0.112176231, 0.117813746, 0.123300069, ...
0.131014351, 0.141339797, 0.149273876, 0.156224728, 0.163996398, ...
0.172154683, 0.181268524, 0.190286041, 0.20841997, 0.220788667, ...
0.23246786, 0.24552724, 0.255406391, 0.265683044, 0.275554249, ...
0.288366128, 0.303631538, 0.317770981, 0.335610059, 0.354450589, ...
0.368713217, 0.384714792, 0.395366992, 0.412525739, 0.429125234, ...
0.451554776, 0.475767101, 0.504003677, 0.530687246, 0.550372581, ...
0.576003431, 0.597367818, 0.617649168, 0.64055959, 0.65431614, ...
0.666075733, 0.682460257, 0.69924583, 0.710671683, 0.728151136, ...
0.741048948, 0.756966815, 0.770882564, 0.789833968, 0.799490486, ...
0.809041718, 0.822261664, 0.834237756, 0.841879932, 0.852172763, ...
0.862594191, 0.867859994, 0.883821884, 0.891726323, 0.897369788, ...
0.902847883, 0.905610548, 0.91114089, 0.919490488, 0.928672786, ...
0.936424915, 0.942143432, 0.945025333, 0.947914031, 0.959523673, ...
0.968325926, 0.99, 1]';
% we interpolate using 'pchipinterp' (Piecewise Cubic Hermite 7
% Interpolating Polynomial) since it looks better than 'smoothingspline'
interpolatedCurve = fit(A_data_n_2, FRF_data_n_2, 'pchipinterp');
% we save the curve object in the workspace for further usage
% assignin('caller', 'FRF_A_n_2_curve', interpolatedCurve);
% we return the value of FRF
FRF = interpolatedCurve(A);
% end
case 0.5
% if evalin('caller', 'exist(''FRF_A_n_05_curve'',''var'')')
% % if the FRF_A_curve has already been created it's saved in
% % the workspace. We use it instead of computing it once again
% savedCurve = evalin('caller', 'FRF_A_n_05_curve');
%
% % we return the value of FRF
% FRF = savedCurve(A);
% else
% % it's the first time that the FRF_PCF_curve is needed. We
% % get it by interpolating the data obtained from the graph
% % and then we save it in the workspace for further usage
%
% % data obtained from La Bibbia fig. 5.51, curve for n = 0.5
A_data_n_05 = [0.01, 0.010951767, 0.011807143, 0.012667726, 0.013642837, ...
0.014555066, 0.015418268, 0.016502002, 0.017533817, 0.018949181, ...
0.020445024, 0.023860471, 0.026742116, 0.03093212, 0.033673281, ...
0.036607438, 0.042710446, 0.049044166, 0.054834313, 0.060275537, ...
0.067065536, 0.073008511, 0.076438598, 0.081549322, 0.088216597, ...
0.096501096, 0.106077197, 0.117170728, 0.129110057, 0.151161957, ...
0.164857254, 0.197874321, 0.221771738, 0.25098006, 0.271240009, ...
0.293135035, 0.333268233, 0.352687785, 0.390289253, 0.410688345, ...
0.444917743, 0.480833604, 0.502293675, 0.531117042, 0.576780275, ...
0.623338313, 0.66714956, 0.703723996, 0.762376863, 0.806123682, ...
0.877557878, 0.959973789, 1.094717055, 1.176960702, 1.268889132, ...
1.36136906, 1.511047244, 1.689436949, 1.92589631, 2.127292535, ...
2.293439385, 2.498550763, 2.791413604, 3.220934983, 3.653961014, ...
4.236701475, 4.545477448, 5.106789707, 5.599903094, 6.081351691, ...
6.636298543, 7.189373432, 7.826425701, 8.458146888, 9.140834995, ...
10, 20, 1000]';
FRF_data_n_05 = [0.095955515, 0.09927411, 0.101962065, 0.104722621, ...
0.106787857, 0.109414688, 0.111279201, 0.114569561, 0.117385893, ...
0.120564347, 0.12355117, 0.13062536, 0.135472456, 0.142561339, ...
0.147491532, 0.151286924, 0.159800009, 0.167753932, 0.175249612, ...
0.180871495, 0.18895298, 0.19406975, 0.197649803, 0.20087945, ...
0.206219738, 0.212834757, 0.220730881, 0.22947645, 0.235691582, ...
0.249837661, 0.258223827, 0.275995725, 0.286237058, 0.300482752, ...
0.309368634, 0.317745399, 0.329262665, 0.337361104, 0.348469752, ...
0.356169335, 0.365813632, 0.377546421, 0.381234312, 0.389658505, ...
0.399240095, 0.409056595, 0.418097362, 0.42733576, 0.438907091, ...
0.447518543, 0.459637163, 0.477846798, 0.505823651, 0.52023635, ...
0.536921502, 0.547458816, 0.565022831, 0.587412078, 0.61069267, ...
0.627233185, 0.642655024, 0.66085731, 0.682891018, 0.709958701, ...
0.730966068, 0.758098961, 0.771103755, 0.793917673, 0.809504854, ...
0.82740036, 0.843643478, 0.858118668, 0.874964086, 0.889975916, ...
0.900863101, 0.91855075, 0.98, 1]';
% we interpolate using 'pchipinterp' (Piecewise Cubic Hermite 7
% Interpolating Polynomial) since it looks better than 'smoothingspline'
interpolatedCurve = fit(A_data_n_05, FRF_data_n_05, 'pchipinterp');
% we save the curve object in the workspace for further usage
% assignin('caller', 'FRF_A_n_05_curve', interpolatedCurve);
% we return the value of FRF
FRF = interpolatedCurve(A);
% end
otherwise
% if n is different from 1, 2 and 0.5 then return error
error(errorMessageWrongN, n);
end
end
end
function FRF = computeForceReductionFactorFromCanopyLoading(PCL)
%%%%%%%%%%%%%% INFO %%%%%%%%%%%%%
% Function to compute the Force Reduction Factor from the Canopy
% Loading, equivalent to using the graph on fig. 5.48 of La Bibbia
% INPUT:
% PCL [1] = Parachute Canopy Loading, must be between 0 and 100
% otherwise the function returns an error
%
% OUTPUT:
% FRF [1] = Force Reduction Factor
%
% CONTRIBUTORS:
% Tommaso Mauriello
%
% VERSION:
% 9 nov 2020, Fourth version
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PCL_min = 0;
PCL_max = 100;
errorMessageOutOfBounds = ['The input Parachute Canopy Loading PCL (%d) is out of'...
'the graph bounds. It must be between 0 and 100.'];
if PCL < PCL_min || PCL > PCL_max
%if the input Canopy Loading PCF is out of the graph bounds then returns error
%formattedError = sprintf(errorMessageOutOfBounds, PCL);
error(errorMessageOutOfBounds, PCL);
else
if evalin('caller', 'exist(''FRF_PCL_curve'', ''var'')')
% if the FRF_PCF_curve has already been created it's saved in
% the workspace. We use it instead of computing it once again
savedCurve = evalin('caller', 'FRF_PCL_curve');
FRF = savedCurve(PCL);
else
% it's the first time that the FRF_PCF_curve is needed. We
% get it by interpolating the data obtained from the graph
% and then we save it in the workspace for further usage
%data obtained from La Bibbia fig. 5.48
PCL_data = [0, 0.2, 0.315238664, 0.353618869, 0.396643869, 0.469187078, 0.518862451, ...
0.55955745, 0.618800824, 0.667294804, 0.719589146, 0.775981673, 0.858088507, ...
0.927411952, 0.99163793, 1.075987155, 1.164534389, 1.251414299, 1.349138417, ...
1.454781569, 1.568697018, 1.711207738, 1.90463473, 2.01757444, 2.240172577, ...
2.518493085, 2.728899831, 3.01197155, 3.258187307, 3.504498865, 3.87060744, ...
4.358457656, 4.675440475, 4.965487707, 5.38024354, 6.731032391, 7.428725575, ...
8.295048363, 9.370986014, 10.84382219, 12.10145674, 13.25453732, 14.18324569, ...
15.39337664, 17.13135833, 18.7805021, 20.86587709, 23.60741993, 26.81084133, ...
31.11332399, 33.70945518, 38.14698112, 44.21401955, 56.83565422, 64.70349943, ...
69.52742428, 74.70418146, 80.68133451, 87.13535882, 93.48211331, 100]';
FRF_data = [0.020092574, 0.020092574, 0.020902911, 0.021456589, 0.026215821, ...
0.032543213, 0.039641814, 0.043210055, 0.050308656, 0.057388317, 0.064467978, ...
0.071547639, 0.082157661, 0.089471295, 0.097465569, 0.106908065, 0.115810715, ...
0.126145192, 0.13516989, 0.145760971, 0.156352053, 0.170305721, 0.185806806, ...
0.19533046, 0.212097039, 0.230409394, 0.246824866, 0.262786929, 0.278266572, ...
0.290392115, 0.309704495, 0.332690949, 0.34722972, 0.358957219, 0.37630726, ...
0.422270079, 0.442437695, 0.466352411, 0.495416078, 0.526509595, 0.550748537, ...
0.572309583, 0.587316492, 0.606069645, 0.628579987, 0.649209843, 0.671718923, ...
0.699156344, 0.726113031, 0.759058834, 0.775350621, 0.802546413, 0.833063827, ...
0.878901694, 0.902476415, 0.915614595, 0.927300202, 0.939512313, 0.952659353, ...
0.96206163, 0.968656595]';
% we interpolate using 'pchipinterp' (Piecewise Cubic Hermite 7
% Interpolating Polynomial) since it looks better than 'smoothingspline'
interpolatedCurve = fit(PCL_data, FRF_data, 'pchipinterp');
% we save the curve object in the workspace for further usage
assignin('caller', 'FRF_PCL_curve', interpolatedCurve);
FRF = interpolatedCurve(PCL);
end
end
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment