mirror of
https://gitlab.com/Anson-Projects/projects.git
synced 2025-06-16 06:56:46 +00:00
115 lines
2.8 KiB
Plaintext
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
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|
## 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")
|
|
``` |