From d00b977581fec05ad1410a7e564d28e9de285b68 Mon Sep 17 00:00:00 2001 From: Connor Date: Tue, 15 Mar 2022 20:34:31 -0600 Subject: [PATCH 1/3] Unless Bosanac has a last minute change, the paper is done! --- LaTeX/approach.tex | 20 +++++--------- LaTeX/fig/EMJS_thrust_components.png | Bin 40543 -> 44417 bytes LaTeX/fig/EMS_thrust_components.png | Bin 38940 -> 43045 bytes LaTeX/results.tex | 2 +- LaTeX/trajectory_design.tex | 38 +++++++++++---------------- LaTeX/trajectory_optimization.tex | 12 +++------ 6 files changed, 26 insertions(+), 46 deletions(-) diff --git a/LaTeX/approach.tex b/LaTeX/approach.tex index 178ac86..f29b0b0 100644 --- a/LaTeX/approach.tex +++ b/LaTeX/approach.tex @@ -264,7 +264,7 @@ \item The $v_{\infty,in}$ vector representing excess velocity at the planetary flyby (or completion of mission) at the end of the phase \item The time of flight for the phase - \item The unit-thrust profile in a sun-fixed frame represented by a + \item The unit-thrust profile in a sun-centered frame represented by a series of vectors with each element ranging from 0 to 1. \end{itemize} \end{itemize} @@ -397,18 +397,12 @@ non-powered flyby. From these two velocity vectors the turning angle, and thus the periapsis of the flyby, - can then be calculated by Equation~\ref{turning_angle_eq} and the following equation: - - \begin{equation} - r_p = \frac{\mu}{\vec{v}_{\infty,in} \cdot \vec{v}_{\infty,out}} \cdot \left( - \frac{1}{\sin(\delta/2)} - 1 \right) - \end{equation} - - If this radius of periapse is then found to be less than the minimum safe radius - (currently set to the radius of the planet plus 100 kilometers), then the process is - repeated with new random flyby velocities until a valid seed flyby is found. These - checks are also performed each time a mission is perturbed or generated by the NLP - solver. + can then be calculated by Equation~\ref{turning_angle_eq} and + Equation~\ref{periapsis_eq}. If this radius of periapse is then found to be less than + the minimum safe radius (currently set to the radius of the planet plus 100 kilometers), + then the process is repeated with new random flyby velocities until a valid seed flyby + is found. These checks are also performed each time a mission is perturbed or generated + by the NLP solver. The final requirement then, is the thrust controls, which are actually quite simple. Since the thrust is defined as a 3-vector of values between -1 and 1 representing some diff --git a/LaTeX/fig/EMJS_thrust_components.png b/LaTeX/fig/EMJS_thrust_components.png index 0fd0a94c7d11b80551f3447873bd1812d1fec495..b4868f1f19d45fd6dfd30b501f4f9db529fdd683 100644 GIT binary patch literal 44417 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

!3Spd>sm#jPzc&#P{(7#k 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 t}#V;F$_R18I&jGBP6Ojl%#oJets6AP-C$fBO}a zoXTxdZY~GSkvVWzaz3E=J+wJ{-)mQ=h@P?jlD9aD!)Zow^u@NYwj`AadRL>Nc~ozV z+w+?!KOc?6*lP=>7(!swBUZAr;D$;-Mi0&dR^WNC^0ks%VuKgrd9QeNIs8i%xSac2 zi-?U1(0z$0DB@(7@w6JMZg?hERb>fVawJ2fV933w#CnS+`_r`bEMJaRZry2k^woO7 zPc;wg<(;Yj2afnLN>VfJPhlr9ad)KX*C%`&*gD9CA=b2vmu(RoXrlgkH{)tSan$Q^ ziHBo?);2b?NBi3Z848bAu&xA#KN$6&TYNM6F(x!|s|p_wL@;uAb&qpAY}X{2tqA;#-i;E)zj>pz zQ=iwVowf3K^U*XLfVOWeXsAY58>D{WO#nX@H3KZ*)iP7_pL}!1mtbc#IA4sXp<*f7 zZ7}mO{R&;Oa-UPc6MlnLh$XZ|boZ3P&KwK1BO>In0(u)NTrDj zxd=pN+2J(w<<6xD7t!6OR|wA;h4^YA4!}ITyqBCK&@X&HHy2lPmfr@Y&RG`80B~<+ zL)HPXEz>Vzd;0}34uTZdZj8j=$^Fq+n8kz|qiRbmKKzJePwn}Sl_JQnTV*vDwI=Vgc%j2`j`&r*^F;$2iN}EZt#7#ImECEH1^cIY@VJGH5e#|dL~Q#R5RXT&@pS6t zAVn?o=in6q)QUoJetP8+NW$e(wyT<3D=gl|JDeU1$D4%0UsUShE)GfzqU{xLai6!3 zZRhGKk&D`2XVE7J+l^tkgo~^vIHpIMeZ8OWa~Rsry5@=Q{S1ZQ&)AzJIz2rK&rgj= zD-EsmGb%6@oN=GmRet8Y7CoSGa$jJ9g*9u0V4nNBZk_w`{{Cq^q z1s>lQH%HXj+pI+q^e3^w?!9LRWpofL9e#BapMnG9bobi0>DSs9Ia} zRR;ef*j9Vp+=88$g*5v>S_TahNmn0P>Q_Sn8(;3=pdb>CW=Nbf7rG(hT>Nk8R<5V@ zPA+TEb%MVOfTb!ee#dDW!QBKq8UnVL$y<)B&g6ORSa3otc+Xa(Wl_mtGkIRatcfYA z2fwY4>`GURN(|M-Bj&G$$yo35B0xOv0^17C#df&cR4gq0_*_{5WWWC73xJM(qFZf# zy~H{$=>mVDI(oT_9Vd~*TG3DsnQ9*k8vLv{051KNxnK-K%l5q*a4~!pyn66EsXHa@4fJ}WCDT9pQto`=w^l`Wt=s6 zePi?fL<9l6|1;lMTJOBxj328e?^`a>g`FN#pk}@`O4$v)B#R3>lPYPP)h@n~4*ETS zEm9OQ?jHvmey|8sR_lSuR#4jIcL7Hw zB%C1U*?gRW-UdWP z5%gMqO3CgdD-?Fr)9JybD&bIEzI8M3-Z6;8^!)f+8d$O#$mtI$j`hX=7)}>C+`n!xl2Uf#Pu+b$2u z218*kc(axqOy=H$S>z_n8928uKbR&p?=cN+4Teir_{i)8pAN3|^71chl~2}hJl>dK z1X*w=(5<(dY@vq)c4jeWFBtS72^maQ2 z8eBP-S7s)&@tD|7aFp(T5OFTl`L_3h3BKJ%%c&pCK~U+wqVoep1c;*@@>eW!UbK*Y zhPGL>f;)>#cf<_@#oos^pWO4B&?<0tTZ{pS>MkmfdW{i{0}Db2GtP^^{OQAhQRy2r{8^ z1D>=hc$qo>-Lz~x+UkSE@NS0pFhn5PKchy-xCh91Vh{-~r~sA0*b#f5xm~+#WU#2D z*NO(1{fe;;j<3Ks7V(JmfExu(D6^MI^1u=Q zpYcAV7~$X&2`eiM1iu_tuFxqQZK^c1)NLIcf>KTejDropg&T2Rgy)Me^T9+n!AHrU z?YRUMkjIb}g1B&ivUSP(7~vqpQbT4E02nC(>^<2ga}WmbB7$PD+6H$#O2k!tAzmGB z<}mK{6u#xVzv8J&+K1&2CFr0gL0PO@`5`}sJRGt32W!zmI*o7PyEe9M9*d+P(DSId zKWjP=7tvkB%q zTk$9s%1ZqD_dJK+!I1q9<1cpRJzJ8#q z-&V3?{$HsC7!I*dU$0NQSa#xPS^i*eScPKo`|bxw0Z>@z#e(VPqW1uZZ{cyA0gJ@Q z+yVg^8D>ya?{9E|A0GCi;ui26?Cndr9T4wds6UnQP-VbY1aP(BfD(O^SM>aO700#avn(P3`OhM5Etd5kd}`134IKgWX|6!GM)-kn zRN4?!rE*3_X}ec>)J-X%+2z0*1dE-!&1@1bO-}|V z$07xHwx0su8v>{z@Q)E0d)II9RY8p9k)_ofIFc?)0{4C|m_m8ox{Zy>AbUL;$SI*J zhmQ(Y9@m36`rmthod6yM=!^YNolh`0Zr`I+)df#H1k(Zm)%}cl!eAT-II6%JVd;W; z$9Zc(GiAWGtFpRU>?fe{cTn*e8Rkp=E!AM-Nl8PKxC}VZGUSvq%6lK*dT#TLt~O48 z&Xjgrjs5iGW1c1?e@>BJ>)mGGr5<`BRWgi4IoMr~2EdmIc2Mj*3?ov5J%(N!;N#&z zhLIqSZrgql-``f@ac5dZ@^XF2uAFoNfKC?5>ZlZXUsjcUJ2h2Kt5bOoV2Z!zEVvBu z41BK7eFeK$U|Ass*|q~rfH%!S7VRcmhM0ABceg^n)KZKo9=sT!wZC|nAPq_lgdC%A zdSsM?%E^Ok%J5nhNCOWva8?K(x&IzKN)hjQOMtCHclny&06|QT5)u+D#F&0VfCLxS z#j=mP$bcPWPz^*oQ$c!!H3@Hd8Jt}Q+LuWIIst64$_^;8hfzn@M-T%`cwa7AS=nhR z$e3m)vzz|l?H{za+|zqz%H@(y_@Q=QMq;5R!S!d8{>9cbENaMhVAx_$7+*E!?i}`0 zG3a)5(+_?dqY4n-v&ec-f+KX-dGOnSOr)!k`yIly z0H#Pg82fWXSyditB=7us{tOKFV3Z*hOp zs&WRhHl(uy)!!z}*fCyVjseS6K=~1;g+k+EAG(h&U>HWh7IeLje$#HG-C0&h=yhu( zcH!1jHEtfwpt?HuqKxM$DG{(+IpMj1y|0DxHPl#96#^}Sb_=e8P?Cxvi3gJ z(cw{nj`_5;Xd86Hy1KgZKk_a=zvFcGgH8$!b*Y5D5nt{H?TZa=W{4?kON)P{t7@T3 z>VPc+c^JB;z74=WWG09Gx2n$kDRVeZ?ln)dW zT=pZ%_gBYka5%YKj-Q=HWfh}KcIl`+5exeA#w}8qTx9Ud5qyBQP2bpFZJq}anlj`} z(LQD7fC)=+g$BI@-Xn$@{gq?=5a*n=P4Ip>mT z_RNNXoN#wb`jgv~J?@NO$!^iFJf~;samEnxD7%I-vyFn~U!qVaVB-wUDR?Waryj4z36hvFWL=wo;wki_Dqk6*r-l-9fFfEuy?4LRl{8d~^6( z5f~a2Q7AZm?y%SJk(m1Gho`9;K#oLFiaimu(`6WX%Ewh)wVvi1YfNWmp96x-emAb1 zD2}&7!}6}mxN~Z8VV4f5G3@LiLO1ZIHzrfMFc_26buyK!CT2CifbeVmiiXMrby)0c z)5Phh+9&Uf`@8&VSX%lSh?xfNpSA9{cciw#?=+>q@wGIy*^S37WqyI!)Y-m~nr;9} z{xedpoT`}=?!}yvT}|qQXMQ20Zfhu%AHX*ip=2Br;yh_^nfzT=G$uS)Y0oVlc`%ep z(Rt;wor|)7tVfU*gRyB%Ue?frZqlO(Nu*&|XiV%m?`8~Y)Ko1D=Csx|7GM?8YDcjC z@PKL$W}A>0(3;^!MDz+_T?V8K0Rg6xu*8LKT4Aw?O8R2o%w(<5<)ny+t*SkZhHqWa zI@AKy0^k`87?={Mk2kL+XIPZ^Nb%!bX8;eO`rd$#|C)Tc4{ny7 zH28`J6RX^dk+B(&XZlcp2-!YRPuBWSJOS2Nm4maO|3+iUuFb|&a7gOqY=)TO(XyDg zCD+<>9~jxPfmh~JEdo=)M}OkC@C{*zoE0BDUa_vNH)1C=-;X*@Iz6%Td-Fl_erIpc3MwWise8< zpE;!bW)}xyfT@@7@-8mPQL`Cl(wtSxjZeLbF*XQHqS@83$&?I)f-HCzEaY=C+1tOo zRvGwhFm`DJ4w8I_wFwcd;pLl=5$IG0c7c08;{vB^jr!7G0cUd}2lO+vpXC>yY_B^dM*K-7m$>9c!3h zXpma%_J~~r8lckCF3aTLSH{_~JAh%d6MRIG*e*X!E7SdQeYV0GW`<|ZwHF1& z;}3oizHb&Ib(&>#FoGVFU~*&$S6F8bdp@)g8t&9ie2DzCQZ*_C^27 z?oe)n_ib;(>vBg>dvz+ZR@?W;RE+KVA zt}mzjeXX{$l(2aG{_$SD_+K;AgoN42GFB%0=?};fKsUd3<^GAdp;_-b{^-qD*D}B! zji_swy`e|x`>t#gr-}~_w>$`D?@9U+my2mzOK_yt=02z@4R!~p=c*B(dI*iy*j-AGi~x{XTB5xZ?BLL;cVm+lH}>Lt zC*GYqZ4|+EQ6rRn_eAv{{spV8*Kw^L@!U}jJUHT>5;@7z>^9lj%> zE`Hn4RmB{+Kl!Hi$|FCVj%#|l<)4tF^j&>ugFeLEWum5vH=@B1!Wm~g78C937-JQ- zn_6bBI`OqqD z4bF{l^J;3`Xk>t>j6y;4HcVQZUS)IFwjC~F%_7ct5e9ms%%36yN;|ETo;(r9#lzIKRtt_JZDXW|kZ#=7_ll zlu~rxzan4}Qn$ev1=g`5Q1K z66^tB7S6D2mz=CDsc$Syz}u3QBFY^xwKu2d*_($;3wA5E2P^chfz8OpgMA}emSsOzuc;>-a2 zJEKG?vLyUSFd`yt&#shEhc5!u3){2Qe;@y77vtpOs^fHuHD0U-!=zfr>9gP*3vIb6 z=cD}R=E~OAJlcFz4UOLN(;?O6&1%Dax%CPVC>q%5!go!gpcSYIFH(19Lu_19U2CoXS_Kqk_%RRftJl>@UkqchE$yqKf6~TeD*iK1%vch!WQ14YC<4IzdjqQEv)=#tCG{C3(*Ap^xnYP> z$e%u1B9RSV1`moDAuu4XWYYisN;DF1k(X9Ds3!is@;m?Yh5nD#{CXKnREc zR%vRG51OI>J*BjC&~P;LONUem-i3xQ5@^841}qoD9AU02Pyz@Nk=xWANkX2723rFd zoE$K}2YL!XSvo90$@uTGT%N#BGXY|N2_nOQ@&L`CQlA>RbSbI9c(nTexz~{>b_RtE zivfiIfcasdSCnDP{q!TsXMJwaXfct8Bq}FKx_rk=4mC02`eX3Y>tE)c&u>Hd*C)E& zOTZt6+hk6mM47^%tMkl8BLU`0aUr3BGwPPnKv9_+9}Qm7)<@{q0o|auyQ}n819buq zGAQ|t?La#WsimT)Cp5WqI}|PPQ|oaTGl|(VZDgD0aS-<}lfJJO{w^jsv}0{9rEvHs zIxuOQMm658S9KM<{B6@+#2-nrb}feO78#=_V5|dTln3K1A}T6G0EwkN@PN_K3!W}) z2|UTtt`?oHc7W9T)D{&M1yBMFrmk3uTQhqA{BGI*y#kysrlAAV=QKcKYFZMtC zSDcN_gHxQoNOJvCt7_I^^-s<0DAS+11yhbK*`))V@;I)A3_vzi2VbkX;@uDvW z5HrNN`FRMOfS8E*9eE%gW4w^b!V8_2#UIsf4f_*Wf0mTI#JEH-NZ{YP1b+U%zve;? zCgio)m;X!whT^q?ax?bD8*0_{F(v1^=(@frA1RuN~?OEDWZG7NbtOG~E@uQ46c-(7Cd^p`T&Qqpl^OA_yJn zT8S#mO+`RM>N?8>7B}=>%^wJ(?QoQhGeZKs;`&yfmtW@9>2N34GxZjNC1>49XQB9@GbP=-|k*KsIk(_B}Y!{^z zZAuqO57|^&ceA03veQM9ZuE5MI!!BQ6Qw-TMWOMC#=btf%sG3`oPCZzIKRjDcl%yG z-_QH~dB1auNadA1EZ=R)A&>)G+~Pbfry-L%b0>Ku$E%ePkH1W^57^LzfQZeC)=`V^ z$0J5~d73zb zaQ(fB9HOJ&a$Z6iFo3xxH{!8(L_|>&Zj(d!#8^%%qrk>o6SLndZSBuV|H9qRIl;1Y z;qW0Sp%sRJz*zk}&&KA8;Q_A%%OT|2W+A~OcZKlmSF6eYnQ1U0&%?rWww#eCnEJ|P z)xMm^KAxcsK-^`ppyW=`S`4~$cwq8$>ENy?D*4d$pqbol=H75$j zlp4v1VwpwnuF+_=e3Ba0jZmSx($a9tkhp;=j2zFb5Acn=A7-HlhY6feWnots&i>8` zXkJJ8HJmbeQ;tM&b~lBghm&Dnl^Q^_lHV4c6y}a?FaOX-nw-?MyzBYdnol)r$!I;El{G)oh>Ogbe^Z? z-3b`X>$gxQk=PtGdU34S^&NZDzoUC%waj#3zr!}){aA2iU$V2{n>38fU}Bd0Q@|7e zO&6FTd(N(yf1jl5e%S%GfkG+MIF~vlG z;M`Iu+6SX;G}P>umCtxKa@aR1!v}5G;*oXZ%_{Yg%l=x5Yrq2mUNeCK99~_tG zdvXKdUcaxZFRgAcQNG88Oq^C>cb}^YO3qG+fjP{$ypCQjb|@IYJbJX1FxyyI>o{ls zj!j0%KW8qlymSvHilFr5i4`AB(1YUo)oa#FIb5L$zsm}G;kMg!^_o~ zdH-1P_2M%s(>d7!M@H!yVY@E6hdq8SuJ)5Bv2%jae5hv-#z%Ojq`RAc9x(t@Ru?94 zYU&>7odsds1X3WLpc^SVmswrR2*A(-{^*rku&_%aPb{z~p>b)1RKAW#EXZ6G-&Vt-dac zJ(?46g+j*_a9BJ7r6fVC)%Kkb_sn;4MgIK;Z@QK^jS2OVQ9lN7CjaI3WWZOzM}$>X zn-X)H9((hO1$Gc$ZHO2u#m&SSk$ycyl5uVlH}qe$wMJIMPp-BsI4N2+;#??PDn(-Y=STGrdmERVH_@wz~B%MW|8fNICc?cM|D zzTZ{MQ0I4*16>?n{p8`*1K?VN%QjKY4?}9eR9A{S=ymp zCRdngoe5kR#zYT| z2f-}&s=s-hYuDf3cRl6V72>~oIoWZJ6bKPnq~+Y6gzWcX0=vj5;`i=t@OhF| zFt&#Rus()jcjddo4_N=r4CAh+*mkXB0MZ4VHZ{EsfMe0^BOjroVia|*M%!;CK-nUI z!(zWLY*I4w0-bN=cD`<0M^Rd2=p*?1s&wLj(z*$b9w}=C#V1ZzPjKdLgppD7s^Ng! z6W1KCb)BzIWSuAr9u>$D)!18j>;>N~63WjJA3Mf|E!F=$Y_iukdsGQ^WsWx7ga`C?;Z$G6`W3JV?aYV#|k;!A-(3*x*7-bs!d;BY>_ z|Bfp0h9|)}tOMNOhEYttw{i90wJm)pir$481A9{CM8{xn!h6|&>kHA77k>jwTg>`Ui>LbvH3zWI z%qiaW$2Z{tR~y5`9x^!Bb-x#nMU6X`Zr8p-P;>FzMVv}G65hHP!`EK)6kuO9w&3l5mAu^xNB`e1yxnU4b_?&m z@V^24`&0bZ7rL&|wU&*L%u1{bO=f4{Q3;3*;A_REt?R1G4v9wzY~kadsxdS##`!B$cWO_UsEfVK%qBI!hno!wWIyfjV#^b zR}HozP*r^r^GF$sZK~{j`|b;&kR??74vC+HLx3iIdGi=xLo0g#8SCDpAuAZlZ=jExi?W)c|del3&aK)o;SvR8LZ3X_)(FVV23U&G~>a*f9@vSF^ zpjdgN_B=Fu8;>{O{6>AzZ{M?2{*erqiB^ns1_9|#=~5I#y1VPl#eVh^<9uVB z_Z{PW|2=DOS&Q|XdCxnp`?@DFYASLVs3fQm2n0hxUPc1~fdl_wl93U?H~AmbQy>s* zM_(;ncMTISDrZ+GOB;I&Dt8}e3n~k58%qep`$s{VjVD=?Yxunxz7g!2i4f7~A!f6G zPzbXIU4h@|YvtG-OE3J$;r?j(+Tpvbd-1ili&!QfT+NckRr||WHvUB)jostveJ88s z+km!L^-BS#^V@|1qNk!;uhzK@j*mCQje?vmyxlXbHislUTAkweooX*cudd9f?nU9t z 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 U7~mO$wL41fsureP(IWJJ0mCO7WB>pF diff --git a/LaTeX/fig/EMS_thrust_components.png b/LaTeX/fig/EMS_thrust_components.png index 6ee1c7114c96d879a51754cb66b61b1d22ace27e..07c09204cbdf7383be60bb19eb51f1dcddf97886 100644 GIT binary patch literal 43045 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 literal 38940 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 10^{-6} \\ + \frac{\sqrt{\psi} - \sin \sqrt{\psi}}{\psi^{3/2}} \quad &\text{if} \, \psi > 10^{-6} \\ \frac{\sinh\sqrt{-\psi} - \sqrt{-\psi}}{(-\psi)^{3/2}} \quad &\text{if} \, \psi < -10^{-6} \\ 1/6 \quad &\text{if} \, 10^{-6} > \psi > -10^{-6} \end{cases} @@ -578,7 +577,7 @@ flight: \begin{equation} - \chi = sqrt{\frac{y}{c_2}} + \chi = \sqrt{\frac{y}{c_2}} \end{equation} \begin{equation} @@ -691,7 +690,7 @@ $v_{eq}$, such that the thrust equation becomes: \begin{align} - v_{eq} &= v_e - \frac{\Delta p A_e}{\dot{m}} \\ + v_{eq} &= v_e + \frac{\Delta p A_e}{\dot{m}} \\ F &= \dot{m} v_{eq} \label{isp_1} \end{align} @@ -717,7 +716,7 @@ \subsection{Sims-Flanagan Transcription} - this thesis chose to use a model well suited for modeling low-thrust paths: the + This thesis chose to use a model well suited for modeling low-thrust paths: the Sims-Flanagan transcription (SFT)\cite{sims1999preliminary}. The SFT allows for flexibility in the trade-off between fidelity and performance, which makes it very useful for this sort of preliminary analysis. @@ -829,10 +828,3 @@ \caption{Graphic of an orbit-raising with a high efficiency cutoff} \label{high_efficiency_fig} \end{figure} - - All of this is, of course, also true for impulsive trajectories. However, since the - thrust presence for those trajectories are generally taken to be impulse functions, the - control laws can afford to be much less complicated for a given mission goal, by simply - thrusting only at the moment on the orbit when the transition will be most efficient. - For a low-thrust mission, however, the control law must be continuous rather than - discrete and therefore the control law inherently gains a lot of complexity. diff --git a/LaTeX/trajectory_optimization.tex b/LaTeX/trajectory_optimization.tex index 7d016ec..a3e403f 100644 --- a/LaTeX/trajectory_optimization.tex +++ b/LaTeX/trajectory_optimization.tex @@ -20,7 +20,7 @@ The other category is the direct methods. In a direct optimization problem, the cost function itself provides a value that an iterative numerical optimizer can measure - itself against. The optimal solution is then found by varying the inputs $x$ until the + itself against. The optimal solution is then found by varying the inputs $\vec{x}$ until the cost function is reduced to a minimum value, often determined by its derivative jacobian. A number of tools have been developed to optimize NLPs via this direct method in the general case. @@ -48,7 +48,7 @@ University. It uses a sparse sequential quadratic programming algorithm as its back-end optimization scheme. - Another common NLP optimization packages (and the one used in this implementation) + Another common NLP optimization package (and the one used in this implementation) is the Interior Point Optimizer or IPOPT\cite{wachter2006implementation}. It uses an Interior Point Linesearch Filter Method and was developed as an open-source project by the organization COIN-OR under the Eclipse Public License. @@ -74,11 +74,6 @@ step the initial guess, now labeled $x_{k+1}$ after the addition of the ``step'' vector and iterates this process until predefined termination conditions are met. - In this case, the IPOPT algorithm was used, not as an optimizer, but as a solver. For - reasons that will be explained in the algorithm description in Section~\ref{algorithm} it - was sufficient merely that the non-linear constraints were met, therefore optimization (in - the particular step in which IPOPT was used) was unnecessary. - \subsubsection{Shooting Schemes for Solving a Two-Point Boundary Value Problem} One straightforward approach to trajectory corrections is a single shooting @@ -154,8 +149,7 @@ very well to low-thrust arcs and, in fact, Sims-Flanagan Transcribed low-thrust arcs in particular, because there actually are control thrusts to be optimized at a variety of different points along the orbit. This is, however, not an exhaustive - description of ways that multiple shooting can be used to optimize a trajectory, - simply the most convenient for low-thrust arcs. + description of ways that multiple shooting can be used to optimize a trajectory. \section{Monotonic Basin Hopping Algorithms} From 298eb38ff139c1d3cba3a26af5c9c7db323c7334 Mon Sep 17 00:00:00 2001 From: Connor Date: Tue, 15 Mar 2022 22:20:45 -0600 Subject: [PATCH 2/3] She did. Now I'm done! --- LaTeX/approach.tex | 48 +++--- LaTeX/conclusion.tex | 7 +- LaTeX/introduction.tex | 75 ++++----- LaTeX/results.tex | 42 +++-- LaTeX/thesis.tex | 17 +- LaTeX/trajectory_design.tex | 266 +++++++++++------------------- LaTeX/trajectory_optimization.tex | 42 ++--- 7 files changed, 198 insertions(+), 299 deletions(-) diff --git a/LaTeX/approach.tex b/LaTeX/approach.tex index f29b0b0..0cd7e93 100644 --- a/LaTeX/approach.tex +++ b/LaTeX/approach.tex @@ -1,11 +1,10 @@ \chapter{Algorithm Overview} \label{algorithm} - This thesis will attempt to develop an algorithm for the preliminary analysis of feasibility in - designing a low-thrust interplanetary mission to an outer planet by leveraging a monotonic basin - hopping algorithm. In this section, we will review the actual execution of the algorithm - developed. As an overview, the routine was designed to enable the determination of an optimized - spacecraft trajectory from the selection of some very basic mission parameters. Those parameters - include: + This thesis focuses on designing a low-thrust interplanetary mission to an outer planet by + leveraging a monotonic basin hopping algorithm. This section will review the actual execution of + the algorithm developed. As an overview, the routine is designed to enable the determination of + an optimal spacecraft trajectory that minimizes propellant usage and $C_3$ from the selection of + some very basic parameters. Those parameters include: \begin{itemize} \setlength\itemsep{-0.5em} @@ -25,7 +24,7 @@ \end{itemize} Which allows for an automated approach to optimization of the trajectory, while still providing - the mission designer with the flexibility to choose the particular flyby planets to investigate. + the designer with the flexibility to choose the particular flyby planets to investigate. This is achieved via an optimal control problem in which the ``inner loop'' involves solving a TPBVP to find the optimal solution given a suitable initial guess. Then an ``outer loop'' @@ -133,12 +132,11 @@ The following pseudo-code outlines the approach taken for the elliptical case. The approach is quite similar when $a<0$: - % TODO: Some symbols here aren't recognized by the font \begin{singlespacing} \begin{verbatim} i = 0 # First declare some useful variables from the state - sig0 = (position ⋅ velocity) / √(mu) + sig0 = dot(position, velocity) / √(mu) a = 1 / ( 2/norm(position) - norm(velocity)^2/mu ) coeff = 1 - norm(position)/a @@ -184,7 +182,7 @@ \label{laguerre_plot} \end{figure} - \subsection{Sims-Flanagan Propagator} + \subsection{Propagating with Sims-Flanagan Transcription} Until this point, we've not yet discussed how best to model the low-thrust trajectory arcs themselves. The Laguerre-Conway algorithm efficiently determines @@ -228,11 +226,9 @@ and the mass flow rate (a function of the duty cycle percentage ($d$), thrust ($f$), and the specific impulse of the thruster ($I_{sp}$), commonly used to measure efficiency)\cite{sutton2016rocket}: - \begin{equation} \Delta m = \Delta t \frac{f d}{I_{sp} g_0} \end{equation} - Where $\Delta m$ is the fuel used in the sub-trajectory, $\Delta t$ is the time of flight of the sub-trajectory, and $g_0$ is the standard gravity at the surface of Earth. From knowledge of the mass flow rate, we can then decrement the mass @@ -272,10 +268,9 @@ From this information, as can be seen in Figure~\ref{nlp}, we can formulate the mission in terms of a non-linear programming problem. Specifically, the variables describing the - trajectory contained within the Guess object can be represented as an input vector, - $\vec{x}$, the cost function produced by an entire trajectory propagation as $F$, and - the constraints that the trajectory must satisfy as another function $\vec{G}$ such that - $\vec{G}(\vec{x}) = \vec{0}$. + trajectory from the free variable, $\vec{x}$, the cost function produced by an entire + trajectory propagation, $F$, and the constraints that the trajectory must satisfy as + another function $\vec{G}$ such that $\vec{G}(\vec{x}) = \vec{0}$. This is a format that we can apply directly to the IPOPT solver, which Julia (the programming language used) can utilize via bindings supplied by the SNOW.jl @@ -333,12 +328,12 @@ \subsection{Random Trajectory Generation}\label{random_gen_section} - At a basic level, the algorithm needs to produce a guess (represented by all of the - values described in Section~\ref{inner_loop_section}) that contains random values within - reasonable bounds in the space. However, that still leaves the determination of which - distribution function to use for the random values over each of those variables, which - bounds to use, as well as the possibilities for any improvements to a purely random - search. + At a basic level, the algorithm needs to produce a guess for the free variable vector + (represented by all of the values described in Section~\ref{inner_loop_section}) that + contains random values within reasonable bounds in the space. However, that still leaves + the determination of which distribution function to use for the random values over each + of those variables, which bounds to use, as well as the possibilities for any + improvements to a purely random search. Currently, the first value set for the mission guess is that of $n$, which is the number of sub-trajectories that each arc will be broken into for the Sims-Flanagan @@ -372,18 +367,18 @@ missions with more flybys. Then, the internal components for each phase are generated. It is at this step, that - the mission guess generator splits the outputs into two separate outputs. The first + the trajectory guess generator splits the outputs into two separate outputs. The first is meant to be truly random, as is generally used as input for a monotonic basin hopping algorithm. The second utilizes a Lambert's solver to determine the appropriate hyperbolic velocities (both in and out) at each flyby to generate a - natural trajectory arc. For this Lambert's case, the mission guess is simply seeded + natural trajectory arc. For this Lambert's case, the trajectory guess is simply seeded with zero thrust controls and outputted to the monotonic basin hopper. The intention here is that if the time of flights are randomly chosen so as to produce a trajectory that is possible with a control in the vicinity of a natural trajectory, we want to be sure to find that trajectory. More detail on how this is handled is available in Section~\ref{mbh_subsection}. - However, for the truly random mission guess, there are still the $v_\infty$ values + However, for the truly random trajectory guess, there are still the $v_\infty$ values and the initial thrust guesses to generate. For each of the phases, the incoming excess hyperbolic velocity is calculated in much the same way that the launch velocity was calculated. However, instead of multiplying the randomly generate unit @@ -471,14 +466,11 @@ Because of this, the perturbation used in this implementation follows a bi-directional, long-tailed Pareto distribution generated by the following probability density function\cite{englander2014tuning}: - \begin{equation} 1 + \left[ \frac{s}{\epsilon} \right] \cdot \left[ \frac{\alpha - 1}{\frac{\epsilon}{\epsilon + r}^{-\alpha}} \right] \end{equation} - - \noindent Where $s$ is a random array of signs (either plus one or minus one) with dimension equal to the perturbed variable and bounds of -1 and 1, $r$ is a uniformly distributed random array with dimension equal to the perturbed variable and bounds diff --git a/LaTeX/conclusion.tex b/LaTeX/conclusion.tex index 257f9b2..79c8594 100644 --- a/LaTeX/conclusion.tex +++ b/LaTeX/conclusion.tex @@ -10,11 +10,8 @@ In performing this examination, two results were selected for further analysis. These results are outlined in Table~\ref{results_table}. As can be seen in the table, both resulting trajectories have trade-offs in mission length, launch energy, fuel usage, and - more. However, both results show very interesting trajectories that could indicate some - favorable possibilities for such a mission profile. Each of these trajectories should be - within the capabilities of existing launch vehicles in terms of $C_3$. - - \section{Recommendations for Future Work}\label{improvement_section} + more. Each of these trajectories appear to be within the capabilities of existing launch + vehicles in terms of $C_3$. In the course of producing this algorithm, a large number of improvement possibilities were noted. This work was based, in large part, on the work of Jacob Englander in a number of diff --git a/LaTeX/introduction.tex b/LaTeX/introduction.tex index ca9831f..8c5b3c2 100644 --- a/LaTeX/introduction.tex +++ b/LaTeX/introduction.tex @@ -1,16 +1,16 @@ \chapter{Introduction} Continuous low-thrust engines utilizing technologies such as Ion propulsion, Hall thrusters, and - others can be a powerful system in the enabling of long-range interplanetary missions with fuel - efficiencies unrivaled by those that employ only impulsive thrust systems. The challenge in - utilizing these systems, then, is the design of trajectories that effectively utilize this - technology. Continuous thrust propulsive systems tend to be particularly suited to missions - which require very high total change in velocity ($\Delta V$) values and take place over a - particularly long duration. Traditional impulsive thrusting techniques can achieve these changes - in velocity, but typically have a far lower specific impulse and, as such, are much less fuel - efficient, costing the mission valuable financial resources that could instead be used for - science. Because of their inherently high specific impulse (and thus efficiency), low-thrust - propagation systems are well-suited to interplanetary missions. + others enable long-range interplanetary missions with fuel efficiencies unrivaled by those that + employ only impulsive thrust systems. The challenge in utilizing these systems, then, is the + design of trajectories that effectively utilize this technology. Continuous thrust propulsive + systems tend to be particularly suited to missions which require very high total change in + velocity ($\Delta V$) values and take place over a particularly long duration. Traditional + impulsive thrusting techniques can achieve these changes in velocity, but typically have a far + lower specific impulse and, as such, are much less fuel efficient, costing the mission valuable + financial resources that could instead be used for science. Because of their inherently high + specific impulse (and thus efficiency), low-thrust propulsion systems are well-suited to + interplanetary missions. The first attempt by NASA to use an electric ion-thruster for an interplanetary mission was the Deep Space 1 mission\cite{brophy2002}. This mission was designed to test the ``new'' technology, @@ -29,16 +29,15 @@ in October 2018 and is projected to perform a flyby of Earth, two of Venus, and six of Mercury before inserting into an orbit around that planet. - A common theme in mission design is that there always exists a trade-off between efficiency - (particularly in terms of fuel use) and the time required to achieve the mission objective. Low - thrust systems in particular tend to produce mission profiles that sacrifice the rate of - convergence on the target state in order to achieve large increases in fuel efficiency. Often a - low-thrust mission profile in Earth orbit will require multiple orbital periods to achieve the - desired change in spacecraft state. Interplanetary missions, though, provide a particularly - useful case for continuous thrust technology. The trajectory arcs in interplanetary space are - generally much, much longer than orbital missions around the Earth. Because of this increase, - even a small continuous thrust is capable of producing large $\Delta V$ values over the course - of a single trajectory arc. + A common theme in mission design is that there is a trade-off between efficiency (particularly + in terms of fuel use) and the time required to achieve the mission objective. Low thrust systems + in particular tend to produce mission profiles that sacrifice the rate of convergence on the + target state in order to achieve large increases in fuel efficiency. Often a low-thrust transfer + in Earth orbit will require multiple orbital periods to achieve the desired change in spacecraft + state. Interplanetary missions, though, provide a particularly useful case for continuous thrust + technology. The trajectory arcs in interplanetary space are generally much, much longer than + orbital missions around the Earth. Because of this increase, even a small continuous thrust is + capable of producing large $\Delta V$ values over the course of a single trajectory arc. Another technique often leveraged by interplanetary trajectory designers is the gravity assist. Gravity assists utilize the inertia of a large planetary body to ``slingshot'' a spacecraft, @@ -58,24 +57,22 @@ routine for producing unconstrained, globally optimal trajectories for realistic interplanetary mission development that utilizes both planetary flybys and efficient low-thrust electric propulsion techniques. Similar studies have also been performed by a number of researchers - including a team from JPL\cite{sims2006} as well as a Spanish team\cite{morante}, among several - others. + including a team from JPL\cite{sims2006}, among several others\cite{morante}. - This thesis will attempt to develop an algorithm for the optimization of low-thrust enabled - trajectories for initial feasibility analysis in mission design. The algorithm will utilize - a non-linear programming solver to directly optimize a set of control thrusts for the - user-provided flyby planets, for any provided cost function. A monotonic basin hopping algorithm - (MBH) will then be employed to traverse the search space in an effort to find additional local - optima. This approach differs from the work produced earlier by Englander and the other teams, - but is largely meant to explore the feasibility of such techniques and propose a few - enhancements. The approach defined in this thesis will then be used to investigate an example - mission to Saturn. + This thesis focuses on optimization of low-thrust enabled trajectories that use gravity assists. + The approach uses a non-linear programming solver to directly optimize a set of control thrusts + for the user-provided flyby planets, for any provided cost function. A monotonic basin hopping + algorithm (MBH) is then employed to traverse the search space in an effort to find additional + local optima. This approach differs from the work produced earlier by Englander and the other + teams, but is largely meant to explore the feasibility of such techniques and propose a few + enhancements. The approach defined in this thesis is then used to design low thrust trajectories + with gravity assits from the Earth to Saturn. - This thesis will explore these concepts in a number of different sections. Section - \ref{traj_dyn} will explore the basic dynamical principles of trajectory design, beginning the - with fundamental system dynamics, then exploring interplanetary system dynamics and gravity - flybys, and finally the dynamics that are specific to low-thrust enabled trajectories. Section - \ref{traj_optimization} will then discuss process of optimizing spacecraft trajectories in - general and the tool available for that. Section \ref{algorithm} will cover the implementation - details of the optimization algorithm developed for this paper. Finally, section \ref{results} - will explore the results of some hypothetical missions to Saturn. + This thesis is organized as follows: Section \ref{traj_dyn} will explore the basic dynamical + principles of trajectory design, beginning the with fundamental system dynamics, then exploring + interplanetary system dynamics and gravity flybys, and finally the dynamics that are specific to + low-thrust enabled trajectories. Section \ref{traj_optimization} will then discuss process of + optimizing spacecraft trajectories in general and the tool available for that. Section + \ref{algorithm} will cover the implementation details of the optimization algorithm developed + for this paper. Finally, section \ref{results} will explore the results of some hypothetical + missions to Saturn. diff --git a/LaTeX/results.tex b/LaTeX/results.tex index d2b8ec8..2c7f4fd 100644 --- a/LaTeX/results.tex +++ b/LaTeX/results.tex @@ -1,31 +1,29 @@ -\chapter{Sample Saturn Trajectory Analysis} \label{results} +\chapter{Application: Designing a Trajectory To Saturn} \label{results} - The algorithm described in this thesis is quite flexible in its design and could be used as - a tool for a mission designer on a variety of different mission types. However, to consider - a relatively simple but representative mission design objective, a sample mission to Saturn - was investigated. + To consider a relatively simple but representative mission design objective, a sample mission to + Saturn was investigated. - \section{Mission Constraints} + \section{Mission Scenario} - The sample mission was defined to represent a general case for a near-future low-thrust - trajectory to Saturn. No constraints were placed on the flyby planets, but a number of + The sample mission is defined to represent a general case for a near-future low-thrust + trajectory to Saturn. No constraints are placed on the flyby planets, but a number of constraints were placed on the algorithm to represent a realistic mission scenario. The first choice required by the application is one not necessarily designable to the - initial mission designer (though not necessarily fixed in the design either) and is that - of the spacecraft parameters. The application accepts as input a spacecraft object - containing: the dry mass of the craft, the fuel mass at launch, the number of onboard - thrusters, and the specific impulse, maximum thrust and duty cycle of each thruster. + initial mission designer (though not necessarily fixed in the design either) and is that of + the spacecraft parameters. The application accepts as input a spacecraft object containing: + the dry mass of the spacecraft, the fuel mass at launch, the number of onboard thrusters, + and the specific impulse, maximum thrust and duty cycle of each thruster. - For this mission, the spacecraft was chosen to have a dry mass of only 200 kilograms for - a fuel mass of 3300 kilograms. This was chosen in order to have an overall mass roughly - in the same zone as that of the Cassini spacecraft, which launched with 5712 kilograms - of total mass, with the fuel accounting for 2978 of those kilograms\cite{cassini}. The - dry mass of the craft was chosen to be extremely low in order to allow for a variety of - ''successful`` missions in which the craft didn't run out of fuel. That way, the - delivered dry mass to Saturn could be thought of as a metric of success, without - discounting mission that may have delivered just under whatever more realistic dry mass - one might set, in case those missions are in the vicinity of actually valid missions. + For this mission, the spacecraft was chosen to have a dry mass of only 200 kilograms for a + fuel mass of 3300 kilograms. This was chosen in order to have an overall mass roughly in the + same zone as that of the Cassini spacecraft, which launched with 5712 kilograms of total + mass, with the fuel accounting for 2978 of those kilograms\cite{cassini}. The dry mass of + the spacecraft was chosen to be extremely low in order to allow for a variety of + ''successful`` missions in which the spacecraft didn't run out of fuel. That way, the + delivered dry mass to Saturn could be thought of as a metric of success, without discounting + mission that may have delivered just under whatever more realistic dry mass one might set, + in case those missions are in the vicinity of actually valid missions. The thruster was chosen to have a specific impulse of 3200 seconds, a maximum thrust of 250 millinewtons, and a 100\% duty cycle. This puts the thruster roughly in line with @@ -308,6 +306,6 @@ \centering \includegraphics[width=\textwidth]{fig/c3} \caption{Plot of Delta IV and Atlas V launch vehicle capabilities as they relate to - payload mass \cite{c3capabilities} from a source from 2007} + payload mass \cite{c3capabilities} from Vardaxis, et al, 2007 } \label{c3} \end{figure} diff --git a/LaTeX/thesis.tex b/LaTeX/thesis.tex index ba01f91..df7f82f 100644 --- a/LaTeX/thesis.tex +++ b/LaTeX/thesis.tex @@ -22,14 +22,15 @@ Much work has been performed recently to utilize the increasingly viable technology of low-thrust electric propulsion systems on missions of interplanetary scope. This thesis analyzes - a technique for the initial analysis of feasibility of utilizing a combination of low-thrust - propulsion systems and natural gravity flybys for missions to the outer planets. First, a method - for finding local optima by utilizing an interior-point linesearch algorithm to directly - optimize the entire trajectory as a Non-Linear Programming problem is presented. Then, a - Monotonic Basin Hopping algorithm is utilized to traverse the search space, improve the local - optima determined by the internal optimizer, and determine the global optima. This allows for a - medium-fidelity, fully automated global optimization of the low thrust controls and flyby - parameters for a given mission objective. + a technique for designing trajectories for spacecraft with a low-thrust propulsion system that + also use natural gravity flybys for missions to the outer planets. Often, the goal is to find + feasible solutions that also minimize propellant mass requirements. First, locally optimal + solutions are constructed by using an interior-point linesearch algorithm, along with multiple + shooting techniques for optimization. Then, Monotonic Basin Hopping is utilized to traverse the + search space, improve the local optima determined by the internal optimizer, and determine the + global optima. This approach allows for a medium-fidelity, fully automated global optimization + of the low thrust controls and flyby parameters for a given target destination. As an + application of this method, two sample trajectories to Saturn are analyzed. } diff --git a/LaTeX/trajectory_design.tex b/LaTeX/trajectory_design.tex index 3c416bb..be54b72 100644 --- a/LaTeX/trajectory_design.tex +++ b/LaTeX/trajectory_design.tex @@ -16,24 +16,24 @@ very high-fidelity force models that account for aerodynamic pressure, solar radiation pressure, multi-body effects, and other forces may be too time intensive for a particular application. Initial surveys of the solution space often don't require such - complex models in order to gain valuable insight. + complex models in order to gain valuable preliminary insight. - Therefore, a common approach (and the one utilized in this implementation) is to first - use a lower-fidelity dynamical model that captures only the gravitational force due to - the primary body around which the spacecraft is orbiting. This approach can provide an + A common approach (and the one utilized in this implementation) is to first use a + lower-fidelity dynamical model that captures only the gravitational force due to the + primary body around which the spacecraft is orbiting. This approach can provide an excellent low-to-medium fidelity model that is useful as an underlying model in an algorithm for quickly categorizing a search space for initial mission feasibility explorations. In order to explore the Two Body Problem, we must first examine the full set of assumptions associated with the force model\cite{vallado2001fundamentals}. Firstly, we - are only concerned with the nominative two bodies: the spacecraft and the planetary body - around which it is orbiting. Secondly, both of these bodies are modeled as point masses - with constant mass. This removes the need to account for non-uniform densities and - asymmetry. Finally, for convenience in notation at the end, we'll also assume that the - mass of the spacecraft ($m_2$) is much much smaller than the mass of the planetary body - ($m_1$) and enough so as to be considered negligible. The only force acting on this - system is then the force of gravity that the primary body enacts upon the secondary. + are only concerned with the gravitational influence between the nominative two bodies: + the spacecraft and the planetary body around which it is orbiting. Secondly, both of + these bodies are modeled as point masses with constant mass. This removes the need to + account for non-uniform densities and asymmetry. Finally, for convenience in notation at + the end, we'll also assume that the mass of the spacecraft ($m_2$) is much much smaller + than the mass of the planetary body ($m_1$) and enough so as to be considered + negligible. \begin{figure}[H] \centering @@ -45,7 +45,6 @@ Under these assumptions, the force acting on the body due to the law of universal gravitation is: - \begin{align} F_2 &= - \frac{G m_1 m_2}{r^2} \frac{\vec{r}}{\left| r \right|} \\ F_1 &= \frac{G m_2 m_1}{r^2} \frac{\vec{r}}{\left| r \right|} @@ -53,7 +52,6 @@ And by Newton's second law (force is the product of mass and acceleration), we can derive the following differential equations for $r_1$ and $r_2$: - \begin{align} m_2 \ddot{\vec{r}}_2 &= - \frac{G m_1 m_2}{r^2} \frac{\vec{r}}{\left| r \right|} \\ m_1 \ddot{\vec{r}}_1 &= \frac{G m_2 m_1}{r^2} \frac{\vec{r}}{\left| r \right|} @@ -65,7 +63,6 @@ inertial frame. $G$ is the universal gravitational parameter, $m_1$ is the mass of the planetary body, and $m_2$ is the mass of the spacecraft. From these equations, we can then determine the acceleration of the spacecraft relative to the planet: - \begin{equation} \ddot{\vec{r}} = \ddot{\vec{r}}_2 - \ddot{\vec{r}}_1 = - \frac{G \left( m_1 + m_2 \right)}{r^2} \frac{\vec{r}}{\left| r \right|} @@ -76,27 +73,19 @@ negligible $m_2$ term. We can also introduce, for convenience, a gravitational parameter $\mu$ which represents the gravity constant for the system about the center of motion ($\mu = G (m_1 + m_2) \approx G m_1$). Doing so and simplifying produces: - \begin{equation} \ddot{\vec{r}} = - \frac{\mu}{r^2} \hat{r} \end{equation} - We may also wish to utilize the total orbital energy for a spacecraft within this model. Since the spacecraft is acting only under the gravitational influence of the planet and - no other forces, we can define the total specific mechanical energy as: - + no other forces, we can define the total specific mechanical energy as \cite{vallado2001fundamentals}: - \begin{equation} \label{energy} \xi = \frac{v^2}{2} - \frac{\mu}{r} \end{equation} - - \noindent Where the first term represents the kinetic energy of the spacecraft and the second term represents the gravitational potential energy. - \subsection{Kepler's Laws} - Now that we've fully qualified the forces acting within the Two Body Problem, we can concern ourselves with more practical applications of it as a force model. It should be noted, firstly, that the spacecraft's position and velocity (given an initial position and velocity @@ -105,6 +94,8 @@ one-dimensional equations (one for each component of the three-dimensional space) and three unknowns (the three components of the second derivative of the position). + \subsection{Kepler's Laws} + In the early 1600s, Johannes Kepler produced just such a solution, by taking advantages of what is also known as ``Kepler's Laws'' which are\cite{murray1999solar}: @@ -113,68 +104,61 @@ expanded to any orbit by re-wording as ``all orbital paths follow a conic section (circle, ellipse, parabola, or hyperbola) with a primary mass at one of the foci''. - Specifically the path of the orbit follows the trajectory equation: - + The conic trajectory equation explains this observation and offers a description + of the path as: \begin{equation} r = \frac{\sfrac{h^2}{\mu}}{1 + e \cos(\theta)} \end{equation} - - Where $h$ is the angular momentum of the satellite, $e$ is the + where $h$ is the angular momentum of the satellite, $e$ is the eccentricity of the orbit, and $\theta$ is the true anomaly, or simply - the angular distance the satellite has traversed along the orbit path. + the angular distance the satellite has traversed along the orbit path from + periapsis. \item The area swept out by the imaginary line connecting the primary and secondary bodies increases linearly with respect to time. This implies that the magnitude of the orbital speed is not constant. For the moment, we'll just take this value to be a constant: - \begin{equation}\label{swept} \frac{\Delta t}{T} = \frac{k}{\pi a b} \end{equation} - - Where $k$ is the constant value, $a$ and $b$ are the semi-major and + where $k$ is the constant value, $a$ and $b$ are the semi-major and semi-minor axis of the conic section, and $T$ is the period. In the following section, we'll derive the value for $k$. \item The square of the orbital period is proportional to the cube of the semi-major - axis of the orbit, regardless of eccentricity. Specifically, the relationship is: - + axis of the orbit, regardless of eccentricity. For an elliptical orbit this + observation connects to the following known expression for the orbit period: \begin{equation} T = 2 \pi \sqrt{\frac{a^3}{\mu}} \end{equation} - - Where $T$ is the period and $a$ is the semi-major axis. + where $T$ is the period and $a$ is the semi-major axis. \end{enumerate} \subsection{Kepler's Equation} Kepler was able to produce an equation to represent the angular displacement of an orbiting body around a primary body as a function of time, which we'll derive now for - the elliptical case\cite{vallado2001fundamentals}. Since the total area of an ellipse is - the product of $\pi$, the semi-major axis, and the semi-minor axis ($\pi a b$), we can - relate (by Kepler's second law) the area swept out by an orbit as a function of time, as - we did in Equation~\ref{swept}. This leaves just one unknown variable $k$, which we can - determine through use of the geometric auxiliary circle, which is a circle with radius - equal to the ellipse's semi-major axis and center directly between the two foci, as in - Figure~\ref{aux_circ}. + the elliptical case\cite{vallado2001fundamentals}. Because the total area of an ellipse + is the product of $\pi$, the semi-major axis, and the semi-minor axis ($\pi a b$), we + can relate (by Kepler's second law) the area swept out by an orbit as a function of + time, as we did in Equation~\ref{swept}. This leaves just one unknown variable $k$, + which we can determine through use of the geometric auxiliary circle, which is a circle + with radius equal to the ellipse's semi-major axis and center directly between the two + foci, as in Figure~\ref{aux_circ}. \begin{figure}[H] \centering \includegraphics[width=0.8\textwidth]{fig/kepler} - \caption{Geometric Representation of Auxiliary Circle}\label{aux_circ} + \caption{Geometric representation of auxiliary circle}\label{aux_circ} \end{figure} In order to find the area swept by the spacecraft\cite{vallado2001fundamentals}, $k$, we can take advantage of the fact that that area is the triangle $k_1$ subtracted from the elliptical segment $PCB$: - \begin{equation}\label{areas_eq} k = area(seg_{PCB}) - area(k_1) \end{equation} - - \noindent Where the area of the triangle $k_1$ can be found easily using geometric formulae: - \begin{align} area(k_1) &= \frac{1}{2} \left( ae - a \cos E \right) \left( \frac{b}{a} a \sin E \right) \\ &= \frac{ab}{2} \left(e \sin E - \cos E \sin E \right) @@ -186,7 +170,6 @@ can find the area for the elliptical segment $PCB$ by first finding the circular segment $POB'$, subtracting the triangle $COB'$, then applying the fact that an ellipse is merely a vertical scaling of a circle by the amount $\frac{b}{a}$. - \begin{align} area(PCB) &= \frac{b}{a} \left( area(POB') - area(COB') \right) \\ &= \frac{b}{a} \left( \frac{a^2 E}{2} - \frac{1}{2} \left( a \cos E \right) @@ -197,26 +180,20 @@ By substituting the two areas back into Equation~\ref{areas_eq} we can get the $k$ area swept out by the spacecraft: - \begin{equation} k = \frac{ab}{2} \left( E - e \sin E \right) \end{equation} - Which we can then substitute back into the equation for the swept area as a function of time (Equation~\ref{swept}) for period of time since the spacecraft left periapsis: - \begin{equation} \frac{\Delta t}{T} = \frac{t_2 - t_{peri}}{T} = \frac{E - e \sin E}{2 \pi} \end{equation} - Which is, effectively, Kepler's equation. It is commonly known by a different form: - \begin{equation} M = \sqrt{\frac{\mu}{a^3}} \Delta t = E - e \sin E \end{equation} - - Where we've defined the mean anomaly as $M$ and used the fact that $T = - \sqrt{\frac{a^3}{\mu}}$. This provides us a useful relationship between Eccentric Anomaly + where we've defined the mean anomaly as $M$ and used the fact that $T = + \sqrt{\frac{a^3}{\mu}}$. This provides us a useful relationship between eccentric anomaly ($E$) which can be related to spacecraft position, and time, but we still need a useful algorithm for solving this equation in order to use this equation to propagate a spacecraft. @@ -224,34 +201,25 @@ \subsection{LaGuerre-Conway Algorithm}\label{laguerre} For this thesis, the algorithm used to solve Kepler's equation was the general numeric - root-finding scheme first developed by LaGuerre in the 1800s and first applied to - Kepler's equation by Bruce Conway in 1985\cite{laguerre_conway}. In his paper, Conway - makes a compelling argument for utilizing the less common LaGuerre method over higher - order Newton or Newton-Raphson methods. - - The Newton-Raphson methods, while found to generally have quite impressive convergence - rates (generally successfully solving Kepler's equation correctly within 5 iterations), - were prone to failures in convergence given certain specific initial conditions. - Therefore LaGuerre's algorithm is proposed as an alternative. - - The algorithm can be relatively easily derived by examining the polynomial equation with - $m$ roots: + root-finding scheme first developed by LaGuerre in the 1800s and first applied to Kepler's + equation by Bruce Conway in 1985\cite{laguerre_conway}. In his paper, Conway makes a + compelling argument for utilizing the less common LaGuerre method over higher order Newton + or Newton-Raphson methods. The Newton-Raphson methods, while found to generally have quite + impressive convergence rates (generally successfully solving Kepler's equation correctly + within 5 iterations), were prone to failures in convergence given certain specific initial + conditions. Therefore LaGuerre's algorithm is proposed as an alternative. + The algorithm can be derived by examining the polynomial equation with $m$ roots: \begin{equation} g(x) = (x - x_1) (x - x_2) ... ( x - x_m) \end{equation} - - \noindent We can then generate some useful convenience functions as: - \begin{align} \ln|g(x)| &= \ln|(x - x_1)| + \ln|(x - x_2)| + ... + \ln|( x - x_m)| \\ \frac{d\ln|g(x)|}{dx} &= \frac{1}{x - x_1} + \frac{1}{x - x_2} + ... + \frac{1}{x - x_m} = G_1(x) \end{align} - and - \begin{align} \frac{-d^2\ln|g(x)|}{dx^2} &= \frac{1}{(x - x_1)^2} + \frac{1}{(x - x_2)^2} + ... + \frac{1}{(x - x_m)^2} = G_2(x) @@ -259,42 +227,32 @@ Now we define the targeted root as $x_1$ and make the approximation that all of the other roots are equidistant from the targeted root, which means: - \begin{equation} x - x_i = b, i=2,3,...,m \end{equation} - - \noindent We can then rewrite $G_1$ and $G_2$ as: - \begin{align} G_1 &= \frac{1}{a} + \frac{n-1}{b} \\ G_2 &= \frac{1}{a^2} + \frac{n-1}{b^2} \end{align} - - \noindent Which may be solved for $a$ in terms of $G_1$, $G_2$: - \begin{equation} a = \frac{n}{G_1 \pm \sqrt{(n-1)(nG_2 - G_1^2)}} \end{equation} - - \noindent With corresponding iteration function: - \begin{equation} x_{i+1} = x_i - \frac{n g(x_i)}{g'(x_i) \pm \sqrt{(n-1)^2 f'(x_i)^2 - n (n-1) f(x_i) f''(x_i)}} \end{equation} This iteration scheme can be shown to be globally convergent, regardless of the initial - guess. More relevantly, Conway also showed that the application of this method to - Kepler's equation was shown to converge with similar speed to many of the best common - higher order Newton-Raphson solvers. However, LaGuerre's method was also found to be - incredibly robust, converging to the correct value for every one of Conway's 500,000 - tests. Because of this robustness, it is very useful for propagating spacecraft states. + guess. Conway also showed that the application of this method to Kepler's equation was shown + to converge with similar speed to many of the best common higher order Newton-Raphson + solvers. However, LaGuerre's method was also found to be incredibly robust, converging to + the correct value for every one of Conway's 500,000 tests. Because of this robustness, it is + useful for solving Kepler's equation. - \section{Interplanetary Considerations}\label{interplanetary} + \section{Interplanetary Trajectories}\label{interplanetary} In interplanetary travel, the primary body most responsible for gravitational forces might be a number of different bodies, dependent on the phase of the mission. In fact, at some @@ -346,14 +304,15 @@ This effectively breaks the trajectory into a series of arcs each governed by a distinct Two-Body problem patched together by distinct transition points. These transition points - occur along the spheres of influence of the planets nearest to the spacecraft. + occur along the spheres of influence of the planets nearest to the spacecraft. A + conceptual example of this process, labeled the method of patched conics, appears in + Figure~\ref{patched_conics_fig}. Therefore, we must understand how to convert our spacecraft's state from the Sun frame to the planetary frame as it crosses this boundary. An elliptical orbit about the sun will have enough orbital energy to represent a hyperbolic orbit around the planet. So we first need to determine the velocity of the spacecraft relative to the planet as it crosses the SOI, which we can determine by subtraction \cite{vallado2001fundamentals}: - \begin{equation} \vec{v}_{sc/p} = \vec{v}_{sc/sun} - \vec{v}_{planet/sun} \end{equation} @@ -361,8 +320,8 @@ Since the orbit around the planet is hyperbolic, in order to characterize the hyperbola we must determine the velocity of the spacecraft when it has infinite distance relative to the planet. Since this never occurs, a further approximation is made that the - velocity that the spacecraft has (relative to the planet) as it crosses the SOI can be - modeled as the $\vec{v}_\infty$ of that hyperbolic arc. + velocity of the spacecraft (relative to the planet) as it crosses the SOI can be modeled + as the $\vec{v}_\infty$ of that hyperbolic arc. As an example, we may wish to determine the velocity relative to the planet that the spacecraft has at the periapsis of its hyperbolic trajectory during the flyby. This @@ -371,14 +330,12 @@ around its target planet. For a given incoming hyperbolic $\vec{v}_\infty$, we can first determine the specific mechanical energy of the hyperbola at infinite distance by using Equation~\ref{energy}: - \begin{equation} \xi = \frac{v^2}{2} - \frac{\mu}{r} = \frac{v_\infty^2}{2} \end{equation} We can then leverage the conservation of energy to determine the velocity at a particular point, $r_{ins}$: - \begin{align} \xi_{ins} &= \frac{v_{ins}^2}{2} - \frac{\mu}{r_{ins}} \\ \xi_{ins} &= \xi_\infty = \frac{v_\infty^2}{2} \\ @@ -387,14 +344,13 @@ \subsection{Launch Considerations} - Generally speaking, an interplanetary mission begins with launch. For a satellite of - given size, a certain amount of orbital energy can be imparted to the satellite by the - launch vehicle. In practice, this value, for a particular mission, is actually - determined as a parameter of the mission trajectory to be optimized. The excess velocity - at infinity of the hyperbolic orbit of the spacecraft that leaves the Earth can be used - to derive the launch energy. This is usually qualified as the quantity $C_3$, which is - actually double the kinetic orbital energy with respect to the Sun, or simply the square - of the excess hyperbolic velocity at infinity\cite{wie1998space}. + For a satellite of given size, a certain amount of orbital energy can be imparted to the + satellite by the launch vehicle. In practice, this value, for a particular mission, is + actually determined as a parameter of the mission trajectory to be optimized. The excess + velocity at infinity of the hyperbolic orbit of the spacecraft that leaves the Earth can + be used to derive the launch energy. This is usually qualified as the quantity $C_3$, + which is actually double the kinetic orbital energy with respect to the Sun, or simply + the square of the excess hyperbolic velocity at infinity\cite{wie1998space}. This algorithm will assume that the initial trajectory at the beginning of the mission will be some hyperbolic orbit with velocity enough to leave the Earth. That initial @@ -405,12 +361,12 @@ what the maximum mass any launch provider is capable of imparting that specific $C_3$ to. - A similar approach is taken at the end of the mission. This algorithm doesn't attempt to - exactly match the velocity of the planet. Instead, the excess hyperbolic velocity is - also treated as a parameter that can be minimized by the cost function. If a mission is - to then end in insertion, a portion of the mass budget can then be used for an impulsive - thrust engine, which can provide a final insertion burn. This approach also allows - flexibility for missions that might end in a flyby rather than insertion. + A similar approach is taken at the end of the trajectory. This algorithm doesn't attempt + to exactly match the velocity of the planet. Instead, the excess hyperbolic velocity is + also treated as a parameter that can be minimized by the cost function. If a trajectory + is to then end in insertion, a portion of the mass budget can then be used for an + impulsive thrust engine, which can provide a final insertion burn. This approach also + allows flexibility for missions that might end in a flyby rather than insertion. \subsection{Gravity Assist Maneuvers} @@ -441,7 +397,7 @@ \begin{figure}[H] \centering \includegraphics[width=0.8\textwidth]{fig/flyby} - \caption{Visualization of velocity changes during a gravity assist} + \caption{Velocity changes during a gravity assist} \label{grav_assist_fig} \end{figure} @@ -451,7 +407,7 @@ turning angle of this bend. In doing so, one can effectively achieve a (restricted) free impulsive thrust event. - \subsection{Flyby Periapsis} + \subsection{Flyby Periapsis Altitude} Now that we understand gravity assists, the natural question is then how to leverage them for achieving certain velocity changes\cite{cho2017b}. But first, we must consider @@ -460,7 +416,6 @@ mentioned in the previous section, given an excess hyperbolic velocity entering the planet's sphere of influence ($\vec{v}_{\infty, in}$) and a target excess hyperbolic velocity as the spacecraft leaves the sphere of influence ($\vec{v}_{\infty, out}$): - \begin{equation}\label{turning_angle_eq} \delta = \arccos \left( \frac{\vec{v}_{\infty,in} \cdot \vec{v}_{\infty,out}}{|\vec{v}_{\infty,in}| |\vec{v}_{\infty,out}|} \right) @@ -470,12 +425,10 @@ that we must target in order to achieve the required turning angle. The periapsis of the flyby, however, can provide a useful check on what turning angles are possible for a given flyby, since the periapsis: - \begin{equation}\label{periapsis_eq} r_p = \frac{\mu}{v_\infty^2} \left[ \frac{1}{\sin\left(\frac{\delta}{2}\right)} - 1 \right] \end{equation} - - Cannot be lower than some safe value that accounts for the radius of the planet and + cannot be lower than some safe value that accounts for the radius of the planet and perhaps its atmosphere if applicable. \subsection{Multiple Gravity Assist Techniques} @@ -511,7 +464,9 @@ less than 180 degrees, which we classify as a Type I trajectory, and the second will have a $\Delta \theta$ of greater than 180 degrees, which we call a Type II trajectory. They will also differ in their direction of motion (clockwise or - counter-clockwise about the focus). This can be seen in Figure~\ref{type1type2}. + counter-clockwise about the focus). This can be seen in Figure~\ref{type1type2}, + where both of the Lambert's solutions are presented for sample points in an orbit + around the Sun. \begin{figure}[H] \centering @@ -523,7 +478,6 @@ The iteration used in this thesis will start by first calculating the change in true anomaly, $\Delta \theta$, as well as the cosine of this value, which can be found by: - \begin{align} \cos (\Delta \theta) &= \frac{\vec{r}_1 \cdot \vec{r}_2}{|\vec{r}_1| |\vec{r}_2|} \\ \Delta \theta &= \arctan(y_2/x_2) - \arctan(y_1/x_1) @@ -532,7 +486,6 @@ The direction of motion is then chosen such that counter-clockwise orbits are considered, as travelling in the same direction as the planets is generally more efficient. Next, the variable $A$ is defined: - \begin{equation} A = DM \sqrt{|r_1| |r_2| (1 - \cos(\Delta \theta))} \end{equation} @@ -547,7 +500,6 @@ time of flight matches the expected value to within a provided tolerance. In order to calculate the time of flight at each step, we must first calculate some useful coefficients: - \begin{equation}\label{loop_start} c_2 = \begin{cases} \frac{1-\cos(\sqrt{\psi})}{\psi} \quad &\text{if} \, \psi > 10^{-6} \\ @@ -555,7 +507,6 @@ 1/2 \quad &\text{if} \, 10^{-6} > \psi > -10^{-6} \end{cases} \end{equation} - \begin{equation} c_3 = \begin{cases} \frac{\sqrt{\psi} - \sin \sqrt{\psi}}{\psi^{3/2}} \quad &\text{if} \, \psi > 10^{-6} \\ @@ -563,23 +514,18 @@ 1/6 \quad &\text{if} \, 10^{-6} > \psi > -10^{-6} \end{cases} \end{equation} - - \noindent Where the conditions of this piecewise function represent the elliptical, hyperbolic, and parabolic cases, respectively. Once we have these, we can calculate another variable, $y$: - \begin{equation} y = |r_1| + |r_2| + \frac{A (c_3 \psi - 1)}{\sqrt{c_2}} \end{equation} We can then finally calculate the variable $\chi$, and from that, the time of flight: - \begin{equation} \chi = \sqrt{\frac{y}{c_2}} \end{equation} - \begin{equation} \Delta t = \frac{c_3 \chi^3 + A \sqrt{y}}{\sqrt{c_2}} \end{equation} @@ -592,22 +538,17 @@ The resulting $f$ and $g$ functions (and the derivative of $g$, $\dot{g}$) can then be calculated: - \begin{align} f &= 1 - \frac{y}{|r_1|} \\ g &= A \sqrt{\frac{y}{\mu}} \\ \dot{g} &= 1 - \frac{y}{|r_2|} \end{align} - And from these, we can calculate the velocities of the transfer points as: - \begin{align} \vec{v}_1 &= \frac{\vec{r}_1 - f \vec{r}_2}{g} \\ \vec{v}_2 &= \frac{\dot{g} \vec{r}_2 - \vec{r}_1}{g} \end{align} - - \noindent - Fully constraining the connecting orbit. + Fully describing the connecting path with the specified flight time. \subsubsection{Planetary Ephemeris} @@ -620,8 +561,8 @@ The primary use of SPICE in this thesis, however, was to determine the planetary ephemeris at a known epoch. Using the NAIF0012 and DE430 kernels, ephemeris in the - ecliptic plane J2000 frame (ICRF) could be easily determined for a given epoch, provided as - a decimal Julian Day since the J2000 epoch. + International Celestial Reference Frame could be easily determined for a given + epoch, provided as a decimal Julian Day since the J2000 epoch. \subsubsection{Porkchop Plots} @@ -641,10 +582,9 @@ Using porkchop plots such as the one in Figure~\ref{porkchop}, mission designers can quickly visualize which natural trajectories are possible between planets. Using the fact that incoming and outgoing $v_\infty$ magnitudes must be the same for a flyby, - a savvy mission designer can even begin to work out what combinations of flybys - might be possible for a given timeline, spacecraft state, and planet selection. + a mission designer can even begin to work out what combinations of flybys might be + possible for a given timeline, spacecraft state, and planet selection. - %TODO: Create my own porkchop plot \begin{figure}[H] \centering \includegraphics[width=\textwidth]{fig/porkchop} @@ -652,13 +592,7 @@ \label{porkchop} \end{figure} - However, this is an impulsive thrust-centered approach. The solution to Lambert's - problem assumes a natural trajectory. A natural trajectory is unnecessary when the - trajectory can be modified by a continuous thrust profile along the arc. Therefore, - for the hybrid problem of optimizing both flyby selection and thrust profiles, - porkchop plots are less helpful, and an algorithmic approach is preferred. - - \section{Low Thrust Considerations} \label{low_thrust} + \section{Modeling Low Thrust Control} \label{low_thrust} In this section, we'll discuss the intricacies of continuous low-thrust trajectories in particular. There are many methods for optimizing such profiles and we'll briefly discuss @@ -666,7 +600,7 @@ as introduce the concept of a control law and the notation used in this thesis for modelling low-thrust trajectories more simply. - \subsection{Specific Impulse} + \subsection{Engine Model} The primary advantage of continuous thrust methods over their impulsive counterparts is in their fuel-efficiency in generating changes in velocity. Put specifically, all @@ -678,45 +612,34 @@ This efficiency is often captured in a single variable called specific impulse, often denoted as $I_{sp}$. We can derive the specific impulse by starting with the rocket thrust equation\cite{sutton2016rocket}: - \begin{equation} F = \dot{m} v_e + \Delta p A_e \end{equation} - - \noindent Where $F$ is the thrust imparted, $\dot{m}$ is the fuel mass rate, $v_e$ is the exhaust velocity of the fuel, $\Delta p$ is the change in pressure across the exhaust opening, and $A_e$ is the area of the exhaust opening. We can then define a new variable $v_{eq}$, such that the thrust equation becomes: - \begin{align} v_{eq} &= v_e + \frac{\Delta p A_e}{\dot{m}} \\ F &= \dot{m} v_{eq} \label{isp_1} \end{align} - - \noindent And we can then take the integral of this value with respect to time to find the total impulse, dividing by the weight of the fuel to derive the specific impulse: - \begin{align} I &= \int F dt = \int \dot{m} v_{eq} dt = m_e v_{eq} \\ I_{sp} &= \frac{I}{m_e g_0} = \frac{m_e v_{eq}}{m_e g_0} = \frac{v_{eq}}{g_0} \end{align} - Plugging Equation~\ref{isp_1} into the previous equation we can derive the following formula for $I_{sp}$: - \begin{equation} \label{isp_real} I_{sp} = \frac{F}{\dot{m} g_0} \end{equation} - - \noindent Which is generally taken to be a value with units of seconds and effectively represents the efficiency with which a thruster converts mass to thrust. \subsection{Sims-Flanagan Transcription} - This thesis chose to use a model well suited for modeling low-thrust paths: the + In this thesis the following approach is used for modeling low-thrust paths: the Sims-Flanagan transcription (SFT)\cite{sims1999preliminary}. The SFT allows for flexibility in the trade-off between fidelity and performance, which makes it very useful for this sort of preliminary analysis. @@ -752,7 +675,7 @@ continuous low-thrust trajectory within the Two-Body Problem, with only linearly-increasing computation time\cite{sims1999preliminary}. - \subsection{Low-Thrust Control Laws} + \subsection{Low-Thrust Control Vector Description} In determining a low-thrust arc, a number of variables must be accounted for and, ideally, optimized. Generally speaking, this means that a control law must be determined @@ -765,24 +688,23 @@ The methods for determining this direction varies greatly depending on the particular control law chosen for that mission. Often, this process involves first determining a useful frame to think about the kinematics of the spacecraft. In this case, we'll use a - frame often used in these low-thrust control laws: the spacecraft $\hat{R} \hat{\theta} - \hat{H}$ frame. In this frame, the $\hat{R}$ direction is the radial direction from the - center of the primary to the center of the spacecraft. The $\hat{H}$ hat is - perpendicular to this, in the direction of orbital momentum (out-of-plane) and the - $\hat{\theta}$ direction completes the right-handed orthonormal frame. + frame often used in these low-thrust control laws: the spacecraft-centered $\hat{R} + \hat{\theta} \hat{H}$ frame. In this frame, the $\hat{R}$ direction is the radial + direction from the center of the primary to the center of the spacecraft. The $\hat{H}$ + hat is perpendicular to this, in the direction of orbital momentum (out-of-plane) and + the $\hat{\theta}$ direction completes the right-handed orthonormal triad. This frame is useful because, for a given orbit, especially a nearly circular one, the $\hat{\theta}$ direction is nearly aligned with the velocity direction for that orbit at that moment. This allows us to define a set of two angles, which we'll call $\alpha$ and $\beta$, to represent the in and out of plane pointing direction of the thrusters. This - convention is useful because a $(0,0)$ set represents a thrust force more or less - directly in line with the direction of the velocity, a commonly useful thrusting - direction for most effectively increasing (or decreasing if negative) the angular - momentum and orbital energy of the trajectory. + convention is useful because, in a near-circular path, a $(0,0)$ set represents a thrust + force more or less directly in line with the direction of the velocity, a commonly + useful thrusting direction for most effectively increasing (or decreasing if negative) + the angular momentum and orbital energy of the trajectory. Using these conventions, we can then redefine our thrust vector in terms of the $\alpha$ and $\beta$ angles in the chosen frame: - \begin{align} F_r &= F \cos(\beta) \sin (\alpha) \\ F_\theta &= F \cos(\beta) \cos (\alpha) \\ @@ -791,12 +713,12 @@ \subsubsection{Thrust Magnitude} - However, there is actually another variable that can be varied by the majority of - electric thrusters. Either by controlling the input power of the thruster or the duty - cycle, the thrust magnitude can also be varied, limited by the maximum thrust available - to the thruster. Not all control laws allow for this fine-tuned control of the thruster. + There is another variable that can be varied by the majority of electric thrusters. + Either by controlling the input power of the thruster or the duty cycle, the thrust + magnitude can also be varied, limited by the maximum thrust available to the thruster. + Not all control laws allow for this fine-tuned control of the thruster. - The algorithm used in this thesis does vary the magnitude of the thrust control. In + The approach used in this thesis does vary the magnitude of the thrust control. In certain cases it actually can be useful to have some fine-tuned control over the magnitude of the thrust. Since the optimization in this algorithm is automatic, it is relatively straightforward to consider the control thrust as a 3-dimensional vector in diff --git a/LaTeX/trajectory_optimization.tex b/LaTeX/trajectory_optimization.tex index a3e403f..120266a 100644 --- a/LaTeX/trajectory_optimization.tex +++ b/LaTeX/trajectory_optimization.tex @@ -6,10 +6,11 @@ highly non-linear, unpredictable systems such as this. The field that developed to approach this problem is known as Non-Linear Programming (NLP) Optimization. - A Non-Linear Programming Problem is defined by an attempt to optimize a function + A Non-Linear Programming Problem involves finding a solution that optimizes a function $f(\vec{x})$, subject to constraints $\vec{g}(\vec{x}) \le 0$ and $\vec{h}(\vec{x}) = 0$ where $n$ is a positive integer, $x$ is any subset of $R^n$, $g$ and $h$ can be vector - valued functions of any size, and at least one of $f$, $g$, and $h$ must be non-linear. + valued functions of any size, and at least one of $f$, $\vec{g}$, and $\vec{h}$ must be + non-linear. There are, however, two categories of approaches to solving an NLP. The first category, indirect methods, involve declaring a set of necessary and/or sufficient conditions for @@ -20,10 +21,10 @@ The other category is the direct methods. In a direct optimization problem, the cost function itself provides a value that an iterative numerical optimizer can measure - itself against. The optimal solution is then found by varying the inputs $\vec{x}$ until the - cost function is reduced to a minimum value, often determined by its derivative - jacobian. A number of tools have been developed to optimize NLPs via this direct method - in the general case. + itself against. The optimal solution is then found by varying the inputs $\vec{x}$ until + the cost function is reduced to a minimum value, often determined by its derivative + jacobian. A number of tools have been developed to formulate NLPs for optimization via + this direct method in the general case. Both of these methods have been applied to the problem of low-thrust interplanetary trajectory optimization \cite{Casalino2007IndirectOM} to find local optima over @@ -40,7 +41,7 @@ Therefore, a direct optimization method was leveraged by transcribing the problem into an NLP and using IPOPT to find the local minima. - \subsubsection{Non-Linear Solvers} + \subsection{Non-Linear Solvers} One of the most common packages for the optimization of NLP problems is SNOPT\cite{gill2005snopt}, which is a proprietary package written primarily using a @@ -63,7 +64,7 @@ libraries that port these are quite modular in the sense that multiple algorithms can be tested without changing much source code. - \subsubsection{Interior Point Linesearch Method} + \subsection{Interior Point Linesearch Method} As mentioned above, this project utilized IPOPT which leveraged an Interior Point Linesearch method. A linesearch algorithm is one which attempts to find the optimum @@ -74,7 +75,7 @@ step the initial guess, now labeled $x_{k+1}$ after the addition of the ``step'' vector and iterates this process until predefined termination conditions are met. - \subsubsection{Shooting Schemes for Solving a Two-Point Boundary Value Problem} + \subsection{Shooting Schemes for Solving a Two-Point Boundary Value Problem} One straightforward approach to trajectory corrections is a single shooting algorithm, which propagates a state, given some control variables forward in time to @@ -82,31 +83,22 @@ iterative process, using the correction scheme, until the target state and the propagated state matches. - As an example, we can consider the Two-Point Boundary Value Problem (TPBVP) defined - by: - + As an example, we can consider the one-dimensional Two-Point Boundary Value Problem + (TPBVP) defined by: \begin{equation} y''(t) = f(t, y(t), y'(t)), y(t_0) = y_0, y(t_f) = y_f \end{equation} - - \noindent We can then redefine the problem as an initial-value problem: - \begin{equation} - y''(t) = f(t, y(t), y'(t)), y(t_0) = y_0, y'(t_0) = x + y''(t) = f(t, y(t), y'(t)), y(t_0) = y_0, y'(t_0) = \dot{y}_0 \end{equation} - - \noindent With $y(t,x)$ as a solution to that problem. Furthermore, if $y(t_f, x) = y_f$, then the solution to the initial-value problem is also the solution to the TPBVP as well. Therefore, we can use a root-finding algorithm, such as the bisection method, Newton's Method, or even Laguerre's method, to find the roots of: - \begin{equation} F(x) = y(t_f, x) - y_f \end{equation} - - \noindent To find the solution to the IVP at $x_0$, $y(t_f, x_0)$ which also provides a solution to the TPBVP. This technique for solving a Two-Point Boundary Value Problem can be visualized in Figure~\ref{single_shoot_fig}. @@ -114,7 +106,7 @@ \begin{figure}[H] \centering \includegraphics[width=\textwidth]{fig/single_shoot} - \caption{Visualization of a single shooting technique over a trajectory arc} + \caption{Single shooting over a trajectory arc} \label{single_shoot_fig} \end{figure} @@ -133,8 +125,8 @@ each of these points we can then define a separate control, which may include the states themselves. The end state of each arc and the beginning state of the next must then be equal for a valid arc (with the exception of velocity discontinuities - if allowed for maneuvers at that point), as well as the final state matching the - target final state. + if allowed for maneuvers or gravity assists at that point), as well as the final + state matching the target final state. \begin{figure}[H] \centering @@ -144,7 +136,7 @@ \end{figure} In this example, it can be seen that there are now more constraints (places where - the states need to match up, creating an $x_{error}$ term) as well as control + the states need to match up, creating an $\vec{x}_{error}$ term) as well as control variables (the $\Delta V$ terms in the figure). This technique actually lends itself very well to low-thrust arcs and, in fact, Sims-Flanagan Transcribed low-thrust arcs in particular, because there actually are control thrusts to be optimized at a From 5329d1506727a920e8b59ff7dd43348bb193adeb Mon Sep 17 00:00:00 2001 From: Connor Date: Sat, 19 Mar 2022 13:39:02 -0600 Subject: [PATCH 3/3] Cleaned up makefile, started presentation --- LaTeX/approach.tex | 8 +-- LaTeX/presentation.tex | 50 +++++++++++++++ LaTeX/results.tex | 18 +++--- LaTeX/thesis.tex | 8 +-- LaTeX/trajectory_design.tex | 18 +++--- LaTeX/trajectory_optimization.tex | 4 +- Makefile | 85 ++++++++----------------- best_missions | 3 - email_to_commitee.md | 15 ----- ipopt.out | 0 prelim_notes/paper_notes.md | 102 ------------------------------ prelim_notes/plan.md | 37 ----------- prelim_notes/technical_plan.md | 76 ---------------------- readme.md | 17 +++-- 14 files changed, 115 insertions(+), 326 deletions(-) create mode 100644 LaTeX/presentation.tex delete mode 100644 best_missions delete mode 100644 email_to_commitee.md delete mode 100644 ipopt.out delete mode 100644 prelim_notes/paper_notes.md delete mode 100644 prelim_notes/plan.md delete mode 100644 prelim_notes/technical_plan.md diff --git a/LaTeX/approach.tex b/LaTeX/approach.tex index 0cd7e93..b20cf76 100644 --- a/LaTeX/approach.tex +++ b/LaTeX/approach.tex @@ -114,7 +114,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{flowcharts/nlp} + \includegraphics[width=\textwidth]{LaTeX/flowcharts/nlp} \caption{A flowchart of the TPBVP Solution Approach} \label{nlp} \end{figure} @@ -176,7 +176,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/laguerre_plot} + \includegraphics[width=\textwidth]{LaTeX/fig/laguerre_plot} \caption{Example of a natural trajectory propagated via the Laguerre-Conway approach to solving Kepler's Problem} \label{laguerre_plot} @@ -202,7 +202,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/spiral_plot} + \includegraphics[width=\textwidth]{LaTeX/fig/spiral_plot} \caption{An example trajectory showing that classic continuous-thrust orbit shapes, such as this orbit spiral, are easily achievable using a Sims-Flanagan model} @@ -320,7 +320,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{flowcharts/mbh} + \includegraphics[width=\textwidth]{LaTeX/flowcharts/mbh} \caption{A flowchart visualizing the steps in the monotonic basin hopping algorithm} \label{mbh_flow} diff --git a/LaTeX/presentation.tex b/LaTeX/presentation.tex new file mode 100644 index 0000000..4a1836e --- /dev/null +++ b/LaTeX/presentation.tex @@ -0,0 +1,50 @@ +\documentclass{beamer} +\usetheme{Luebeck} + +\definecolor{color1}{HTML}{3A4040} +\definecolor{color2}{HTML}{F5F2F8} +\definecolor{color3}{HTML}{B65D4E} +\definecolor{color4}{HTML}{B6AD96} +\definecolor{color5}{HTML}{A96041} + +\setbeamercolor*{structure}{bg=color3,fg=color3} +\setbeamercolor*{palette primary}{fg=color1,bg=color4} +\setbeamercolor*{palette secondary}{fg=color1,bg=color2} +\setbeamercolor*{palette tertiary}{fg=color1,bg=color2} +\setbeamercolor*{palette quaternary}{fg=color1,bg=color3} +\setbeamercolor{alerted text}{fg=color1,bg=color3} +\setbeamercolor{titlelike}{bg=color2,fg=color1} +\setbeamercolor*{titlelike}{bg=color2,fg=color1} +\setbeamercolor{frametitle}{bg=color1,fg=color2} +\setbeamercolor{background canvas}{bg=color2,fg=color2} + +\title{Designing Optimal Low-Thrust Interplanetary Trajectories} +\subtitle{Utilizing Monotonic Basin Hopping} +\author{Richard Connor Johnstone} +\institute{University of Colorado -- Boulder} +\date{\today} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\section{Introduction} + + \begin{frame} \frametitle{First Frame} + \begin{itemize} + \item Item 1 + \item Item 2 + \end{itemize} + \end{frame} + +\section{Introduction} + +\section{Introduction} + +\section{Introduction} + +\section{Introduction} + +\end{document} diff --git a/LaTeX/results.tex b/LaTeX/results.tex index 2c7f4fd..57a9a7c 100644 --- a/LaTeX/results.tex +++ b/LaTeX/results.tex @@ -128,7 +128,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMS_plot} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMS_plot} \caption{Depictions of the faster Earth-Mars-Saturn trajectory found by the algorithm to be most efficient; planetary ephemeris arcs are shown during the phase in which the spacecraft approached them} @@ -137,7 +137,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMS_plot_noplanets} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMS_plot_noplanets} \caption{Another depiction of the EMS trajectory, without the planetary ephemeris arcs} \label{ems_nop} @@ -156,14 +156,14 @@ \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMS_thrust_mag} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMS_thrust_mag} \caption{The magnitude of the unit thrust vector over time for the EMS trajectory} \label{ems_mag} \end{figure} \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMS_thrust_components} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMS_thrust_components} \caption{The inertial x, y, and z components of the unit thrust vector over time for the EMS trajectory} \label{ems_components} @@ -212,7 +212,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMJS_plot} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMJS_plot} \caption{Depictions of the slower Earth-Mars-Jupiter-Saturn trajectory found by the algorithm to be the second most efficient; planetary ephemeris arcs are shown during the phase in which the spacecraft approached them} @@ -221,7 +221,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMJS_plot_noplanets} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMJS_plot_noplanets} \caption{Another depiction of the EMJS trajectory, without the planetary ephemeris arcs} \label{emjs_nop} @@ -236,14 +236,14 @@ \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMJS_thrust_mag} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMJS_thrust_mag} \caption{The magnitude of the unit thrust vector over time for the EMJS trajectory} \label{emjs_mag} \end{figure} \begin{figure}[H] \centering - \includegraphics[width=0.9\textwidth]{fig/EMJS_thrust_components} + \includegraphics[width=0.9\textwidth]{LaTeX/fig/EMJS_thrust_components} \caption{The inertial x, y, and z components of the unit thrust vector over time for the EMJS trajectory} \label{emjs_components} @@ -304,7 +304,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/c3} + \includegraphics[width=\textwidth]{LaTeX/fig/c3} \caption{Plot of Delta IV and Atlas V launch vehicle capabilities as they relate to payload mass \cite{c3capabilities} from Vardaxis, et al, 2007 } \label{c3} diff --git a/LaTeX/thesis.tex b/LaTeX/thesis.tex index df7f82f..eee3a48 100644 --- a/LaTeX/thesis.tex +++ b/LaTeX/thesis.tex @@ -1,4 +1,4 @@ -\documentclass[defaultstyle,11pt]{thesis} +\documentclass[defaultstyle,11pt]{LaTeX/thesis} \usepackage{graphicx} \usepackage{amssymb} @@ -61,7 +61,7 @@ \begin{document} - \input macros.tex + \input LaTeX/macros.tex \input LaTeX/introduction.tex @@ -77,8 +77,6 @@ \bibliographystyle{plain} \nocite{*} - \bibliography{thesis} - - \appendix + \bibliography{LaTeX/thesis} \end{document} diff --git a/LaTeX/trajectory_design.tex b/LaTeX/trajectory_design.tex index be54b72..c659e6f 100644 --- a/LaTeX/trajectory_design.tex +++ b/LaTeX/trajectory_design.tex @@ -37,7 +37,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.65\textwidth]{fig/2bp} + \includegraphics[width=0.65\textwidth]{LaTeX/fig/2bp} \caption{Figure representing the positions of the bodies relative to each other and the center of mass in the two body problem} \label{2bp_fig} @@ -148,7 +148,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.8\textwidth]{fig/kepler} + \includegraphics[width=0.8\textwidth]{LaTeX/fig/kepler} \caption{Geometric representation of auxiliary circle}\label{aux_circ} \end{figure} @@ -297,7 +297,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.8\textwidth]{fig/patched_conics} + \includegraphics[width=0.8\textwidth]{LaTeX/fig/patched_conics} \caption{Patched Conics Example Figure} \label{patched_conics_fig} \end{figure} @@ -396,7 +396,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.8\textwidth]{fig/flyby} + \includegraphics[width=0.8\textwidth]{LaTeX/fig/flyby} \caption{Velocity changes during a gravity assist} \label{grav_assist_fig} \end{figure} @@ -470,7 +470,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.8\textwidth]{fig/lamberts} + \includegraphics[width=0.8\textwidth]{LaTeX/fig/lamberts} \caption{Visualization of the possible solutions to Lambert's Problem} \label{type1type2} \end{figure} @@ -587,7 +587,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/porkchop} + \includegraphics[width=\textwidth]{LaTeX/fig/porkchop} \caption{A sample porkchop plot of an Earth-Mars transfer} \label{porkchop} \end{figure} @@ -652,7 +652,7 @@ \begin{figure}[H] \centering - \includegraphics[width=0.6\textwidth]{fig/sft} + \includegraphics[width=0.6\textwidth]{LaTeX/fig/sft} \caption{Example of an orbit raising using the Sims-Flanagan Transcription with 7 Sub-Trajectories} \label{sft_fig} @@ -739,14 +739,14 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/low_efficiency} + \includegraphics[width=\textwidth]{LaTeX/fig/low_efficiency} \caption{Graphic of an orbit-raising with a low efficiency cutoff} \label{low_efficiency_fig} \end{figure} \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/high_efficiency} + \includegraphics[width=\textwidth]{LaTeX/fig/high_efficiency} \caption{Graphic of an orbit-raising with a high efficiency cutoff} \label{high_efficiency_fig} \end{figure} diff --git a/LaTeX/trajectory_optimization.tex b/LaTeX/trajectory_optimization.tex index 120266a..8fe94c9 100644 --- a/LaTeX/trajectory_optimization.tex +++ b/LaTeX/trajectory_optimization.tex @@ -105,7 +105,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/single_shoot} + \includegraphics[width=\textwidth]{LaTeX/fig/single_shoot} \caption{Single shooting over a trajectory arc} \label{single_shoot_fig} \end{figure} @@ -130,7 +130,7 @@ \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{fig/multiple_shoot} + \includegraphics[width=\textwidth]{LaTeX/fig/multiple_shoot} \caption{Visualization of a multiple shooting technique over a trajectory arc} \label{multiple_shoot_fig} \end{figure} diff --git a/Makefile b/Makefile index dce770c..508a010 100644 --- a/Makefile +++ b/Makefile @@ -1,68 +1,39 @@ -OPTIONS = markdown+yaml_metadata_block+smart - -NOTES = $(wildcard prelim_notes/*.md) -NOTES_PDFS = $(patsubst %.md,%.pdf,$(NOTES)) - -THESIS = LaTeX/thesis.tex +SRC_DIR = LaTeX/ +THESIS_SRC_NAMES = thesis.tex thesis.bib approach.tex conclusion.tex introduction.tex \ + results.tex trajectory_design.tex trajectory_optimization.tex +THESIS_SRC = $(addprefix $(SRC_DIR)/,$(THESIS_SRC_NAMES)) +THESIS_PRES_SRC_NAMES = presentation.tex +THESIS_PRES_SRC = $(addprefix $(SRC_DIR)/,$(THESIS_PRES_SRC_NAMES)) +THESIS_PRES = presentation.pdf THESIS_PDF = thesis.pdf +BUILD_DIR = temp/ -all: $(THESIS_PDF) $(NOTES_PDFS) +all: $(THESIS_PDF) $(THESIS_PRES) -$(NOTES_PDFS): $(NOTES) - pandoc \ - --variable mainfont="Roboto" \ - --variable monofont="Fira Code" \ - --variable fontsize=11pt \ - --variable geometry:"top=1in, bottom=1in, left=1in, right=1in" \ - --variable geometry:letterpaper \ - -f markdown $< \ - -o $@ +$(BUILD_DIR): + mkdir -p $(BUILD_DIR) -thesis_pdf/: - mkdir $@ +$(BUILD_DIR)/$(THESIS_PDF): $(BUILD_DIR) $(THESIS_SRC) + xelatex --output-directory $(BUILD_DIR) $(SRC_DIR)/thesis + bibtex $(BUILD_DIR)/thesis + xelatex --output-directory $(BUILD_DIR) $(SRC_DIR)/thesis + xelatex --output-directory $(BUILD_DIR) $(SRC_DIR)/thesis -$(THESIS_PDF): $(THESIS) LaTeX/thesis.bib - mkdir -p temp - cp -r LaTeX/fig . - cp -r LaTeX/flowcharts . - cp -r LaTeX/thesis.tex . - cp -r LaTeX/macros.tex . - cp -r LaTeX/thesis.bib . - cp -r LaTeX/thesis.cls . - xelatex thesis - bibtex thesis - xelatex thesis - xelatex thesis - rm -rf fig - rm -rf flowcharts - cp thesis.pdf temp/. - rm -rf macros.tex - rm -rf thesis.* - cp temp/thesis.pdf . - rm -rf temp +$(BUILD_DIR)/$(THESIS_PRES): $(BUILD_DIR) $(THESIS_PRES_SRC) + xelatex --output-directory $(BUILD_DIR) $(SRC_DIR)/presentation + +$(THESIS_PDF): $(BUILD_DIR)/$(THESIS_PDF) + cp $(BUILD_DIR)/thesis.pdf . + +$(THESIS_PRES): $(BUILD_DIR)/$(THESIS_PRES) + cp $(BUILD_DIR)/presentation.pdf . .PHONY: clean revise clean: rm -rf $(THESIS_PDF) - rm -rf $(NOTES_PDFS) - rm -rf thesis_pdf + rm -rf $(THESIS_PRES) + rm -rf $(BUILD_DIR) -revise: $(THESIS) LaTeX/thesis.bib - mkdir -p temp - cp -r LaTeX/fig . - cp -r LaTeX/flowcharts . - cp -r LaTeX/thesis.tex . - cp -r LaTeX/macros.tex . - cp -r LaTeX/thesis.bib . - cp -r LaTeX/thesis.cls . - xelatex thesis - bibtex thesis - xelatex thesis - xelatex thesis - rm -rf fig - rm -rf flowcharts - cp thesis.pdf temp/. - rm -rf macros.tex - rm -rf thesis.* - cp temp/thesis.pdf . +final: $(THESIS_PDF) $(THESIS_PRES) + rm -rf $(BUILD_DIR) diff --git a/best_missions b/best_missions deleted file mode 100644 index 1ebea84..0000000 --- a/best_missions +++ /dev/null @@ -1,3 +0,0 @@ -./archive/EMMJS_2021-12-03T17:38:37.546/mission -./archive/EMS_2021-12-12T16:01:04.514/mission -./archive/EVMS_2021-12-14T16:31:21.927/mission diff --git a/email_to_commitee.md b/email_to_commitee.md deleted file mode 100644 index 4b5e6c6..0000000 --- a/email_to_commitee.md +++ /dev/null @@ -1,15 +0,0 @@ -Dr. Scheeres, - -I'm currently working on finishing up my Master's Thesis. The topic will be a routine for optimizing -Interplanetary Low-Thrust Trajectories, combining approaches for flyby optimization and low-thrust -trajectory arc optimization. I think that your research interests would make you an ideal fit for a -place on my committee, so I would like to ask if you have any availability to be on my committee -this semester? Currently, I am targeting finish up sometime around March 12th, so it would probably -be a defense in late March or early April, but I have a little room for flexibility if that doesn't -work. - -If you think you may be able to sit on my committee then just let me know and I can begin the -process of determining everyone's availabilities and finding the most appropriate defense date. - -Thanks! -Connor Johnstone diff --git a/ipopt.out b/ipopt.out deleted file mode 100644 index e69de29..0000000 diff --git a/prelim_notes/paper_notes.md b/prelim_notes/paper_notes.md deleted file mode 100644 index e92970d..0000000 --- a/prelim_notes/paper_notes.md +++ /dev/null @@ -1,102 +0,0 @@ -# Notes on Research Papers - -## Neural Networks in Time-Optimal Low-Thrust Interplanetary Transfers - -- For the most part this paper isn't *that* relevant. -- It seems to be a low-fidelity method, or at least, it's fidelity is kind of hard to pin down, - since it uses a neural net. -- However, the neural net is an interesting concept. -- And in fact, this paper advocates for a concept of using the neural net as a predictor. So, say, - given a leg of a particular journey, as in the Englander paper, could I use this technique rather - than Sims-Flanagan transcription in the outer loop? -- Something to consider as an alternative to the method proposed in Englander -- Could also be used to generate initial guesses for the single-shooting methods that I'll have to - use if I use an indirect optimization method. - -## Design and optimization of interplanetary low-thrust trajectory with planetary aerogravity-assist maneuver - -- I didn't realize that this paper is specifically talking about *aero*gravity assists. I don't - think that level of complication is necessary for this paper. I'm going to stick with gravity - assists that don't get into atmospheric effects. - -## Orbital and Angular Motion Construction for Low Thrust Interplanetary Flight - -- This one actually isn't even about optimization. Not relevant -- To be honest, I don't actually understand it very well anyway - -## A Rapid Estimation for Interplanetary Low-Thrust Trajectories Using Support Vector Regression - -- This is another machine-learning approach -- It uses a different approach that I'm not that familiar with (Support Vector Regression) - - It looks like this is a form of regression similar to linear regression, I suppose being used - by the machine learning algorithm for predicting optimal trajectories -- However, it seems like everything that applies in the neural net paper probably apply here as well -- This could be an alternative for predicting optimal trajectories over certain legs of the journey - -## Automated Solution of the Low-Thrust Interplanetary Trajectory Problem - -- This is the Englander paper I mentioned earlier. It seems highly relevant as they're essentially - doing what I'd like to do: producing an automated method for high-level interplanetary low-thrust - mission design including the flybys. -- I need to look up MALTO and GALLOP (established tools that do this) -- This paper also open sources it's code: available [here](https://opensource.gsfc.nasa.gov/projects/emtg/index.php) -- This paper formulates the problem as a *Hybrid Optimal Control Problem*. This requires some - further research by me, but from the paper it seems to be a way of optimizing two seperables - subproblems where one of the subproblems exists as a sub-loop of the other problem (for instance - optimizing flybys in a high-level loop and particular planet-to-planet trajectories as a sub-loop of - that problem). This apparently works because the "outer-loop" uses discrete variables while the - "inner-loop" uses continuous variables. -- The outer loop is based on the "null-gene" transciption from another Englander paper and uses a - genetic algorithm. - - I'm not going to go too deep here into the details of the GA. But there's an entire paper on - it - - The paper does mention that it lends itself well to parallelization, which is true. Kubernetes - cluster? -- The inner loop uses Sim-Flanagan transcription combined with Monotonic Basin Hopping, a method for - single-shooting without initial guesses - - Sims-Flanagan transcription is where you discretize the flight arc into many smaller time - steps and the thrust applied is approximated as an impulsive thrust in the middle of each time - step. - - SFT is considered to be a "medium-fidelity" approach - - For this solver, the trajectory betweens these points is produced as a solution to Kepler's - problem, which is basically just the analytical solution to the 2BP, so that no derivatives or - orbit-propagation is needed, for speed. - - One thing I noted about this approach is that it doesn't seem to include a possibility for - "coasting arcs" or throttling anything less than 100% (though the modeling of what 100% means is - quite thorough), so perhaps we're missing some fidelity there? - - I think SNOPT is used to optimize these "inner-loops". This should be pretty fast since it - just uses Kepler's eq - - The MBH method eliminates the need to solve Lambert's problem for initial guesses. This allows - for a more robust analysis of the search base (if there are global optima further from the local - optima near lambert's solution) but might be slower? I'm not sure. - - The technique is kind of weird, but I suppose it works. -- This paper uses a hierarchy of events starting with the overall *mission*, which separates into - *journies*, which, in the example I'm pursuing will be Earth -> Neptune and Neptune -> Earth (if - applicable, but probably just the first one). Then these journies are further divided into - *phases*, which include each planet -> planet leg. The number of phases and the identities of the - planets are chosen by the algorithm. -- The paper goes into some length to determine what the launch C3, propulsion, power, and ephemeris - modeling are. This is all very useful, but as far as I can tell it's pretty typical, so I won't note - too much about it. - - However, it does mention that SPICE presented some challenges for using a preferable method of - parallelization. As an alternative, the paper mentions that FIRE could be used instead for - ephemeris. Which might be worth looking into. -- The paper also include pseudocode, which is nice - -## Automated Mission Planning via Evolutionary Algorithms - -- This is another Englander paper that gives more details on the outer-loop GA. Useful for details. - -## Multi-Objective Low-Thrust Interplanetary Trajectory Optimization Based on Generalized Logarithmic Spirals - -- This is the first paper I looked at. It's actually quite similar to the Englander paper, but I - think not quite as good -- Again, it formulates the problem as an HOCP. -- However, the "inner-loop" for this problem is an optimization of generalized logarithmic spirals. - I don't think this is a very high fidelity method. -- The outer step uses collocation and an NLP optimizer (looks like it actually might just feed the - guesses into GALLOP, which I assume uses SNOPT, though, to be honest, I can't find much on it from - a quick search) -- I'm leaning toward Englander's approach over this one, perhaps with an alternative being to use - one of the machine-learning approaches from above for the inner loop instead - diff --git a/prelim_notes/plan.md b/prelim_notes/plan.md deleted file mode 100644 index 9f73a0e..0000000 --- a/prelim_notes/plan.md +++ /dev/null @@ -1,37 +0,0 @@ -# Plan After Literature Review - -After reading the papers in the Google Drive (see `paper_notes.md`) I've come up with the following -plan: - -I think that I'd like to follow an approach similar to what I saw in Englander and Morante. However, -I think it makes more sense to follow the Englander approach for the specific optimizers being used -in the inner and outer loops. Specifically this means: - -- Set up the problem as a Hybrid Optimal Control Problem (HOCP) with an inner and an outer loop -- The outer loop will determine the number and identities of the flybys and optimize using a Binary - Genetic Algorithm described by Englander -- The inner loop in Englander uses Sims-Flanagan Transcription optimized using monotonic basin - hopping. This seems like a good approach. I'd like to use this approach, but also consider using, - as an alternative method for comparison, one of the machine-learning algorithms from the other - papers. -- There are a number of other details including modeling launch C3, power, thrust, and ephemeris. - For all of these I'll use either the exact approach from Englander or a similar approach. There - exists an option to use alternatives to SPICE for ephemeris, but I think the parallelization - problems that SPICE poses can be solved in other ways. - - Specifically, I'd like to build this program using a micro-service architecture. This could - allow for deployment using Kubernetes clusters. This will handle the parallelization (by - running multiple inner loop micro-services at once) and allow for simpler use in production - environments if that's ever needed, as kubernetes has a robust integration with most - web-hosting services. This also allows for flexible scalability if improved speed is ever - needed. - -## Open Questions - -- Are there other inner and outer loop optimization approaches I should consider? -- I didn't see a ton of information regarding the specific parameters of the orbital flybys outside - of the number and the identities of the planets. I need to figure out whether Englander approaches - that optimization in the inner or the outer loop -- I would like to use a fast language for this, and ideally one that I could benefit from learning - about (by this I mean, preferably not C++, as I've used that before -- though it does integrate - well with tools like SPICE, so it is a good option). Preferably Rust, as it has the fastest server - libraries, which I don't expect to have a huge overhead, but is something to consider. diff --git a/prelim_notes/technical_plan.md b/prelim_notes/technical_plan.md deleted file mode 100644 index 30c6308..0000000 --- a/prelim_notes/technical_plan.md +++ /dev/null @@ -1,76 +0,0 @@ -# Technical Plan - -## Notes - -- Each of these steps will be completed first in Julia, as I can use that to get - to a working point really quickly. Then, I'll redo the efforts in Rust inside - of docker containers, providing increased robustness and speed. I'll provide - expected time for completion after each item in the form (x/y) where x is the - number of hours I expect to take to write the Julia code and y is the number - of hours I expect to take to write the Rust code. - -## Stages of Development - -1. First I need to set up the inner loop. The inner loop is a Sims-Flanagan transcription - single-shooting algorithm, optimized using monotonic basin-hopping. - a. I've constructed single-shooting algorithms before, and the Sims-Flanagan - transcription is just a really simple notation for approximating low-thrust - arcs. So first I'll need to set up a very simple Sims-Flanagan single - shooter. I don't expect this to take long. I will write a simple - single-shooting algorithm that takes in a start and end state (for now... in - stage 2b below I'll update this to only need the J200 time (for ephemeris - lookup) and the velocity) and solves Kepler's equation to satisfy the - continuity condition. For the rust code, this will require some considerable - initial setup of the docker containers and such, though. (6/20) - b. Next I'll need to set up the monotonic basin-hopping algorithm. I've - written similar optimization algorithms in my spacecraft trajectory - optimization course, but none that use basin-hopping. However, it's more - or less just a genetic algorithm, so it should be simple to set up in a - very general way. The function I'm optimizing can be seen as a system of - inputs (initial and final states) and outputs (mass used, or some other - more complicated measure of optimality), so I can follow many very - descriptive accounts online of this type of genetic algorithm. (12/18) -2. Then I'll need to set up the outer loop. This will require optimizing over - inputs (selection of flybys) by calling the inner loop to optimize each leg - and summing these by way of some cost function. These flyby selections will - be optimized using the genetic algorithm described in the first Englander - paper. - a. First I'll set up a very simple version of the outer loop, that - doesn't optimize anything. It will take in a selection of flybys and - simply call the inner loop for each of the flybys, outputting some cost - function. This shouldn't take long, but at this point I'm adding time - because the inner loop may take some time to call (8/12). - b. There are also some other inputs to this algorithm, that won't change from - problem to problem, but will take some effort to calculate. These include - initial launch C3, ephemeris, problem constraints, etc. SPICE and basic - modeling can be used for most of this, but I should include some time for - incorporating SPICE via C-bindings, which should be relatively easy in - both Julia and Rust (in fact, a wrapper exists at least in Julia - already). As a less high fidelity backup, I've also modeled ephemeris by - polynomials before, so I can do that again, if I find incorporating SPICE - is taking too long (16/16) - c. Next, I'll write the genetic algorithm in a very general way, as before. - This is a different GA (a Binary Genetic Algorithm, suited for discrete - problems), but the algorithm is described in-depth in the first Englander - paper and I also can refer to the source code from the second Englander - paper. In the first paper, he mentions that he used Matlab's - implementation. It seems Julia also has an implementation, so this should - be simple in Julia, but I will include significant extra time in Rust, in - case that is more difficult (6/32) - d. From there, calling my outer-loop implementation from the GA should be - simple. However, I will include extra time for the rust implementation, - because I will also have to consider spinning up extra kubernetes - instances for each inner and outer loop. (6/32) -3. From here, the work is more or less done. There will be some finalizing to - do, including setting up the Kubernetes cluster for the Rust implementation. - I've not set up a Kubernetes cluster before, but I have set up docker-compose - setups for Rust code, so I would anticipate an extra 10 hours being needed - for transitioning that. I will also have to provide a sort of wrapper - function that parses the inputs and spins up/calls each lower loop of this - optimizer. That should be really simple, but I'm including some slop time in - this category to account for administrative issues, particularly in setting - up the deployment of the cluster (12/32) - -## Summary - -So, in total, that comes out to 66 hours of coding for the initial Julia implementation and then another 162 hours for the re-implementation in Rust using docker + kubernetes and the deployment of the cluster. At a rate of 20 hours/week, which seems reasonable, as I will have my job to account for, but I am finished with classes, that comes out to roughly 3.5 weeks to finish the first implementation and then 8 weeks to finalize. I think, if anything, that's very conservative, particularly on the Rust side, as I've got a decent amount of experience in web-based deployment, so I shouldn't have as much trouble with Kubernetes and Docker as I've outlined. But it's also worth noting that the Julia implementation is probably perfectly proficient for a Master's Thesis. If the Rust work is too much, then I can write the thesis on the Julia implementation. diff --git a/readme.md b/readme.md index 7a86851..e7cd5bc 100644 --- a/readme.md +++ b/readme.md @@ -2,10 +2,7 @@ This will be a repository for my code while I work on my thesis. The general idea is to generate a method for automatically producing optimal low-thrust trajectories (including optimizations of the -planetary flybys) for a sample mission to Neptune. - -For now, it will just be a location for storing my notes as I come up with a plan. I will update -this readme as I flush out the plan a little better and then as I begin producing code. +planetary flybys) for a sample mission to Saturn. ## Dependencies @@ -34,8 +31,14 @@ Pkg.build() To produce the pdfs, simply run: -```bash -make +```bash +make ``` -### Julia Code +They will go in the build directory + +To produce final pdfs: + +```bash +make final +```