From 3367054f393121214b64dfbddfc49ea968f4fe0e Mon Sep 17 00:00:00 2001 From: Philip Linden Date: Thu, 21 Dec 2023 16:07:26 -0500 Subject: [PATCH 1/2] basic button --- examples/visualize-trajectory/.gitignore | 3 + examples/visualize-trajectory/Cargo.toml | 16 +++++ .../visualize-trajectory/assets/JGM3.cof.gz | Bin 0 -> 53013 bytes examples/visualize-trajectory/src/gui/app.rs | 35 +++++++++ .../visualize-trajectory/src/gui/controls.rs | 26 +++++++ examples/visualize-trajectory/src/gui/mod.rs | 9 +++ examples/visualize-trajectory/src/main.rs | 24 +++++++ examples/visualize-trajectory/src/mod.rs | 1 + examples/visualize-trajectory/src/scenario.rs | 68 ++++++++++++++++++ 9 files changed, 182 insertions(+) create mode 100644 examples/visualize-trajectory/.gitignore create mode 100644 examples/visualize-trajectory/Cargo.toml create mode 100755 examples/visualize-trajectory/assets/JGM3.cof.gz create mode 100644 examples/visualize-trajectory/src/gui/app.rs create mode 100644 examples/visualize-trajectory/src/gui/controls.rs create mode 100644 examples/visualize-trajectory/src/gui/mod.rs create mode 100644 examples/visualize-trajectory/src/main.rs create mode 100644 examples/visualize-trajectory/src/mod.rs create mode 100644 examples/visualize-trajectory/src/scenario.rs diff --git a/examples/visualize-trajectory/.gitignore b/examples/visualize-trajectory/.gitignore new file mode 100644 index 00000000..4ebe4b13 --- /dev/null +++ b/examples/visualize-trajectory/.gitignore @@ -0,0 +1,3 @@ +.vscode +.DS_Store +target/ diff --git a/examples/visualize-trajectory/Cargo.toml b/examples/visualize-trajectory/Cargo.toml new file mode 100644 index 00000000..7da0736c --- /dev/null +++ b/examples/visualize-trajectory/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "visualize-trajectory" +version = "0.1.0" +edition = "2021" +authors = ["Philip Linden "] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +eframe = "0.24.1" +egui = "0.24.1" +egui_plot = "0.24.1" +log = "0.4.20" +nyx-space = "1.1.2" +pretty_env_logger = "0.5.0" +serde = { version = "1.0.193", features = ["derive"] } diff --git a/examples/visualize-trajectory/assets/JGM3.cof.gz b/examples/visualize-trajectory/assets/JGM3.cof.gz new file mode 100755 index 0000000000000000000000000000000000000000..3b7c16a8baa1722becffeeff686b40f875ca31ec GIT binary patch literal 53013 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/visualize-trajectory/src/gui/app.rs b/examples/visualize-trajectory/src/gui/app.rs new file mode 100644 index 00000000..17547519 --- /dev/null +++ b/examples/visualize-trajectory/src/gui/app.rs @@ -0,0 +1,35 @@ +/// This module defines the top-level UI app that will be called at main.rs +use eframe::{App, CreationContext}; + +use crate::gui::controls::ScenarioPicker; + +use super::View; + +pub struct NyxGui; + +impl Default for NyxGui { + fn default() -> Self { + Self { + // specify defaults here + } + } +} + +impl NyxGui { + pub fn new(cc: &CreationContext<'_>) -> Self { + // This is also where you can customize the look and feel of egui using + // `cc.egui_ctx.set_visuals` and `cc.egui_ctx.set_fonts`. + + Default::default() + } +} + +impl App for NyxGui { + /// By default the app is Reactive: egui is only updated if are input events + /// (like mouse movements) or there are some animations in the GUI. + fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + ScenarioPicker::default().ui(ui); + }); + } +} diff --git a/examples/visualize-trajectory/src/gui/controls.rs b/examples/visualize-trajectory/src/gui/controls.rs new file mode 100644 index 00000000..8a7abdfc --- /dev/null +++ b/examples/visualize-trajectory/src/gui/controls.rs @@ -0,0 +1,26 @@ +use crate::scenario::{lunar_transfer, Scenarios}; +pub struct ScenarioPicker { + scenario: Scenarios, +} + +impl Default for ScenarioPicker { + fn default() -> Self { + Self { + scenario: Scenarios::LunarTransfer, + } + } +} + +impl super::View for ScenarioPicker { + fn ui(&mut self, ui: &mut egui::Ui) { + ui.horizontal(|ui| { + // run the scenario when button is clicked + if ui.button("go").clicked() { + match self.scenario { + Scenarios::LunarTransfer => lunar_transfer(), + _ => {} + } + }; + }); + } +} diff --git a/examples/visualize-trajectory/src/gui/mod.rs b/examples/visualize-trajectory/src/gui/mod.rs new file mode 100644 index 00000000..8f005cc4 --- /dev/null +++ b/examples/visualize-trajectory/src/gui/mod.rs @@ -0,0 +1,9 @@ +use egui; +mod app; +mod controls; + +pub use app::NyxGui; + +pub trait View { + fn ui(&mut self, ui: &mut egui::Ui); +} diff --git a/examples/visualize-trajectory/src/main.rs b/examples/visualize-trajectory/src/main.rs new file mode 100644 index 00000000..bfa4a47f --- /dev/null +++ b/examples/visualize-trajectory/src/main.rs @@ -0,0 +1,24 @@ +use eframe; +use pretty_env_logger; + +mod gui; +mod scenario; + +use gui::NyxGui; + +fn main() -> eframe::Result<()> { + pretty_env_logger::init(); // log events to stdout (export RUST_LOG=info) + + // set default options for the UI window when it spawns + let native_options = eframe::NativeOptions { + viewport: egui::ViewportBuilder::default(), + ..Default::default() + }; + + // run the app + eframe::run_native( + "Nyx Space", + native_options, + Box::new(|cc| Box::new(NyxGui::new(cc))), + ) +} diff --git a/examples/visualize-trajectory/src/mod.rs b/examples/visualize-trajectory/src/mod.rs new file mode 100644 index 00000000..8518b6c8 --- /dev/null +++ b/examples/visualize-trajectory/src/mod.rs @@ -0,0 +1 @@ +mod scenario; diff --git a/examples/visualize-trajectory/src/scenario.rs b/examples/visualize-trajectory/src/scenario.rs new file mode 100644 index 00000000..7158e852 --- /dev/null +++ b/examples/visualize-trajectory/src/scenario.rs @@ -0,0 +1,68 @@ +use nyx_space::{ + cosmic::{Bodies, Cosm}, + dynamics::{Drag, Harmonics, OrbitalDynamics, PointMasses, SolarPressure, SpacecraftDynamics}, + io::gravity::HarmonicsMem, + md::Event, + propagators::Propagator, + time::{Epoch, Unit}, + Orbit, Spacecraft, +}; + +pub enum Scenarios { + LunarTransfer, +} + +pub fn lunar_transfer() { + // Initialize the cosm which stores the ephemeris + let cosm = Cosm::de438(); + // Grab the frames we'll use + let eme2k = cosm.frame("EME2000"); + let iau_earth = cosm.frame("IAU Earth"); + // Define the epoch + let epoch = Epoch::from_gregorian_utc(2014, 7, 22, 11, 29, 10, 811_000); + // Define the initial orbit + let orbit = Orbit::cartesian( + -137380.1984338506, + 75679.87867537055, + 21487.63875187856, + -0.2324532014235503, + -0.4462753967758019, + 0.08561205662877103, + epoch, + eme2k, + ); + + // Define the spacecraft + let sat = Spacecraft::new(orbit, 1000.0, 0.0, 1.0, 15.0, 1.7, 2.2); + + // Set up the harmonics first because we need to pass them to the overarching orbital dynamics + // Load the harmonics from the JGM3 file (GMAT uses the JGM2 in this case). + // It's gunzipped (hence `true` as the last parameter) + let stor = HarmonicsMem::from_cof("assets/JGM3.cof.gz", 20, 20, true).unwrap(); + // Set up the orbital dynamics: we need to specify the models one by one here + // because the usual functions wrap the dynamics so that they can be used in a Monte Carlo + // setup. + let orbital_dyn = OrbitalDynamics::new(vec![ + // Note that we are only accounting for Sun, Moon and Jupiter, in addition to the integration frame's GM + PointMasses::new( + &[Bodies::Sun, Bodies::Luna, Bodies::JupiterBarycenter], + cosm.clone(), + ), + // Specify that these harmonics are valid only in the IAU Earth frame. We're using the + Harmonics::from_stor(iau_earth, stor, cosm.clone()), + ]); + + // Set up SRP and Drag second, because we need to pass them to the overarching spacecraft dynamics + let srp = SolarPressure::default(eme2k, cosm.clone()); + let drag = Drag::std_atm1976(cosm.clone()); + // Set up the spacecraft dynamics + let sc_dyn = SpacecraftDynamics::from_models(orbital_dyn, vec![srp, drag]); + + // Propagate until periapse + let prop = Propagator::default(sc_dyn); + + let (out, traj) = prop + .with(sat) + .until_event(0.5 * Unit::Day, &Event::periapsis()) + .unwrap(); +} From 5aed7f14c1ed999ce4bc8b59eaf483f524201c76 Mon Sep 17 00:00:00 2001 From: Philip Linden Date: Thu, 21 Dec 2023 17:05:51 -0500 Subject: [PATCH 2/2] selectable scenario --- examples/visualize-trajectory/src/gui/app.rs | 7 +- .../visualize-trajectory/src/gui/controls.rs | 21 +++-- examples/visualize-trajectory/src/scenario.rs | 80 ++++++++++++++++++- 3 files changed, 97 insertions(+), 11 deletions(-) diff --git a/examples/visualize-trajectory/src/gui/app.rs b/examples/visualize-trajectory/src/gui/app.rs index 17547519..649ef3cc 100644 --- a/examples/visualize-trajectory/src/gui/app.rs +++ b/examples/visualize-trajectory/src/gui/app.rs @@ -5,12 +5,15 @@ use crate::gui::controls::ScenarioPicker; use super::View; -pub struct NyxGui; +pub struct NyxGui { + scenario_picker: ScenarioPicker, +} impl Default for NyxGui { fn default() -> Self { Self { // specify defaults here + scenario_picker: ScenarioPicker::default(), } } } @@ -29,7 +32,7 @@ impl App for NyxGui { /// (like mouse movements) or there are some animations in the GUI. fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { - ScenarioPicker::default().ui(ui); + self.scenario_picker.ui(ui); }); } } diff --git a/examples/visualize-trajectory/src/gui/controls.rs b/examples/visualize-trajectory/src/gui/controls.rs index 8a7abdfc..c95a9db1 100644 --- a/examples/visualize-trajectory/src/gui/controls.rs +++ b/examples/visualize-trajectory/src/gui/controls.rs @@ -1,4 +1,4 @@ -use crate::scenario::{lunar_transfer, Scenarios}; +use crate::scenario::Scenarios; pub struct ScenarioPicker { scenario: Scenarios, } @@ -14,12 +14,21 @@ impl Default for ScenarioPicker { impl super::View for ScenarioPicker { fn ui(&mut self, ui: &mut egui::Ui) { ui.horizontal(|ui| { + // change the scenario enum from a dropdown + egui::ComboBox::from_label("Scenario") + .selected_text(self.scenario.to_string()) + .show_ui(ui, |ui| { + for scen in &[ + Scenarios::LunarTransfer, + Scenarios::OrbitDesign, + ] { + ui.selectable_value(&mut self.scenario, *scen, scen.to_string()); + } + }); + // run the scenario when button is clicked - if ui.button("go").clicked() { - match self.scenario { - Scenarios::LunarTransfer => lunar_transfer(), - _ => {} - } + if ui.button("run").clicked() { + self.scenario.run() }; }); } diff --git a/examples/visualize-trajectory/src/scenario.rs b/examples/visualize-trajectory/src/scenario.rs index 7158e852..37157176 100644 --- a/examples/visualize-trajectory/src/scenario.rs +++ b/examples/visualize-trajectory/src/scenario.rs @@ -1,18 +1,45 @@ +use std::fmt; + +use log::info; use nyx_space::{ cosmic::{Bodies, Cosm}, dynamics::{Drag, Harmonics, OrbitalDynamics, PointMasses, SolarPressure, SpacecraftDynamics}, io::gravity::HarmonicsMem, md::Event, + od::ui::GroundStation, propagators::Propagator, time::{Epoch, Unit}, Orbit, Spacecraft, }; +#[derive(Clone, Copy, PartialEq, Eq, Debug)] pub enum Scenarios { LunarTransfer, + OrbitDesign, +} + +impl fmt::Display for Scenarios { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), std::fmt::Error> { + match self { + Scenarios::LunarTransfer => write!(f, "Lunar Transfer"), + Scenarios::OrbitDesign => write!(f, "Orbit Design"), + } + } +} + +impl Scenarios { + pub fn run(&self) { + + info!("running scenario: {:?}", self.to_string()); + match self { + Scenarios::LunarTransfer => lunar_transfer(), + Scenarios::OrbitDesign => orbit_design(), + } + info!("done.") + } } -pub fn lunar_transfer() { +fn lunar_transfer() { // Initialize the cosm which stores the ephemeris let cosm = Cosm::de438(); // Grab the frames we'll use @@ -35,10 +62,14 @@ pub fn lunar_transfer() { // Define the spacecraft let sat = Spacecraft::new(orbit, 1000.0, 0.0, 1.0, 15.0, 1.7, 2.2); + info!("loading assets"); // Set up the harmonics first because we need to pass them to the overarching orbital dynamics // Load the harmonics from the JGM3 file (GMAT uses the JGM2 in this case). // It's gunzipped (hence `true` as the last parameter) - let stor = HarmonicsMem::from_cof("assets/JGM3.cof.gz", 20, 20, true).unwrap(); + let stor = match HarmonicsMem::from_cof("assets/JGM3.cof.gz", 20, 20, true) { + Ok(stor) => stor, + Err(error) => panic!("Problem reading harmonics file: {:?}", error), + }; // Set up the orbital dynamics: we need to specify the models one by one here // because the usual functions wrap the dynamics so that they can be used in a Monte Carlo // setup. @@ -61,8 +92,51 @@ pub fn lunar_transfer() { // Propagate until periapse let prop = Propagator::default(sc_dyn); + info!("propagating"); let (out, traj) = prop .with(sat) - .until_event(0.5 * Unit::Day, &Event::periapsis()) + .until_event(30. * Unit::Day, &Event::periapsis()) .unwrap(); } + +fn orbit_design() { + // Load the NASA NAIF DE438 planetary ephemeris. + let cosm = Cosm::de438(); + // Grab the Earth Mean Equator J2000 frame + let eme2k = cosm.frame("EME2000"); + // Set the initial start time of the scenario + let epoch = Epoch::from_gregorian_tai_at_noon(2021, 2, 25); + // Nearly circular orbit (ecc of 0.01), inclination of 49 degrees and TA at 30.0 + let orbit = Orbit::keplerian_altitude(500.0, 0.01, 49.0, 0.0, 0.0, 30.0, epoch, eme2k); + + // Define the landmark by specifying a name, a latitude, a longitude, + // an altitude (in km) and a frame. Note that we're also "cloning" + // the Cosm: don't worry, it's a shared object, so we're just cloning the + // the reference to it in memory, and never loading it more than once. + let landmark = GroundStation::from_point( + "Eiffel Tower".to_string(), + 36.0544, + 112.1402, + 0.0, + cosm.frame("IAU Earth"), + cosm.clone(), + ); + + // Let's print this landmark to make sure we've created it correctly. + info!("target: {:}", landmark); + + // Let's specify the force model to be two body dynamics + // And use the default propagator setup: a variable step Runge-Kutta 8-9 + let setup = Propagator::default(OrbitalDynamics::two_body()); + + // Use the setup to seed a propagator with the initial state we defined above. + let mut prop = setup.with(orbit); + // Now let's propagate and generate the trajectory so we can analyse it. + let (final_state, traj) = match prop.for_duration_with_traj(1 * Unit::Day) { + Ok(state) => state, + Err(error) => panic!("Error during propagation: {:?}", error) + }; + + // Printing the state with `:o` will print its Keplerian elements + info!("{:?}", final_state); +}