1
0
mirror of https://gitlab.com/Anson-Projects/projects.git synced 2025-06-16 23:16:47 +00:00
Projects/_posts/2021-04-14-iss-eclipse-determination/iss-eclipse-determination.Rmd

115 lines
2.8 KiB
Plaintext

---
title: "ISS Eclipse Determination"
description: |
Determining how much sunlight a body is receiving.
draft: false
author:
- name: Anson Biggs
url: https://ansonbiggs.com
repository_url: https://gitlab.com/lander-team/air-prop-simulation
date: 04-01-2021
fig_width: 6
fig_align: "center"
output:
distill::distill_article:
self_contained: false
categories:
- Julia
- Astrodynamics
#bibliography: ../../citations.bib
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.
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, results = 'hide')
library(JuliaCall)
#julia_setup(JULIA_HOME = "/opt/julia-1.6.1/bin/")
julia_setup(installJulia = TRUE)
```
## What is an Eclipse
![Geometry of an Eclipse](geometry.svg)
![Body Radius's and Position Vectors](vectors_radiuss.svg)
## The Code
```{julia, code_folding=TRUE}
using Unitful
using LinearAlgebra
using SatelliteToolbox
using Plots
using Colors
theme(:ggplot2)
```
```{julia}
ISS = tle"""
ISS (ZARYA)
1 25544U 98067A 21103.84943184 .00000176 00000-0 11381-4 0 9990
2 25544 51.6434 300.9481 0002858 223.8443 263.8789 15.48881793278621
"""
```
```{julia}
orbit = init_orbit_propagator(Val(:twobody), ISS[1]);
time = 0:0.1:((24 / ISS[1].n) .* 60 * 60);
o, r, v = propagate!(orbit, time);
```
```{julia}
function sunlight(Rbody, r_sun_body, r_body_sc)
Rsun = 695_700u"km"
hu = Rbody * norm(r_sun_body) / (Rsun - Rbody)
θe = acos((r_sun_body ⋅ r_body_sc) / (norm(r_sun_body) * norm(r_body_sc)))
θu = atan(Rbody / hu)
du = hu * sin(θu) / sin(θe + θu)
θp = π - atan(norm(r_sun_body) / (Rsun + Rbody))
dp = Rbody * sin(θp) / cos(θe - θp)
S = 1
if (θe < π / 2) && (norm(r_body_sc) < du)
S = 0
end
if (θe < π / 2) && ((du < norm(r_body_sc)) && (norm(r_body_sc) < dp))
S = (norm(r_body_sc .|> u"km") - du) / (dp - du) |> ustrip
end
return S
end
```
```{julia}
S = r .|> R -> sunlight(6371u"km", [0.5370, 1.2606, 0.5466] .* 1e8u"km", R .* u"m")
```
## Plotting the Results
```{julia, code_folding=TRUE, results='show',layout="l-body-outset",fig.cap= "Rocket Motor Data: [@thrustcurve]", preview=TRUE }
light_range = range(colorant"black", stop = colorant"yellow", length = 101);
light_colors = [light_range[unique(round(Int, 1 + s * 100))][1] for s in S];
plot(
LinRange(0, 24, length(S)),
S .* 100,
linewidth = 5,
legend = false,
color = light_colors,
);
xlabel!("Time (hr)");
ylabel!("Sunlight (%)");
title!("ISS Sunlight Over a Day")
```