Contents
Low Energy Mission
Earth to moon transfer ------------------------------------------------------------------------ See also: LagrangePointsL1ToL5, PlanetPositionEMBarycenter, LowEnergyTransferInCRTBP, PlotLET3BP, Targeting3BP2, Targeting4BP, PlotLET, PlotLET3BP, MinE4BP ------------------------------------------------------------------------
%-------------------------------------------------------------------------- % Copyright (c) 2018 Princeton Satellite Systems, Inc. % All rights reserved. %-------------------------------------------------------------------------- % Since 2018.1 %--------------------------------------------------------------------------
Problem definition and setup
jDate = JD2000+1; r0 = 7500; % km planet = 'Earth'; moon = 'Moon'; saveFiles = false; tRun = tic; % Get body parameters %-------------------- muPlanet = Constant(['mu ',planet]); muMoon = Constant(['mu ',moon ]); muSun = Constant( 'mu Sun' ); muCRTBP = (muMoon + muPlanet) / (muMoon + muPlanet + muSun); p = LagrangePointsL1ToL5( muMoon/(muPlanet + muMoon) ); p = [-p(:,1) + [muMoon/(muPlanet + muMoon)-1 ;0];0];
Determine orientation
%---------------------- PlanetPositionEMBarycenter('initialize',[0,3,10]) [r,v] = PlanetPositionEMBarycenter('update',jDate); sunState = [r(:,1);v(:,1)]; planetState = [r(:,2);v(:,2)]; moonState = [r(:,3);v(:,3)] + planetState-sunState; elements = RV2El(sunState(1:3),sunState(4:6),muSun); moonStateRotated = J20002RotPuls(moonState,sunState,muSun); distanceUnit = elements(1); relStatePM = moonState - planetState; elementsPM = RV2El(relStatePM(1:3),relStatePM(4:6),muPlanet+muMoon); p = Mag(p * elementsPM(1)); if moonStateRotated(1) < 0 orientation = ''; else orientation = 'p'; end
Get LET in CRTBP
%----------------- tic h = waitbar(0,'LET Status: Solving for Low Energy Transfer in CRTBP \newline Step 1/5 : Approximately 6 min remaining'); scaleFactor = muPlanet/(muMoon+muPlanet); LET = LowEnergyTransferInCRTBP(r0/scaleFactor/distanceUnit,(Mag(moonState(1:3)-planetState(1:3)))/distanceUnit,muCRTBP,orientation); family = LET.family; fprintf('Using family %s\n',family); toc
Beginning optimization in PeriodicOrbitFromGuess Max Line search Directional First-order Iter F-count f(x) constraint steplength derivative optimality Procedure 0 3 0 5.373e-07 Infeasible start point 1 6 0 1.76e-09 1 0 0.00348 Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. Iteration 0 of LowEnergyTransferInCRTBP Iteration 1 of get_c Iteration 2 of get_c Iteration 3 of get_c Iteration 4 of get_c Iteration 5 of get_c Iteration 1 of LowEnergyTransferInCRTBP Iteration 1 of get_c Iteration 2 of get_c Iteration 3 of get_c Iteration 4 of get_c Iteration 5 of get_c Iteration 2 of LowEnergyTransferInCRTBP Iteration 1 of get_c Iteration 2 of get_c Iteration 3 of get_c Iteration 4 of get_c Iteration 5 of get_c Iteration 3 of LowEnergyTransferInCRTBP Iteration 1 of get_c Iteration 2 of get_c Iteration 3 of get_c Iteration 4 of get_c Iteration 5 of get_c Using family f16 Elapsed time is 3.129895 seconds.
Phasing
%-------- waitbar(.2,h,'LET Status: Estimating Transfer Time \newline Step 2/5 : Approximately 5.5 min remaining') desiredPhasing = LET.theta2 - pi/15; [initialStateEph,sec2tu] = CRTBP2kms(LET.initialState,distanceUnit,muSun,muMoon+muPlanet); x0 = LET.tF/sec2tu; debugData.x0 = x0; [x,orbits] = LETPhasing(x0,desiredPhasing,moon,planet,0,jDate); dtTarg = x ; debugData.dtTarg = dtTarg; fprintf('Phasing requires %f lunar orbits\n',orbits);
Phasing requires 3.573600 lunar orbits
Transfer to 3BP
%---------------- waitbar(.4,h,'LET Status: Transferring to MKS Sun/Earth System \newline Step 3/5 : Approximately 4.5 min remaining') %[initialStateEph] = CRTBP2kms(LET.initialState,distanceUnit,muSun,muMoon+muPlanet); [r,v] = PlanetPositionEMBarycenter('update',jDate); sunState = [r(:,1);v(:,1)]; [initialStateEph] = RotPuls2J2000(initialStateEph,sunState,muSun); dV1Eph = CRTBP2kms([LET.initialState(1:3);LET.dV1],distanceUnit,muSun,muMoon+muPlanet); dV1Eph = RotPuls2J2000(dV1Eph,sunState,muSun); dV1Eph = Mag(dV1Eph(4:6));%*.9995; % TEMP fprintf('Performing targeting for the 3 body problem...\n'); tic elements0 = RV2El(initialStateEph(1:3),initialStateEph(4:6),muMoon+muPlanet); figH1 = PlotLET3BP(elements0,dV1Eph,dtTarg,jDate); set(figH1(1),'name',strcat(get(figH1(1),'name'),' BEFORE')) set(figH1(2),'name',strcat(get(figH1(2),'name'),' BEFORE')) debugData.pre3BP.elements = elements0; debugData.pre3BP.dV1Eph = dV1Eph; [elements,dV1New] = Targeting3BP2(elements0,dV1Eph,dtTarg,0,muMoon,jDate); toc debugData.post3BP.elements = elements; debugData.post3BP.dV1Eph = dV1New; figH2 = PlotLET3BP(elements,dV1New,dtTarg,jDate); % remove handle set(figH2(1),'name',strcat(get(figH2(1),'name'),' AFTER')) set(figH2(2),'name',strcat(get(figH2(2),'name'),' AFTER'))
Performing targeting for the 3 body problem... Iteration Func-count min f(x) Procedure 0 1 36.6853 1 5 36.6853 initial simplex 2 7 36.6236 expand 3 8 36.6236 reflect 4 10 36.5274 expand 5 11 36.5274 reflect 6 13 36.3825 expand 7 14 36.3825 reflect 8 16 36.1532 expand 9 17 36.1532 reflect 10 19 35.789 expand 11 20 35.789 reflect 12 22 35.2162 expand 13 23 35.2162 reflect 14 25 34.3214 expand 15 26 34.3214 reflect 16 28 32.9217 expand 17 29 32.9217 reflect 18 31 30.7082 expand 19 32 30.7082 reflect 20 34 27.2513 expand 21 35 27.2513 reflect 22 37 21.7936 expand 23 38 21.7936 reflect 24 40 13.4289 expand 25 41 13.4289 reflect 26 43 1.88548 expand 27 44 1.88548 reflect 28 46 0.464504 reflect 29 47 0.464504 reflect 30 49 0.464504 contract outside 31 51 0.464504 contract inside 32 53 0.464504 contract inside 33 55 0.464504 contract inside 34 57 0.464504 contract inside 35 59 0.388341 contract inside 36 61 0.308347 contract inside 37 63 0.308347 contract outside 38 65 0.279416 contract inside 39 67 0.257911 contract inside 40 69 0.235606 contract inside 41 70 0.235606 reflect 42 72 0.234989 contract inside 43 74 0.226729 contract inside 44 75 0.226729 reflect 45 77 0.22655 contract inside 46 79 0.226203 contract outside 47 81 0.224262 contract inside 48 83 0.223457 contract inside 49 85 0.221835 contract inside 50 86 0.221835 reflect 51 88 0.221835 contract inside 52 90 0.221711 contract inside 53 92 0.221521 contract outside 54 94 0.221324 contract inside 55 96 0.221324 contract outside 56 97 0.221324 reflect 57 99 0.221003 reflect 58 101 0.221003 contract inside 59 103 0.221003 contract inside 60 105 0.220959 reflect 61 107 0.220959 contract outside 62 109 0.220566 expand 63 111 0.220342 expand 64 112 0.220342 reflect 65 114 0.219944 expand 66 116 0.2194 expand 67 117 0.2194 reflect 68 119 0.217881 expand 69 121 0.216395 expand 70 122 0.216395 reflect 71 123 0.216395 reflect 72 125 0.211532 expand 73 126 0.211532 reflect 74 128 0.208828 expand 75 129 0.208828 reflect 76 131 0.19887 expand 77 132 0.19887 reflect 78 133 0.19887 reflect 79 135 0.189003 expand 80 136 0.189003 reflect 81 138 0.178489 expand 82 140 0.16605 expand 83 141 0.16605 reflect 84 143 0.15383 expand 85 144 0.15383 reflect 86 145 0.15383 reflect 87 147 0.150792 reflect 88 149 0.147207 reflect 89 150 0.147207 reflect 90 152 0.137475 reflect 91 154 0.137475 contract inside 92 156 0.12488 expand 93 157 0.12488 reflect 94 159 0.116413 expand 95 161 0.116413 contract inside 96 163 0.115507 reflect 97 165 0.106716 expand 98 166 0.106716 reflect 99 167 0.106716 reflect 100 169 0.09519 reflect 101 171 0.0854526 reflect 102 173 0.0790944 reflect 103 174 0.0790944 reflect 104 176 0.0790944 contract inside 105 178 0.0790944 contract inside 106 180 0.0790944 contract inside 107 181 0.0790944 reflect 108 182 0.0790944 reflect 109 184 0.0776202 reflect 110 186 0.0750532 contract inside 111 188 0.0715768 expand 112 190 0.0700266 reflect 113 192 0.0685122 reflect 114 194 0.0685122 contract inside 115 196 0.0620417 expand 116 197 0.0620417 reflect 117 199 0.0620417 contract inside 118 201 0.0558235 expand 119 203 0.0504828 expand 120 204 0.0504828 reflect 121 205 0.0504828 reflect 122 207 0.046764 reflect 123 208 0.046764 reflect 124 210 0.0371051 expand 125 211 0.0371051 reflect 126 213 0.0371051 contract inside 127 214 0.0371051 reflect 128 216 0.0371051 contract inside 129 218 0.0371051 contract inside 130 220 0.0304964 expand 131 221 0.0304964 reflect 132 223 0.028718 expand 133 225 0.0256455 reflect 134 227 0.0240967 reflect 135 229 0.0240967 contract inside 136 230 0.0240967 reflect 137 232 0.0240967 contract inside 138 234 0.019162 expand 139 236 0.019162 contract outside 140 237 0.019162 reflect 141 239 0.0162945 expand 142 240 0.0162945 reflect 143 241 0.0162945 reflect 144 243 0.0105958 expand 145 245 0.0105958 contract outside 146 247 0.0105958 contract inside 147 248 0.0105958 reflect 148 250 0.00667979 expand 149 251 0.00667979 reflect 150 253 0.00640752 expand 151 255 0.00640752 contract inside 152 257 0.00640752 contract inside 153 259 0.00588532 expand 154 261 0.00244329 reflect 155 263 0.00244329 contract inside 156 265 0.00179966 reflect 157 266 0.00179966 reflect 158 267 0.00179966 reflect 159 269 0.00179966 contract inside 160 271 0.00179966 contract inside 161 272 0.00179966 reflect 162 274 0.000761606 expand 163 276 0.000761606 contract inside 164 277 0.000761606 reflect 165 279 0.000411646 expand 166 281 0.000411646 contract inside 167 283 0.000191935 expand 168 285 0.000191935 contract inside 169 287 0.000191935 contract outside 170 289 0.000191935 contract outside 171 290 0.000191935 reflect 172 292 0.000191935 contract inside 173 294 0.000191935 contract inside 174 295 0.000191935 reflect 175 297 0.000191935 contract inside 176 299 0.000191935 contract inside 177 301 0.000191935 contract inside 178 303 0.000191935 contract inside 179 305 0.000191935 contract inside 180 307 0.000191935 contract inside 181 309 0.000191935 contract inside 182 311 0.000191621 contract inside 183 313 0.000191621 contract inside 184 315 0.000191372 contract inside 185 316 0.000191372 reflect 186 318 0.000191366 contract inside 187 320 0.000191334 contract inside 188 322 0.000191301 contract inside 189 324 0.000191301 contract outside 190 326 0.000191251 contract inside 191 327 0.000191251 reflect 192 329 0.000191248 contract inside 193 331 0.000191248 contract outside 194 333 0.000191248 contract outside 195 335 0.000191248 contract inside Optimization terminated: the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-03 Elapsed time is 66.540194 seconds.
Transfer to 4BP
%---------------- waitbar(.6,h,'LET Status: Transferring to Sun/Earth/Moon System \newline Step 4/5 : Approximately 3 min remaining') fprintf('Performing targeting for the 4 body problem...\n'); elements(1) = r0; % question: is this the right way to shift from barycenter to planet-centered dV1EphNew = dV1New; debugData.pre4BP.elements = elements; debugData.pre4BP.dV1Eph = dV1EphNew; figH3 = PlotLET(elements,dV1EphNew,dtTarg,jDate); set(figH3(1),'name',strcat(get(figH3(1),'name'),' BEFORE')) set(figH3(2),'name',strcat(get(figH3(2),'name'),' BEFORE')) moonSteps=6; % A Posteriori, at this time. 6 runs in 471 seconds. 5 doesn't converge. elements4BP=elements; dV14=dV1EphNew; for moonStepFraction=0:1/(moonSteps-1):1 PlotLET(elements4BP,dV14,dtTarg,jDate,moonStepFraction); [elements4BP,dV14] = Targeting4BP(elements4BP,dV14,dtTarg,0,p,jDate,moonStepFraction);% Ease from 4BP without Moon into 4BP end figH4 = PlotLET(elements4BP,dV14,dtTarg,jDate); % remove handle set(figH4(1),'name',strcat(get(figH4(1),'name'),' AFTER')) set(figH4(2),'name',strcat(get(figH4(2),'name'),' AFTER')) debugData.post4BP.elements = elements4BP; debugData.post4BP.dV1Eph = dV14;
Performing targeting for the 4 body problem...
Minimize energy wrt the moon in 4bp
%------------------------------------ waitbar(.8,h,'LET Status: Minimizing Energy \newline Step 5/5 : Approximately 1.5 min remaining') debugData.preMin.elements = elements4BP; debugData.preMin.dV1Eph = dV14; [elements,dV1Eph,det,f,jTraj,jL2] = MinE4BP(elements4BP,dV14,dtTarg,0,muMoon,p,jDate); waitbar(1,h,'LET Status: Complete') debugData.postMin.elements = elements; debugData.postMin.dV1Eph = dV1Eph; debugData.postMin.dt = det; PlotLET(elements,dV1Eph,det+5*86400,jDate);
Exiting: Maximum number of iterations has been exceeded - increase MaxIter option. Current function value: -0.069953
Store the results
LETTrans = struct; LETTrans.elements = elements; LETTrans.initialStateJ2000 = El2RV(elements,1e-14,muPlanet); LETTrans.maneuver = dV1Eph; LETTrans.timeOfFlight = det; LETTrans.finalEnergy = f; LETTrans.family = family; LETTrans.muMoon = muMoon; LETTrans.muPlanet = muPlanet; LETTrans.cTraj = jTraj; LETTrans.cL2 = jL2; LETTrans.burns = 1; close(h) toc(tRun) if( saveFiles ) save([mfilename,'_',datestr(now,'yyyy-mm-dd--HH-MM-SS')]) end %--------------------------------------
Elapsed time is 416.770904 seconds.