From 66efb062d4e56c619e773610a577b3640d06f0ed Mon Sep 17 00:00:00 2001 From: Anson Biggs Date: Fri, 7 May 2021 09:54:03 -0700 Subject: [PATCH] finished eclipse det --- .../citations.bib | 32 ++--- .../iss-eclipse-determination.Rmd | 42 +++---- .../iss-eclipse-determination.html | 43 +++---- .../figure-html5/sunlight-plot-J1.png | Bin 0 -> 22194 bytes docs/index.xml | 119 +----------------- .../citations.bib | 32 ++--- .../index.html | 43 +++---- .../figure-html5/sunlight-plot-J1.png | Bin 0 -> 22194 bytes docs/posts/posts.json | 8 +- docs/search.json | 4 +- docs/sitemap.xml | 4 +- 11 files changed, 96 insertions(+), 231 deletions(-) create mode 100644 _posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination_files/figure-html5/sunlight-plot-J1.png create mode 100644 docs/posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination_files/figure-html5/sunlight-plot-J1.png diff --git a/_posts/2021-04-14-iss-eclipse-determination/citations.bib b/_posts/2021-04-14-iss-eclipse-determination/citations.bib index db9cc12..6578764 100644 --- a/_posts/2021-04-14-iss-eclipse-determination/citations.bib +++ b/_posts/2021-04-14-iss-eclipse-determination/citations.bib @@ -1,24 +1,3 @@ - -@book{shackelford_introduction_2015, - address = {Boston}, - edition = {Eighth edition}, - title = {Introduction to materials science for engineers}, - isbn = {9780133826654}, - publisher = {Pearson}, - author = {Shackelford, James F.}, - year = {2015}, - keywords = {Materials}, -} - -@book{curtis_orbital_2021, - title = {Orbital mechanics for engineering students}, - isbn = {9780128240250 9780323853453 9780081021330}, - language = {English}, - author = {Curtis, Howard D}, - year = {2021}, - note = {OCLC: 1235349370}, -} - @misc{ariss, title = {{ARISS} {TLE}}, shorttitle = {{ARISS}}, @@ -27,3 +6,14 @@ journal = {Amateur Radio on the International Space Station}, note = {publisher: ARISS}, } + +@book{vallado, + address = {Dordrecht}, + title = {Fundamentals of {Astrodynamics} and {Applications}, 2nd. ed.}, + isbn = {0-07-066829-9}, + publisher = {Microcosm, Inc}, + author = {Vallado, David A.}, + editor = {Larson, Wiley}, + collaborator = {McClain, Wayne}, + year = {1997}, +} \ No newline at end of file diff --git a/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.Rmd b/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.Rmd index ff56c80..b72c549 100644 --- a/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.Rmd +++ b/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.Rmd @@ -6,7 +6,6 @@ draft: false author: - name: Anson Biggs url: https://ansonbiggs.com -repository_url: https://gitlab.com/lander-team/air-prop-simulation date: 05-01-2021 fig_width: 6 fig_align: "center" @@ -21,7 +20,7 @@ creative_commons: CC BY preview: preview.png --- -Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space with no solar radiation to power the solar panels and keep the spacecraft from freezing. +Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space where it will receive no solar radiation to power the solar panels and keep the spacecraft from freezing. ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE, results = 'hide') @@ -33,15 +32,15 @@ julia_setup(JULIA_HOME = "/opt/julia-1.6.0/bin/") ![Geometry of an Eclipse](geometry.svg) -The above image is a simple representation of what an eclipse is. You'll notice there is the Umbra which is complete darkness, then the Penumbra which is a shadow of varying darkness, and then the rest of the orbit is in complete sunlight. For this example I will be using the ISS which has a very low orbit so the Penumbra isn't much of a problem. You can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra. +The above image is a simple representation of what an eclipse is. First, you'll notice the Umbra is complete darkness, then the Penumbra, which is a shadow of varying darkness, and then the rest of the orbit is in full sunlight. For this example, I will be using the ISS, which has a very low orbit, so the Penumbra isn't much of a problem. However, you can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra. ![Body Radius's and Position Vectors](vectors_radiuss.svg) -Here is a more detailed view of the eclipse that will make it easier to explain the code. There are 2 Position vectors and 2 radius's that need to be known for simple eclipse determination. There are more advanced cases where the atmosphere of the body your orbiting can greatly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun, but for this example we will keep it simple since those have very little affect for the ISS's orbit. Rsun and Rbody are the radius's of the Sun and Body (In this case Earth) respectively. r_sun_body is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination its important to calculate this at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate [Ephemerides](https://ssd.jpl.nasa.gov/?ephemerides) in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. r_body_sc is a position vector from the center of the body being orbitted, to the center of our spacecraft. +Here is a more detailed view of the eclipse that will make it easier to explain what is going on. There are 2 Position vectors, and 2 radius that need to be known for simple eclipse determination. More advanced cases where the atmosphere of the body your orbiting can significantly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun. However, we will keep it simple for this example since they have minimal effect on the ISS’s orbit. Rsun and Rbody are the radius of the Sun and Body (In this case Earth), respectively. r_sun_body is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination it is important to calculate the ephemeris at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate [Ephemerides](https://ssd.jpl.nasa.gov/?ephemerides) in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. r_body_sc is a position vector from the center of the body being orbited, to the center of our spacecraft. ## The Code -```{julia, code_folding=TRUE} +```{julia imports, code_folding=TRUE} using Unitful using LinearAlgebra using SatelliteToolbox @@ -50,9 +49,9 @@ using Colors theme(:ggplot2) ``` -In order to get the orbit for the ISS I used a [Two-Line Element](https://en.wikipedia.org/wiki/Two-line_element_set) which is a data format for explaining orbits. the US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible [@ariss]. The Julia Package [SatelliteToolbox.jl](https://github.com/JuliaSpace/SatelliteToolbox.jl) makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the `tle` string macro like below and now we have access to the information to start making our ISS orbit. +To get the orbit for the ISS, I used a [Two-Line Element](https://en.wikipedia.org/wiki/Two-line_element_set) which is a data format for explaining orbits. The US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible [@ariss]. The Julia Package [SatelliteToolbox.jl](https://github.com/JuliaSpace/SatelliteToolbox.jl) makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the `tle` string macro like below, we now have access to the information to start making our ISS orbit. -```{julia, results='show'} +```{julia ISS, results='show'} ISS = tle""" ISS (ZARYA) 1 25544U 98067A 21103.84943184 .00000176 00000-0 11381-4 0 9990 @@ -60,23 +59,21 @@ ISS (ZARYA) """ ``` -Now that we have the TLE we can pass that into SatelliteToolbox's orbit propagator. Before we can propagate the orbit we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day so using that we can calculate the amount of time required for one orbit which is all that were worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector. +Now that we have the TLE, we can pass that into SatelliteToolbox's orbit propagator. Before propagating the orbit, we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day, so using that, we can calculate the amount of time required for one orbit, which is all that we're worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector. -```{juliam result='show'} +```{julia mean-motion, result='show'} ISS[1].n ``` -```{julia} +```{julia orbit-propagation} orbit = init_orbit_propagator(Val(:twobody), ISS[1]); time = 0:0.1:((24 / ISS[1].n) .* 60 * 60); # ISS[1].n gives the mean motion, or orbits per day. o, r, v = propagate!(orbit, time); ``` -Now we just need way to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of pretty basic trigonometry and vector math. +We just need to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of trigonometry and vector math that I won't bore anyone with. However, using the diagrams above and following the code in the sunlight function, you should follow what's happening. For a rigorous discussion, check out [@vallado]. -`add more discussion about the math` - -```{julia} +```{julia sunlight-function} function sunlight(Rbody, r_sun_body, r_body_sc) Rsun = 695_700u"km" @@ -110,9 +107,9 @@ S = r .|> R -> sunlight(6371u"km", [0.5370, 1.2606, 0.5466] .* 1e8u"km", R .* u" ## Plotting the Results -The `sunlight` function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spend in the penumbra is almost insignificant. +The `sunlight` function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spent in the penumbra is almost insignificant. -```{julia, code_folding=TRUE, results='show',layout="l-body-outset",fig.cap= "ISS Sunlight", preview=TRUE } +```{julia sunlight-plot, code_folding=TRUE, results='show',layout="l-body-outset",fig.cap= "ISS Sunlight", preview=TRUE } # Get fancy with the line color. light_range = range(colorant"black", stop = colorant"orange", length = 101); light_colors = [light_range[unique(round(Int, 1 + s * 100))][1] for s in S]; @@ -130,21 +127,24 @@ ylabel!("Sunlight (%)"); title!("ISS Sunlight Over a Day") ``` -Looking at the plot its pretty easy to see by the vertical transition from 0% to 100% that the time in the penumbra is limited, but almost counterintutively it also looks like the ISS gets more sunlight than it does darkness. Using the raw sunlight data we can actually calculate almost exactly how much time is spent in each region. +Looking at the plot, the vertical transition from 0% to 100% makes it pretty clear that the time in the penumbra is limited. Still, almost counterintuitively, it also looks like the ISS gets more sunlight than it does darkness. So, using the raw sunlight data, we can calculate precisely how much time is spent in each region. Time in Sun: -```{julia, results='show'} + +```{julia sun-time, results='show'} sun = length(S[S.==1])/length(S) * 100 ``` Time in Darkness: -```{julia, results='show'} + +```{julia dark-time, results='show'} umbra = length(S[S.==0])/length(S) * 100 ``` Time in Penumbra: -```{julia, results='show'} + +```{julia penum-time, results='show'} penumbra = 100 - umbra - sun ``` -The ISS spends about 62% of its time in the sun, this is because if you go back and reference the diagram at the beginning of this post you can see that the umbra is actually a cone. This is mainly due to the fact that the Sun is massive compared to the Earth, but this effect is also stronger with orbits of higher altitudes. +This means that even with the ISS's low orbit, it still gets sunlight ~62% of the time and spends almost no time in the penumbra. This would vary a few percent depending on the time of year, but in a circular orbit like the ISS, the amount of sunlight would remain pretty constant. There are other orbits like a polar orbit, lunar orbit, or highly elliptic earth orbits that can have their time in the sunlight vary widely by the time of year. diff --git a/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.html b/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.html index 7f92793..39d14cf 100644 --- a/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.html +++ b/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.html @@ -111,15 +111,16 @@ code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */ + @@ -1485,16 +1486,16 @@ code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */
-

Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space with no solar radiation to power the solar panels and keep the spacecraft from freezing.

+

Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space where it will receive no solar radiation to power the solar panels and keep the spacecraft from freezing.

What is an Eclipse

Geometry of an Eclipse
-

The above image is a simple representation of what an eclipse is. You’ll notice there is the Umbra which is complete darkness, then the Penumbra which is a shadow of varying darkness, and then the rest of the orbit is in complete sunlight. For this example I will be using the ISS which has a very low orbit so the Penumbra isn’t much of a problem. You can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra.

+

The above image is a simple representation of what an eclipse is. First, you’ll notice the Umbra is complete darkness, then the Penumbra, which is a shadow of varying darkness, and then the rest of the orbit is in full sunlight. For this example, I will be using the ISS, which has a very low orbit, so the Penumbra isn’t much of a problem. However, you can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra.

Body Radius’s and Position Vectors
-

Here is a more detailed view of the eclipse that will make it easier to explain the code. There are 2 Position vectors and 2 radius’s that need to be known for simple eclipse determination. There are more advanced cases where the atmosphere of the body your orbiting can greatly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun, but for this example we will keep it simple since those have very little affect for the ISS’s orbit. Rsun and Rbody are the radius’s of the Sun and Body (In this case Earth) respectively. r_sun_body is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination its important to calculate this at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate Ephemerides in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. r_body_sc is a position vector from the center of the body being orbitted, to the center of our spacecraft.

+

Here is a more detailed view of the eclipse that will make it easier to explain what is going on. There are 2 Position vectors, and 2 radius that need to be known for simple eclipse determination. More advanced cases where the atmosphere of the body your orbiting can significantly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun. However, we will keep it simple for this example since they have minimal effect on the ISS’s orbit. Rsun and Rbody are the radius of the Sun and Body (In this case Earth), respectively. r_sun_body is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination it is important to calculate the ephemeris at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate Ephemerides in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. r_body_sc is a position vector from the center of the body being orbited, to the center of our spacecraft.

The Code

@@ -1509,7 +1510,7 @@ Show code theme(:ggplot2)
-

In order to get the orbit for the ISS I used a Two-Line Element which is a data format for explaining orbits. the US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible (ARISS TLE,” n.d.). The Julia Package SatelliteToolbox.jl makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the tle string macro like below and now we have access to the information to start making our ISS orbit.

+

To get the orbit for the ISS, I used a Two-Line Element which is a data format for explaining orbits. The US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible (ARISS TLE,” n.d.). The Julia Package SatelliteToolbox.jl makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the tle string macro like below, we now have access to the information to start making our ISS orbit.

ISS = tle"""
 ISS (ZARYA)
@@ -1519,17 +1520,16 @@ Show code
 
1-element Vector{TLE}:
  TLE: ISS (ZARYA) (Epoch = 2021-04-13T20:23:10.911)
-

Now that we have the TLE we can pass that into SatelliteToolbox’s orbit propagator. Before we can propagate the orbit we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day so using that we can calculate the amount of time required for one orbit which is all that were worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector.

+

Now that we have the TLE, we can pass that into SatelliteToolbox’s orbit propagator. Before propagating the orbit, we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day, so using that, we can calculate the amount of time required for one orbit, which is all that we’re worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector.

-
ISS[1].n
+
ISS[1].n
orbit = init_orbit_propagator(Val(:twobody), ISS[1]);
 time = 0:0.1:((24 / ISS[1].n) .* 60 * 60); # ISS[1].n gives the mean motion, or orbits per day.
 o, r, v = propagate!(orbit, time);
-

Now we just need way to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of pretty basic trigonometry and vector math.

-

add more discussion about the math

+

We just need to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of trigonometry and vector math that I won’t bore anyone with. However, using the diagrams above and following the code in the sunlight function, you should follow what’s happening. For a rigorous discussion, check out (Vallado 1997).

function sunlight(Rbody, r_sun_body, r_body_sc)
     Rsun = 695_700u"km"
@@ -1560,7 +1560,7 @@ Show code
 
S = r .|> R -> sunlight(6371u"km", [0.5370, 1.2606, 0.5466] .* 1e8u"km", R .* u"m");

Plotting the Results

-

The sunlight function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spend in the penumbra is almost insignificant.

+

The sunlight function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spent in the penumbra is almost insignificant.

@@ -1582,35 +1582,38 @@ Show code ylabel!("Sunlight (%)"); title!("ISS Sunlight Over a Day")
-
-ISS Sunlight +
+ISS Sunlight

Figure 1: ISS Sunlight

-

Looking at the plot its pretty easy to see by the vertical transition from 0% to 100% that the time in the penumbra is limited, but almost counterintutively it also looks like the ISS gets more sunlight than it does darkness. Using the raw sunlight data we can actually calculate almost exactly how much time is spent in each region.

-Time in Sun: +

Looking at the plot, the vertical transition from 0% to 100% makes it pretty clear that the time in the penumbra is limited. Still, almost counterintuitively, it also looks like the ISS gets more sunlight than it does darkness. So, using the raw sunlight data, we can calculate precisely how much time is spent in each region.

+

Time in Sun:

sun = length(S[S.==1])/length(S) * 100
62.03323593209401
-Time in Darkness: +

Time in Darkness:

umbra = length(S[S.==0])/length(S) * 100
37.64408511553699
-Time in Penumbra: +

Time in Penumbra:

penumbra = 100 - umbra - sun
0.322678952369003
-

The ISS spends about 62% of its time in the sun, this is because if you go back and reference the diagram at the beginning of this post you can see that the umbra is actually a cone. This is mainly due to the fact that the Sun is massive compared to the Earth, but this effect is also stronger with orbits of higher altitudes.

+

This means that even with the ISS’s low orbit, it still gets sunlight ~62% of the time and spends almost no time in the penumbra. This would vary a few percent depending on the time of year, but in a circular orbit like the ISS, the amount of sunlight would remain pretty constant. There are other orbits like a polar orbit, lunar orbit, or highly elliptic earth orbits that can have their time in the sunlight vary widely by the time of year.

ARISS TLE.” n.d. Amateur Radio on the International Space Station. https://live.ariss.org/tle/.
+
+Vallado, David A. 1997. Fundamentals of Astrodynamics and Applications, 2nd. Ed. Edited by Wiley Larson. Dordrecht: Microcosm, Inc. +
@@ -1626,10 +1629,8 @@ Time in Penumbra:

References

-

Corrections

-

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

-

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. Source code is available at https://gitlab.com/lander-team/air-prop-simulation, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

+

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

diff --git a/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination_files/figure-html5/sunlight-plot-J1.png b/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination_files/figure-html5/sunlight-plot-J1.png new file mode 100644 index 0000000000000000000000000000000000000000..797f95eeca6fa8f719e21b22c710c36e1207fba8 GIT binary patch literal 22194 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

+mK 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 literal 0 HcmV?d00001 diff --git a/docs/index.xml b/docs/index.xml index 7fc9be5..2c58792 100644 --- a/docs/index.xml +++ b/docs/index.xml @@ -23,124 +23,7 @@ Air Propulsion Simulation Anson Biggs https://projects.ansonbiggs.com/posts/2021-04-01-air-propulsion-simulation - - - -<p>For Capstone my team was tasked with designing a system capable of moving mining equipment and materials around the surface of the Moon using a propulsive landing. The system had to be tested on Earth with something feasible for our team to build in 2 semesters. One of the first considerations my capstone advisor wanted was to test the feasibility of an air propulsion system instead of the obvious solution that of using solid rocket motors. This document is just <em>napkin math</em> to determine if the system is even feasibly and is not meant to be a rigorous study of an air propulsion system that would easily keep a capstone team busy by itself.</p> -<pre class="julia"><code>using Plots -theme(:ggplot2); # In true R spirit - -using Unitful -using DataFrames -using Measurements -using Measurements: value, uncertainty -using CSV</code></pre> -<h2 id="the-simulation">The Simulation</h2> -<p>I chose an off-the-shelf paintball gun tank for the pressure vessel. The primary consideration was the incredible pressure to weight ratio, and the fact that it is designed to be bumped around would be necessary for proving the safety of the system further into the project.</p> -<pre class="julia"><code># Tank https://www.amazon.com/Empire-Paintball-BASICS-Pressure-Compressed/dp/B07B6M48SR/ -V = (85 ± 5)u&quot;inch^3&quot; -P0 = (4200.0 ± 300)u&quot;psi&quot; -Wtank = (2.3 ± 0.2)u&quot;lb&quot; -Pmax = (250 ± 50)u&quot;psi&quot; # Max Pressure that can come out the nozzle</code></pre> -<p>The nozzle diameter was changed until the air prop system had a <em>burn time</em> similar to a G18ST rocket motor. The propulsion system’s total impulse is not dependant on the nozzle diameter, so this was just done to make it plot nicely with the rest of the rocket motors since, at this time, it is unknown what the optimal thrust profile is.</p> -<pre class="julia"><code># Params -d_nozzle = ((1 // 18) ± 0.001)u&quot;inch&quot; -a_nozzle = (pi / 4) * d_nozzle^2</code></pre> -<p>These are just universal values for what a typical day would look like during the summer in Northern Arizona. <span class="citation">(Çengel and Boles 2015)</span></p> -<pre class="julia"><code># Universal Stuff -P_amb = (1 ± 0.2)u&quot;atm&quot; -γ = 1.4 ± 0.05 -R = 287.05u&quot;J/(kg * K)&quot; -T = (300 ± 20)u&quot;K&quot;</code></pre> -<p>The actual simulation is quite simple. The basic idea is that using the current pressure, you can calculate <span class="math inline">\(\dot{m}\)</span>, which allows calculating the Thrust, and then you can subtract the current mass of air in the tank by <span class="math inline">\(\dot{m}\)</span> and recalculate pressure using the new mass then repeat the whole process.</p> -<p>The bulk of the equations in the simulation came from <span class="citation">(Çengel and Boles 2015)</span>, while the Thrust and <span class="math inline">\(v_e\)</span> equations came from <span class="citation">(Sutton and Biblarz 2001, eq: 2-14)</span>.</p> -<p><span class="math display">\[ T = \dot{m} \cdot v_\text{Exit} + A_\text{Nozzle} \cdot (P - P_\text{Ambient}) \]</span></p> -<p>The initial pressure difference is 4190.0 ± 300.0 psi, which is massive, so the area of the nozzle significantly alters the thrust profile. The paintball tanks come with pressure regulators, in our case, 800 psi which is still a huge number compared to atmospheric pressure. While the total impulse of the system doesn’t change with different nozzle areas, the peak thrust and <em>burn time</em> vary greatly. One of the benefits of doing air propulsion and the reason it was even considered so seriously is that it should be possible to change the nozzle diameter in flight, allowing thrust to be throttled, making controlled landing easier to control.</p> -<pre class="julia"><code>df = let -t = 0.0u&quot;s&quot; -P = P0 |&gt; u&quot;Pa&quot; -M = V * (P / (R * T)) |&gt; u&quot;kg&quot; -ts = 1u&quot;ms&quot; -df = DataFrame(Thrust=(0 ± 0)u&quot;N&quot;, Pressure=P0, Time=0.0u&quot;s&quot;, Mass=M) - while M &gt; 0.005u&quot;kg&quot; - # Calculate what is leaving tank - P = minimum([P, Pmax]) - ve = sqrt((2 * γ / (γ - 1)) * R * T * (1 - P_amb / P)^((γ - 1) / γ)) |&gt; u&quot;m/s&quot; - ρ = P / (R * T) |&gt; u&quot;kg/m^3&quot; - ṁ = ρ * a_nozzle * ve |&gt; u&quot;kg/s&quot; - - Thrust = ṁ * ve + a_nozzle * (P - P_amb) |&gt; u&quot;N&quot; - - # Calculate what is still in the tank - M = M - ṁ * ts |&gt; u&quot;kg&quot; - P = (M * R * T) / V |&gt; u&quot;Pa&quot; - t = t + ts - - df_step = DataFrame(Thrust=Thrust, Pressure=P, Time=t, Mass=M) - append!(df, df_step) - end - df -end</code></pre> -<h2 id="analysis">Analysis</h2> -<p>Below in figure 1, the result of the simulation is plotted. Notice the massive error once the tank starts running low. This is because the calculation for pressure has a lot of very uncertain variables. This is primarily due to air being a compressible fluid, making this simulation challenging to do accurately. The thrust being below 0 N might not make intuitive sense, but it’s technically possible for the pressure to compress, leaving the inside of the rocket nozzle with a pressure that’s actually below atmospheric pressure. The effect would likely last a fraction of a second, but the point stands that this simulation is wildly inaccurate and only meant to get an idea of what an air propulsion system is capable of.</p> -<pre class="julia"><code> -thrust_values = df.Thrust .|&gt; ustrip .|&gt; value; -thrust_uncertainties = df.Thrust .|&gt; ustrip .|&gt; uncertainty; - -air = DataFrame(Thrust=thrust_values, Uncertainty=thrust_uncertainties, Time=df.Time .|&gt; u&quot;s&quot; .|&gt; ustrip); - - -plot(df.Time .|&gt; ustrip, thrust_values, - title=&quot;Thrust Over Time&quot;, - ribbon=(thrust_uncertainties, thrust_uncertainties), - fillalpha=.2,label=&quot;Thrust&quot;, - xlabel=&quot;Time (s)&quot;, - ylabel=&quot;Thrust (N)&quot;, - )</code></pre> -<div class="figure"> -<img src="file622ef5a388f_files/figure-html/unnamed-chunk-6-J1.png" alt="Air Proplsion Simulation" width="300" /> -<p class="caption"> -(#fig:unnamed-chunk-6)Air Proplsion Simulation -</p> -</div> -<p>In Figure 2, the air propulsion simulation is compared to commercially available rocket motors. This early in the project, we have no idea whether short burns or longer burns are ideal for a propulsive landing, so the air propulsion system was compared to a variety of different motors with unique profiles.</p> -<pre class="julia"><code> -f10 = CSV.read(&quot;AeroTech_F10.csv&quot;, DataFrame); -f15 = CSV.read(&quot;Estes_F15.csv&quot;, DataFrame); -g8 = CSV.read(&quot;AeroTech_G8ST.csv&quot;, DataFrame); - - -plot(air.Time, air.Thrust, label=&quot;Air Propulsion&quot;, legend=:topleft); - -for (d, l) in [(f10, &quot;F10&quot;), (f15, &quot;F15&quot;), (g8, &quot;G8ST&quot;)] - plot!(d[!,&quot;Time (s)&quot;], d[!, &quot;Thrust (N)&quot;], label=l); -end - -title!(&quot;Propulsion Comparison&quot;); -xlabel!(&quot;Time (s)&quot;); -ylabel!(&quot;Thrust (N)&quot;)</code></pre> -<div class="figure"> -<img src="file622ef5a388f_files/figure-html/unnamed-chunk-7-J1.png" alt="Rocket Motor Data: [@thrustcurve]" width="300" data-distill-preview=1 /> -<p class="caption"> -(#fig:unnamed-chunk-7)Rocket Motor Data: <span class="citation">(Coker, n.d.)</span> -</p> -</div> -<p>In the end, the air propulsion system’s performance has a very impressive total impulse and, with more time and resources, could be a serious option for a propulsive landing on Earth. One of the largest abstractions from the Moon mission that the mission here on Earth will have to deal with is the lack of Throttling engines since any propulsion system outside of model rocket motors is well beyond the scope of this Capstone.</p> -<h2 id="future-work">Future Work</h2> -<p>After determining that solid model rocket motors are the best option for the current mission scope, the next step is determining what motor to use. There are many great options, and deciding what thrust profile is ideal may have to wait until a Simulink simulation of the landing can be built so that the metrics of each motor can be constrained more. Instead of throttling motors, the current working idea is that thrust vector control may be a way to squeeze a little more control out of a solid rocket motor. Thrust Vector Control will undoubtedly be challenging to control, so another essential piece that needs exploring is whether an LQR controller is feasible or if a PID controller is accurate enough to control our system.</p> -<pre class="r distill-force-highlighting-css"><code></code></pre> -<div id="refs" class="references csl-bib-body hanging-indent"> -<div id="ref-thrustcurve" class="csl-entry"> -Coker, John. n.d. <span>“Rocket <span>Motor</span> <span>Data</span>.”</span> <a href="https://www.thrustcurve.org/">https://www.thrustcurve.org/</a>. -</div> -<div id="ref-cengel_thermodynamics" class="csl-entry"> -Çengel, Yunus A., and Michael A. Boles. 2015. <em>Thermodynamics: An Engineering Approach</em>. Eighth edition. New York: McGraw-Hill Education. -</div> -<div id="ref-sutton_rocket_2001" class="csl-entry"> -Sutton, George P., and Oscar Biblarz. 2001. <em>Rocket Propulsion Elements</em>. 7th ed. New York: John Wiley &amp; Sons. -</div> -</div> - dbf2ace5c1414ee7c72e89cac1535434 + Simulating the performance of an air propulsion system as an alternative to solid rocket motors. Julia Capstone https://projects.ansonbiggs.com/posts/2021-04-01-air-propulsion-simulation diff --git a/docs/posts/2021-04-14-iss-eclipse-determination/citations.bib b/docs/posts/2021-04-14-iss-eclipse-determination/citations.bib index db9cc12..6578764 100644 --- a/docs/posts/2021-04-14-iss-eclipse-determination/citations.bib +++ b/docs/posts/2021-04-14-iss-eclipse-determination/citations.bib @@ -1,24 +1,3 @@ - -@book{shackelford_introduction_2015, - address = {Boston}, - edition = {Eighth edition}, - title = {Introduction to materials science for engineers}, - isbn = {9780133826654}, - publisher = {Pearson}, - author = {Shackelford, James F.}, - year = {2015}, - keywords = {Materials}, -} - -@book{curtis_orbital_2021, - title = {Orbital mechanics for engineering students}, - isbn = {9780128240250 9780323853453 9780081021330}, - language = {English}, - author = {Curtis, Howard D}, - year = {2021}, - note = {OCLC: 1235349370}, -} - @misc{ariss, title = {{ARISS} {TLE}}, shorttitle = {{ARISS}}, @@ -27,3 +6,14 @@ journal = {Amateur Radio on the International Space Station}, note = {publisher: ARISS}, } + +@book{vallado, + address = {Dordrecht}, + title = {Fundamentals of {Astrodynamics} and {Applications}, 2nd. ed.}, + isbn = {0-07-066829-9}, + publisher = {Microcosm, Inc}, + author = {Vallado, David A.}, + editor = {Larson, Wiley}, + collaborator = {McClain, Wayne}, + year = {1997}, +} \ No newline at end of file diff --git a/docs/posts/2021-04-14-iss-eclipse-determination/index.html b/docs/posts/2021-04-14-iss-eclipse-determination/index.html index adbd0ee..2a478ce 100644 --- a/docs/posts/2021-04-14-iss-eclipse-determination/index.html +++ b/docs/posts/2021-04-14-iss-eclipse-determination/index.html @@ -128,15 +128,16 @@ code span.wa { color: #5e5e5e; font-style: italic; } /* Warning */ + @@ -2127,16 +2128,16 @@ document.addEventListener('DOMContentLoaded', function() {

-

Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space with no solar radiation to power the solar panels and keep the spacecraft from freezing.

+

Determining the eclipses a satellite will encounter is a major driving factor when designing a mission in space. Thermal and power budgets have to be made with the fact that a satellite will periodically be in the complete darkness of space where it will receive no solar radiation to power the solar panels and keep the spacecraft from freezing.

What is an Eclipse

Geometry of an Eclipse
-

The above image is a simple representation of what an eclipse is. You’ll notice there is the Umbra which is complete darkness, then the Penumbra which is a shadow of varying darkness, and then the rest of the orbit is in complete sunlight. For this example I will be using the ISS which has a very low orbit so the Penumbra isn’t much of a problem. You can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra.

+

The above image is a simple representation of what an eclipse is. First, you’ll notice the Umbra is complete darkness, then the Penumbra, which is a shadow of varying darkness, and then the rest of the orbit is in full sunlight. For this example, I will be using the ISS, which has a very low orbit, so the Penumbra isn’t much of a problem. However, you can tell by looking at the diagram that higher altitude orbits would spend more time in the Penumbra.

Body Radius’s and Position Vectors
-

Here is a more detailed view of the eclipse that will make it easier to explain the code. There are 2 Position vectors and 2 radius’s that need to be known for simple eclipse determination. There are more advanced cases where the atmosphere of the body your orbiting can greatly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun, but for this example we will keep it simple since those have very little affect for the ISS’s orbit. Rsun and Rbody are the radius’s of the Sun and Body (In this case Earth) respectively. r_sun_body is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination its important to calculate this at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate Ephemerides in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. r_body_sc is a position vector from the center of the body being orbitted, to the center of our spacecraft.

+

Here is a more detailed view of the eclipse that will make it easier to explain what is going on. There are 2 Position vectors, and 2 radius that need to be known for simple eclipse determination. More advanced cases where the atmosphere of the body your orbiting can significantly affect the Umbra and Penumbra, and other bodies could also potentially block the Sun. However, we will keep it simple for this example since they have minimal effect on the ISS’s orbit. Rsun and Rbody are the radius of the Sun and Body (In this case Earth), respectively. r_sun_body is a vector from the center of the Sun to the center of the target body. For this example I will only be using one vector, but for more rigorous eclipse determination it is important to calculate the ephemeris at least once a day since it does significantly change over the course of a year. The reason that I am ignoring it at the moment is because there is currently no good way to calculate Ephemerides in Julia but the package is being worked on so I may revisit this and do a more rigorous analysis in the future. r_body_sc is a position vector from the center of the body being orbited, to the center of our spacecraft.

The Code

@@ -2151,7 +2152,7 @@ Show code theme(:ggplot2)
-

In order to get the orbit for the ISS I used a Two-Line Element which is a data format for explaining orbits. the US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible (ARISS TLE,” n.d.). The Julia Package SatelliteToolbox.jl makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the tle string macro like below and now we have access to the information to start making our ISS orbit.

+

To get the orbit for the ISS, I used a Two-Line Element which is a data format for explaining orbits. The US Joint Space Operations Center makes these widely available, but https://live.ariss.org/tle/ makes the TLE for the ISS way more accessible (ARISS TLE,” n.d.). The Julia Package SatelliteToolbox.jl makes it super easy to turn a TLE into an orbit that can be propagated. Simply putting the TLE in a string and using the tle string macro like below, we now have access to the information to start making our ISS orbit.

ISS = tle"""
 ISS (ZARYA)
@@ -2161,17 +2162,16 @@ Show code
 
1-element Vector{TLE}:
  TLE: ISS (ZARYA) (Epoch = 2021-04-13T20:23:10.911)
-

Now that we have the TLE we can pass that into SatelliteToolbox’s orbit propagator. Before we can propagate the orbit we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day so using that we can calculate the amount of time required for one orbit which is all that were worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector.

+

Now that we have the TLE, we can pass that into SatelliteToolbox’s orbit propagator. Before propagating the orbit, we need to have a range of time steps to pass into the propagator. The TLE gives the mean motion, n, which is the revolutions per day, so using that, we can calculate the amount of time required for one orbit, which is all that we’re worried about for this analysis. The propagator returns a tuple containing the Orbital elements, a position vector with units meters, and a velocity vector with units meters per second. For this analysis were only worried about the position vector.

-
ISS[1].n
+
ISS[1].n
orbit = init_orbit_propagator(Val(:twobody), ISS[1]);
 time = 0:0.1:((24 / ISS[1].n) .* 60 * 60); # ISS[1].n gives the mean motion, or orbits per day.
 o, r, v = propagate!(orbit, time);
-

Now we just need way to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of pretty basic trigonometry and vector math.

-

add more discussion about the math

+

We just need to use the radii and vectors discussed earlier to determine if the ISS is in the penumbra or umbra. This is a lot of trigonometry and vector math that I won’t bore anyone with. However, using the diagrams above and following the code in the sunlight function, you should follow what’s happening. For a rigorous discussion, check out (Vallado 1997).

function sunlight(Rbody, r_sun_body, r_body_sc)
     Rsun = 695_700u"km"
@@ -2202,7 +2202,7 @@ Show code
 
S = r .|> R -> sunlight(6371u"km", [0.5370, 1.2606, 0.5466] .* 1e8u"km", R .* u"m");

Plotting the Results

-

The sunlight function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spend in the penumbra is almost insignificant.

+

The sunlight function returns values from 0 to 1, 0 being complete darkness, 1 being complete sunlight, and anything between being the fraction of light being received. Again since the ISS has a very low orbit, the amount of time spent in the penumbra is almost insignificant.

@@ -2224,35 +2224,38 @@ Show code ylabel!("Sunlight (%)"); title!("ISS Sunlight Over a Day")
-
-ISS Sunlight +
+ISS Sunlight

Figure 1: ISS Sunlight

-

Looking at the plot its pretty easy to see by the vertical transition from 0% to 100% that the time in the penumbra is limited, but almost counterintutively it also looks like the ISS gets more sunlight than it does darkness. Using the raw sunlight data we can actually calculate almost exactly how much time is spent in each region.

-Time in Sun: +

Looking at the plot, the vertical transition from 0% to 100% makes it pretty clear that the time in the penumbra is limited. Still, almost counterintuitively, it also looks like the ISS gets more sunlight than it does darkness. So, using the raw sunlight data, we can calculate precisely how much time is spent in each region.

+

Time in Sun:

sun = length(S[S.==1])/length(S) * 100
62.03323593209401
-Time in Darkness: +

Time in Darkness:

umbra = length(S[S.==0])/length(S) * 100
37.64408511553699
-Time in Penumbra: +

Time in Penumbra:

penumbra = 100 - umbra - sun
0.322678952369003
-

The ISS spends about 62% of its time in the sun, this is because if you go back and reference the diagram at the beginning of this post you can see that the umbra is actually a cone. This is mainly due to the fact that the Sun is massive compared to the Earth, but this effect is also stronger with orbits of higher altitudes.

+

This means that even with the ISS’s low orbit, it still gets sunlight ~62% of the time and spends almost no time in the penumbra. This would vary a few percent depending on the time of year, but in a circular orbit like the ISS, the amount of sunlight would remain pretty constant. There are other orbits like a polar orbit, lunar orbit, or highly elliptic earth orbits that can have their time in the sunlight vary widely by the time of year.

ARISS TLE.” n.d. Amateur Radio on the International Space Station. https://live.ariss.org/tle/.
+
+Vallado, David A. 1997. Fundamentals of Astrodynamics and Applications, 2nd. Ed. Edited by Wiley Larson. Dordrecht: Microcosm, Inc. +