├── .gitignore ├── LICENSE ├── README.rst ├── config └── config.txt ├── docs ├── Makefile ├── _build │ ├── doctrees │ │ ├── docs_firststep.doctree │ │ ├── docs_functions.doctree │ │ ├── docs_install.doctree │ │ ├── docs_interpreting.doctree │ │ ├── docs_orbmaint.doctree │ │ ├── docs_overview.doctree │ │ ├── environment.pickle │ │ └── index.doctree │ └── html │ │ ├── .buildinfo │ │ ├── _images │ │ ├── orbitm_logo.png │ │ ├── orbm_deriv1.png │ │ ├── orbm_deriv2.png │ │ ├── orbm_deriv3.png │ │ ├── orbm_flow_sams.png │ │ ├── orbm_flow_stk.png │ │ ├── orbm_logo.png │ │ ├── orbm_logo_large.png │ │ ├── orbm_outp_450km.png │ │ ├── orbm_outp_500km.png │ │ ├── orbm_outp_550km.png │ │ ├── orbm_rationale.png │ │ ├── orbm_screenshot.png │ │ ├── orbmgui_blank.jpg │ │ └── orbmgui_full.jpg │ │ ├── _sources │ │ ├── docs_firststep.rst.txt │ │ ├── docs_functions.rst.txt │ │ ├── docs_install.rst.txt │ │ ├── docs_interpreting.rst.txt │ │ ├── docs_orbmaint.rst.txt │ │ ├── docs_overview.rst.txt │ │ └── index.rst.txt │ │ ├── _static │ │ ├── basic.css │ │ ├── css │ │ │ ├── badge_only.css │ │ │ ├── fonts │ │ │ │ ├── Roboto-Slab-Bold.woff │ │ │ │ ├── Roboto-Slab-Bold.woff2 │ │ │ │ ├── Roboto-Slab-Regular.woff │ │ │ │ ├── Roboto-Slab-Regular.woff2 │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ ├── fontawesome-webfont.woff2 │ │ │ │ ├── lato-bold-italic.woff │ │ │ │ ├── lato-bold-italic.woff2 │ │ │ │ ├── lato-bold.woff │ │ │ │ ├── lato-bold.woff2 │ │ │ │ ├── lato-normal-italic.woff │ │ │ │ ├── lato-normal-italic.woff2 │ │ │ │ ├── lato-normal.woff │ │ │ │ └── lato-normal.woff2 │ │ │ └── theme.css │ │ ├── doctools.js │ │ ├── documentation_options.js │ │ ├── file.png │ │ ├── jquery-3.5.1.js │ │ ├── jquery.js │ │ ├── js │ │ │ ├── badge_only.js │ │ │ ├── html5shiv-printshiv.min.js │ │ │ ├── html5shiv.min.js │ │ │ └── theme.js │ │ ├── language_data.js │ │ ├── minus.png │ │ ├── orbitm_favicon.png │ │ ├── orbitm_favicon2.png │ │ ├── orbitm_logo.png │ │ ├── orbitm_thumbnail.png │ │ ├── orbm_deriv1.png │ │ ├── orbm_deriv2.png │ │ ├── orbm_deriv3.png │ │ ├── orbm_flow_sams.png │ │ ├── orbm_flow_stk.png │ │ ├── orbm_logo_large_old.png │ │ ├── orbm_logo_notext.png │ │ ├── orbm_logo_old.png │ │ ├── orbm_outp_450km.png │ │ ├── orbm_outp_500km.png │ │ ├── orbm_outp_550km.png │ │ ├── orbm_rationale.png │ │ ├── orbmgui_blank.jpg │ │ ├── orbmgui_full.jpg │ │ ├── orbmgui_old.png │ │ ├── plus.png │ │ ├── pygments.css │ │ ├── searchtools.js │ │ ├── underscore-1.12.0.js │ │ ├── underscore-1.3.1.js │ │ └── underscore.js │ │ ├── docs_firststep.html │ │ ├── docs_functions.html │ │ ├── docs_install.html │ │ ├── docs_interpreting.html │ │ ├── docs_orbmaint.html │ │ ├── docs_overview.html │ │ ├── genindex.html │ │ ├── index.html │ │ ├── objects.inv │ │ ├── search.html │ │ └── searchindex.js ├── _images │ ├── orbm_deriv1.png │ ├── orbm_deriv2.png │ ├── orbm_deriv3.png │ ├── orbm_flow_sams.png │ ├── orbm_flow_stk.png │ ├── orbm_logo_large_old.png │ ├── orbm_logo_notext.png │ ├── orbm_logo_old.png │ ├── orbm_outp_450km.png │ ├── orbm_outp_500km.png │ ├── orbm_outp_550km.png │ ├── orbm_rationale.png │ ├── orbmgui_blank.jpg │ ├── orbmgui_full.jpg │ └── orbmgui_old.png ├── _papers │ └── SSC18-PI-38 .pdf ├── _static │ ├── orbitm_favicon.png │ ├── orbitm_favicon2.png │ ├── orbitm_logo.png │ └── orbitm_thumbnail.png ├── conf.py ├── docs_firststep.rst ├── docs_functions.rst ├── docs_install.rst ├── docs_interpreting.rst ├── docs_orbmaint.rst ├── docs_overview.rst ├── index.rst └── make.bat ├── orbitm.py ├── source ├── atmos.py ├── kepler.py ├── orbmgui.py ├── orbmrun.py ├── orbmstk.py └── sun_moon_pos.py └── thrusters.txt /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | desktop.ini 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Samuel Low 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | .. image:: https://raw.githubusercontent.com/sammmlow/ORBITM/master/docs/_static/orbitm_logo.png 2 | 3 | .. |docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat-square 4 | :target: https://orbitm.readthedocs.io/en/latest/ 5 | 6 | .. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square 7 | :target: https://github.com/sammmlow/ORBITM/blob/master/LICENSE 8 | 9 | .. |orcid| image:: https://img.shields.io/badge/ID-0000--0002--1911--701X-a6ce39.svg 10 | :target: https://orcid.org/0000-0002-1911-701X/ 11 | 12 | .. |linkedin| image:: https://img.shields.io/badge/LinkedIn-sammmlow-blue.svg 13 | :target: https://www.linkedin.com/in/sammmlow 14 | 15 | :Project: Orbit.M 16 | :Github: https://github.com/sammmlow/ORBITM 17 | :Documents: https://orbitm.readthedocs.io/en/latest/ 18 | :Version: 1.1 (Stable) 19 | 20 | |docs| |license| 21 | 22 | :Author: Samuel Y. W. Low 23 | 24 | |linkedin| |orcid| 25 | 26 | 27 | 28 | Welcome to Orbit.M! 29 | ------------------- 30 | 31 | Orbit.M is an open-source and free orbit maintenance simulator and propulsion sizing tool, recommended for use with near-circular low Earth orbits up to 1,000 km altitude, on Python. 32 | 33 | It stands for the **Orbit Maintenance and Propulsion Sizing Tool**, and it comes with its own built-in orbit decay model and maintenance simulator. Alternatively, Orbit.M can also be used to interface with and automate orbit maintenance simulations using AGI's Systems Tool Kit (STK) as an alternative simulator, through the STK Integration Object Model libraries. 34 | 35 | A valid license for STK 10 and 11, with Astrogator and Integration modules, is needed for interfacing with STK. However, you do not require an STK license for interfacing with the native orbit maintenance simulation mode (or Sam's Mode). 36 | 37 | The objective of Orbit.M is to allow for a quick sizing of low Earth orbit (LEO) mission lifetimes, sized against propulsion units of the user's choosing. The user can enter the parameters of their intended mission, the orbital elements, the spacecraft characteristics, and Orbit.M would compute the ΔV necessary to counteract drag forces throughout the mission, while sizing it against your choices of thrusters (in the **"thrusters.txt"** file). 38 | 39 | 40 | 41 | First Steps in Using Orbit.M 42 | ---------------------------- 43 | 44 | Check that you have these Python libraries: **TKinter, NumPy, Matplotlib**. If you are a licensed STK Astrogator user, you may need the **comtypes** library to interface with STK. If you do not have Python, I recommend using the `Anaconda installer `_ with Spyder as your IDE, as it comes with all the installed packages by default. 45 | 46 | You can launch Orbit.M through the **orbitm.py** in the main directory (equivalent to the directory you see on the master branch on Orbit.M's github page). You should see a GUI, like below, pop up: 47 | 48 | .. image:: https://raw.githubusercontent.com/sammmlow/ORBITM/master/docs/_images/orbmgui_blank.jpg 49 | 50 | You can fill in your spacecraft and orbit parameters through the GUI. The plotter will also plot thrusters of your choice as specified in the "thrusters.txt" file on the main Orbit.M directory. 51 | 52 | Now, you can hit **Run ORBITM**, and it will output a ΔV report as a text file, and plot the altitude profile and the locus of thruster requirements that satisfy your mission (in terms of the required fuel mass against specific impulse or ISP). Example plots are shown below, with plots in blue ran under the fast algorithm (Sam's), and plots in orange ran under the more precise orbit model in STK. All manoeuvres are assumed to be impulsive, and triggered only when the nominal altitude crosses the orbit maintenance tolerance band. 53 | 54 | .. image:: https://raw.githubusercontent.com/sammmlow/ORBITM/master/docs/_images/orbmgui_full.jpg 55 | 56 | The above results were run for a 170kg satellite at 550km circular orbit. At this profile, the orbit maintenance propulsion profile of both Orbit.M's native decay simulator, and that of a full propagation in STK Astrogator, show similar results, with a Delta-V budget of ~3m/s (native) and ~4m/s (STK10). 57 | 58 | For full documentation, please refer to the `Orbit.M Read-The-Docs. `_ 59 | 60 | Original Sharing on ORBITM v1.0 61 | ------------------------------- 62 | 63 | ORBITM v1.0 was released during the Open Source Cube Satellite Workshop 2020. The original presentation slides introducing `ORBITM v1.0 link is here. `_ 64 | 65 | Final Notes 66 | ----------- 67 | 68 | This project is free, and open-source. If you would like to contribute to this project, add in new features, or enhance existing atmospheric models etc, please feel free to fork this repository and make any pull requests if you'd like to collaborate with me. I am also hoping to interface Orbit.M's use with other astrodynamics softwares like GMAT, and improve on existing features such as improving the accuracy of the atmospheric density models etc. 69 | 70 | If you had felt that OrbitM was useful in your research, please do give the due credit and cite my paper or this project. 71 | 72 | Low, S. Y. W., &; Chia, Y. X. (2018). “Assessment of Orbit Maintenance Strategies for Small Satellites”, 32nd Annual AIAA/USU Conference on Small Satellites, Logan, Utah, Utah State University, USA. 73 | 74 | 75 | 76 | Contact 77 | ------- 78 | 79 | If you have any other queries feel free to reach out to me at: 80 | 81 | sammmlow@gmail.com 82 | 83 | |linkedin| |orcid| 84 | 85 | *Last Modified on 21-Sep-2021* 86 | 87 | -------------------------------------------------------------------------------- /config/config.txt: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | ############################################################################### 3 | ## ## 4 | ## _____ ___ ___ ___ _____ __ __ ## 5 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 6 | ## | |_| | <| _ < | | | | _ | \ / | ## 7 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 8 | ## v 1.1 ## 9 | ## ## 10 | ## Configuration File (For User-Defined Inputs) ## 11 | ## ## 12 | ## ************************************************************************* ## 13 | ## On lines starting with I, there are two strings that are read by ORBITM! ## 14 | ## The first string is the input identifier (key). Do not change this! ## 15 | ## The second string is the input for you to define based on your needs. ## 16 | ## On lines starting with ~, these lines are comments unread by ORBITM. ## 17 | ## ************************************************************************* ## 18 | ## ## 19 | ############################################################################### 20 | ############################################################################### 21 | ~: 22 | ~: Input the orbit simulation program choice (1=Sam's, 2=STK10, 3=STK11). 23 | I: orbsim 1 24 | ~: 25 | ~: Input the Start Epoch String (e.g. 1-Jan-2012-12:00:00.000) 26 | I: tstart 1-Jan-2022-12:00:00.000 27 | ~: 28 | ~: Input the Final Epoch String (e.g. 1-Jan-2015-12:00:00.000) 29 | I: tfinal 1-Jun-2022-12:00:00.000 30 | ~: 31 | ~: Input the Spacecraft Atmospheric Drag Coefficient (Cd) 32 | I: sc_Cd 2.2 33 | ~: 34 | ~: Input the Spacecraft Atmospheric Drag Surface Area (m^2) 35 | I: sc_Ad 2.28 36 | ~: 37 | ~: Input the Orbit Semi-Major Axis (km) 38 | I: orb_a 6636.137 39 | ~: 40 | ~: Input the Orbit Eccentricity (no units) 41 | I: orb_e 0.0001 42 | ~: 43 | ~: Input the Orbit Inclination (degrees) 44 | I: orb_i 30.0 45 | ~: 46 | ~: Input the Orbit Right Asc. Node (degrees) 47 | I: orb_R 90.0 48 | ~: 49 | ~: Input the Orbit Arg. Perigee (degrees) 50 | I: orb_w 45.0 51 | ~: 52 | ~: Input the Orbit Mean Anomaly (degrees) 53 | I: orb_m -45.0 54 | ~: 55 | ~: Set the Maintenance Tolerance Band (km) 56 | I: orbm_tolr 1.0 57 | ~: 58 | ~: Simulate the orbit maintenance of a frozen repeat orbit (True/False)? 59 | I: orbm_fro_flag True 60 | ~: 61 | ~: Input the Spacecraft Wet Mass (kg) 62 | I: sc_mass 170.0 63 | ~: 64 | ~: For plotting purposes, input x-axis minimum for Isp (s). 65 | I: isp_min 50.0 66 | ~: 67 | ~: For plotting purposes, input x-axis maximum for Isp (s). 68 | I: isp_max 1250.0 69 | ~: 70 | ############################################################################### 71 | ############################################################################### -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/_build/doctrees/docs_firststep.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/docs_firststep.doctree -------------------------------------------------------------------------------- /docs/_build/doctrees/docs_functions.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/docs_functions.doctree -------------------------------------------------------------------------------- /docs/_build/doctrees/docs_install.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/docs_install.doctree -------------------------------------------------------------------------------- /docs/_build/doctrees/docs_interpreting.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/docs_interpreting.doctree -------------------------------------------------------------------------------- /docs/_build/doctrees/docs_orbmaint.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/docs_orbmaint.doctree -------------------------------------------------------------------------------- /docs/_build/doctrees/docs_overview.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/docs_overview.doctree -------------------------------------------------------------------------------- /docs/_build/doctrees/environment.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/environment.pickle -------------------------------------------------------------------------------- /docs/_build/doctrees/index.doctree: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/doctrees/index.doctree -------------------------------------------------------------------------------- /docs/_build/html/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 379ac4226d2c0603fcdde32cda71ba1f 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /docs/_build/html/_images/orbitm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbitm_logo.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_deriv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_deriv1.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_deriv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_deriv2.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_deriv3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_deriv3.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_flow_sams.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_flow_sams.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_flow_stk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_flow_stk.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_logo.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_logo_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_logo_large.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_outp_450km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_outp_450km.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_outp_500km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_outp_500km.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_outp_550km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_outp_550km.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_rationale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_rationale.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbm_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbm_screenshot.png -------------------------------------------------------------------------------- /docs/_build/html/_images/orbmgui_blank.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbmgui_blank.jpg -------------------------------------------------------------------------------- /docs/_build/html/_images/orbmgui_full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_images/orbmgui_full.jpg -------------------------------------------------------------------------------- /docs/_build/html/_sources/docs_firststep.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | First Steps 19 | =========== 20 | 21 | ORBITM can be launched simply by running the Python file **orbitm.py** in the main directory (equivalent to the directory on the master branch on ORBITM's GitHub). You should see a GUI that looks like the one below, pop up: 22 | 23 | .. figure:: /_images/orbmgui_blank.jpg 24 | :align: center 25 | 26 | Figure 2.1 - ORBITM Graphical User Interface 27 | 28 | As a first step, you can simply load the default input parameters by clicking "Load Config". The parameters are actually saved in the **config.txt** file. Configuration parameters should be loaded through the GUI, and not manually updated through the **config.txt** file since then the software can't check for string formatting errors (e.g. a negative drag coefficient that was typed into the config file manually and by accident would crash the program). 29 | 30 | .. warning:: An orbit eccentricity of exactly zero is not allowed, to prevent potential divide-by-zero issues during calculations. For near-perfectly circular orbits, set an arbitrarily small eccentricity number (e.g., 0.00001). 31 | 32 | Second, you can choose which lifetime and maintenance simulator you would like to use. By default, the native **"Sam's Simulator"** will be selected. If STK is selected, remember that **a valid STK license for STK Integration and STK Astrogator is required.** 33 | 34 | Third, proceed to set the remainder of your orbit and spacecraft parameters. These parameters are self-explanatory. Some parameters are specific to ORBITM and are defined below: 35 | 36 | :Maintenance Tolerance Band: Threshold altitude that triggers an orbit raise (km). 37 | 38 | :Frozen Repeat Ground Track: Option to consider frozen repeat orbit maintenance. 39 | 40 | .. note:: The altitude value used as the reference with the **Maintenance Tolerance Band** is defined as the geodetic altitude. In **"Sam's Simulator"** mode, this altitude is the Keplerian semi-major axis minus Earth's equatorial radius. However, STK-mode accounts for the oblateness of the Earth, and the presence of other perturbing forces. Thus, in STK mode, the Earth-centered altitude often oscillates with the latitude and with time, even for a "circular orbit". 41 | 42 | In order to prevent triggering a manoeuvre on the wrong rising or falling edge of the altitude profile, the STK mode triggers manoeuvres based on the **Kozai-Izsak Mean Semi-Major Axis** rather than the nominal altitude. It is acknowledged that this changes the definition for the "threshold altitude", especially for highly elliptical orbits running in STK. 43 | 44 | If the option for a **Frozen Repeat Ground Track** was selected, then the orbit raise will happen from the negative threshold below its initial altitude to a positive threshold above the initial altitude, and the thrusts will be done in perigee-apogee pairs. This minimises secular perturbations to the orbit mean eccentricity and the orbit nodal period. For example, if the **Frozen Repeat Ground Track** option was selected, with an initial altitude of 500km, and a threshold of 5km, the orbit raise will be triggered at 495km, and raised to 505km in two thrust pairs. Else, in the non-frozen repeat orbit maintenance case, the orbit raise will be triggered at 495km, and raised back to the original 500km. 45 | 46 | Finally, before running the simulation (**Run ORBITM**), check the **"thrusters.txt"** file on the main ORBITM directory, and add thruster specifications that you wish to size your missions against. Some thrusters are written inside this shortlist as an example. The purpose of this shortlist is to provide the program with the thruster specifications, so that the mission planner can graphically compare its Isp and fuel capacity to the suitability of the mission (as an output of the program). 47 | 48 | Now, you can run ORBITM. If you are a licensed STK user and you would like to use ORBITM to automate an orbit maintenance simulation in STK for you, make sure there are **no** running instances of STK before you run ORBITM in the STK 10 or 11 mode. 49 | 50 | .. note:: ORBITM considers only atmospheric drag and not albedo and radiation effects. 51 | -------------------------------------------------------------------------------- /docs/_build/html/_sources/docs_functions.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | API Reference 19 | ============= 20 | 21 | -------------------------------------------------------------------------------- /docs/_build/html/_sources/docs_install.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | Installation 19 | ============ 20 | 21 | First, find the ORBITM GitHub repository in this `GitHub link `_, and download it. Alternatively, if you have Git installed, you can open Command Prompt or your Git Bash, enter the directory of your choice, and type:: 22 | 23 | git clone https://github.com/sammmlow/ORBITM.git 24 | 25 | That's it! No further setup is needed. 26 | 27 | .. note:: **Packages Required:** numpy, matplotlib, tkinter, PIL, os, math, datetime, comtypes (for STK) 28 | 29 | Next, we will need a Python interpreter (or an IDE if you'd like) to open up the main file **orbitm.py**. -------------------------------------------------------------------------------- /docs/_build/html/_sources/docs_interpreting.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | Intepreting Results 19 | =================== 20 | 21 | After a successful ORBITM run, you would expect two output text files in the main directory, and three Matplotlib figures. 22 | 23 | The first text file **"output_summary.txt"** is a summary of the lifetime (i.e. how long the spacecraft can last **without** orbit maintenance). 24 | 25 | :: 26 | 27 | Lifetime decay is estimated to be on 13 May 2027 16:54:31.252 after 29940 orbits. 28 | The lifetime is 5.4 years. 29 | The total impulse needed: 2233.4388819714236 30 | The total Delta-V (m/s) needed is 13.137875776302492 31 | 32 | The second text file **"output_manoeuvres.txt"** is an estimate of the orbit maintenance manoeuvre schedule. 33 | 34 | :: 35 | 36 | 1 Maintain.Hohmann 2022-03-01 11:40:00 2.1896281088566925 37 | 2 Maintain.Hohmann 2022-04-29 12:07:49 2.1896767040214486 38 | 3 Maintain.Hohmann 2022-06-27 12:35:38 2.1896387651453866 39 | 4 Maintain.Hohmann 2022-08-25 13:03:27 2.189679576264574 40 | 5 Maintain.Hohmann 2022-10-23 13:31:16 2.1896504433114723 41 | 6 Maintain.Hohmann 2022-12-21 13:59:05 2.1896153519034436 42 | 43 | To interpret the graphical results, let us run a simple orbit maintenance scenario for a satellite in a 550km altitude circular orbit at 45 degrees inclination. 44 | 45 | The plots in blue correspond to **"Sam's Simulator"**. The plots in orange correspond to using **STK 10** Astrogator, with a high precision orbit propagator, and it uses Astrogator's Automatic Sequences feature to boost the orbit up whenever the altitude of the spacecraft crosses the minimum of the maintenance tolerance band. In both orbit maintenance modes, the ΔV values were computed using a first order Taylor expansion to the Vis-Visa equation. 46 | 47 | .. figure:: /_images/orbmgui_full.jpg 48 | :align: center 49 | 50 | Figure 3.1 - Screenshot after running ORBITM, for a 550km orbit with a tolerance band of 1km 51 | 52 | The plot most relevant to mission planning that you would need is the top-most plot - the profile of the mission lifetime (in terms of total ΔV requirements) against the thruster specifications (bar charts). The height of the bar chart can be compared against the desired fuel mass needed, at the thruster's specific impulse values (Isp, units in seconds). In other words, for each thruster's Isp value, if the height of the bar chart (which represents the max fuel mass for that thruster, at that Isp) exceeds the fuel mass requirements of your mission at that particular Isp, then that thruster can satisfy your mission lifetime requirements. 53 | 54 | .. note:: The native **"Sam's Simulator"** uses the US Standard Atmosphere 1976 as the atmospheric density model as a look-up table of coefficients in an exponential function (for speed), while the **STK Mode** uses the Jacchia Roberts atmospheric density model. Also, the native mode uses an approximated orbit decay model while **STK Mode** performs a full orbit propagation for all 6 states. Thus, running ORBITM with STK makes computation very much slower, and the ∆V values in both modes would differ, although in most cases they are close (and definitely in the same order of magnitude). 55 | 56 | -------------------------------------------------------------------------------- /docs/_build/html/_sources/docs_orbmaint.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | Orbit Maintenance Model 19 | ======================= 20 | 21 | This section explains the algorithm behind the fast but approximated orbit maintenance simulations (**"Sam's Simulator"**). 22 | 23 | The key idea is that one does not need to obtain all six parameters of the spacecraft during orbit propagation! Where a sufficiently accurate drag model is available, one really just needs the radial magnitude of the spacecraft in order to characterise the orbital energy loss due to the atmospheric density. This simplifies the number of calculations needed. In this section, the derivation of the decay model will be shared. 24 | 25 | The goal of this exercise is to derive how the rate of change of a satellite's radial distance relates to the drag forces at play. We begin with first principles - an expression on the orbit state energy - and find its derivative with respect to time and altitude. 26 | 27 | .. figure:: /_images/orbm_deriv1.png 28 | :align: center 29 | 30 | Figure 4.1 - Derivative of orbit state energy with respect to time and altitude. 31 | 32 | The rate of change of work done by drag forces can be multiplied with the inverse of the altitude derivative of orbital energy, thereby removing the energy differential, **dU**, as the common term. Now, we have an expression for the rate of altitude change! We simply need to input the drag force **F**, and the radial distance of the satellite **R**. 33 | 34 | .. figure:: /_images/orbm_deriv2.png 35 | :align: center 36 | 37 | Figure 4.2 - Deriving the rate of change of the satellite altitude. 38 | 39 | The radial distance **R** can be solved for through Kepler's Equation in the Python file **orbitm_func_kepler.py** and using the input orbit parameters for a purely Keplerian orbit. 40 | 41 | The drag force **F**, or equivalently the drag acceleration **α**, is computed via the standard `drag equation `_, as a result of the satellite area-to-mass parameters (as set by the user), and the atmopsheric density value at radial distance **R**. The density is sourced from **orbitm_func_atmos.py**. This file is basically the U.S. Standard Atmosphere 1976, represented as a look-up table of coefficients for an exponential atmospheric model. 42 | 43 | Simplifying the altitude decay rate model, we arrive at the elegant statement in 4.3: 44 | 45 | .. figure:: /_images/orbm_deriv3.png 46 | :align: center 47 | 48 | **Equation 4.3 - Decay rate = product of drag deceleration and Keplerian period, divided by Pi** 49 | 50 | This is powerful, because it proves that the rate at which the orbit decays can be solved in closed-form without any full orbit propagation of orbit states! This is the reason why orbit maintenance computations are extremely fast on ORBITM. 51 | 52 | As the decay rate is also small, the total decay appears almost linear within the time frame of a single LEO orbital period (~95 minutes). Thus, a larger step size can also be used, without compromising too much on accuracy. 53 | 54 | Consequently, the ORBITM program simply loops through the scenario time, and computes the decay in each time step until the spacecraft descends below the **Maintenance Tolerance Band**, which then triggers an orbit raise. This repeats until the end of the simulation. -------------------------------------------------------------------------------- /docs/_build/html/_sources/docs_overview.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | An Overview 19 | =========== 20 | 21 | **Why was ORBITM created?** There are two key reasons behind ORBITM. First, the proliferation of tens of thousands of LEO satellites in our near future mandates a quick and efficient means of estimating the lifetime of not just the orbiters but also of debris. The second reason is that ORBITM can also be used to support rapid iterations of spacecraft designs in agile development. For example, different iterations of solar panels or radar reflector designs that are proposed frequently, would impact the drag characteristics and mission life-time. ORBITM allows for the rapid ball-park assessments of such scenarios. 22 | 23 | .. figure:: /_images/orbm_rationale.png 24 | :align: center 25 | 26 | Figure 1.1 - Agile development demands that the mission planner can perform frequent mission life comparisons over rapidly changing iterations of spacecraft structures. 27 | 28 | Traditional orbit maintenance simulations can be cumbersome and tedious to do on STK, GMAT, FreeFlyer, or even on your own code. Thus, ORBITM simplifies this entire drag-simulation process - in a fast and automated way that keeps up with rapidly changing iterations, without over-burdening the mission planner with repeated mission life-time simulations. 29 | 30 | There are two modes of simulation available in ORBITM. 31 | 32 | The first, is a fast-compute orbit decay and maintenance model considering primarily drag effects using the U.S. Standard Atmosphere 1976 model (**Sam's Simulator**). 33 | 34 | .. image:: /_images/orbm_flow_sams.png 35 | 36 | The second is a more accurately modelled but resource intensive mode that interfaces with and automates STK Astrogator to perform a high-precision orbit decay and maintenance simulation. The orbit model in STK uses a 21 by 21 (degree by order) geopotential and computes drag using a Jacchia-Roberts Atmospheric Density model. 37 | 38 | .. image:: /_images/orbm_flow_stk.png 39 | 40 | However, in the second mode, you would need a valid `STK Astrogator `_ and `STK Integration `_ license installed with STK 10 or 11, for the interfacing to work. 41 | 42 | .. note:: ORBITM was designed for low Earth orbits. Thus, the working range of altitudes, before loss of atmospheric density accuracies, should be bounded within 86 - 1,000 km. 43 | 44 | .. warning:: ORBITM was **not designed for high precision**, and thus the life-time estimation **cannot be used for re-entry and descent** positioning estimations. -------------------------------------------------------------------------------- /docs/_build/html/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. |docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat-square 15 | :target: https://orbitm.readthedocs.io/en/latest/ 16 | 17 | .. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square 18 | :target: https://github.com/sammmlow/ORBITM/blob/master/LICENSE 19 | 20 | .. |orcid| image:: https://img.shields.io/badge/ID-0000--0002--1911--701X-a6ce39.svg 21 | :target: https://orcid.org/0000-0002-1911-701X/ 22 | 23 | .. |linkedin| image:: https://img.shields.io/badge/LinkedIn-sammmlow-blue.svg 24 | :target: https://www.linkedin.com/in/sammmlow 25 | 26 | .. image:: /_static/orbitm_logo.png 27 | 28 | | 29 | 30 | :Github: https://github.com/sammmlow/ORBITM 31 | :Documents: https://orbitm.readthedocs.io/en/latest/ 32 | :Version: 1.1 (Latest) 33 | :Author: Samuel Y. W. Low 34 | 35 | |docs| |license| |linkedin| |orcid| 36 | 37 | ORBITM 38 | ====== 39 | 40 | ORBITM stands for the **Orbit Maintenance and Propulsion Sizing Tool**, and it is an open-source, easy-to-use, free-ware orbit maintenance simulator and propulsion sizing tool, for anyone with a Python 3 installation. The software comes with its own built-in orbit decay model and maintenance simulator, a life-time estimator, and it is also interface-able with AGI's Systems Tool Kit (STK) as an alternative mode of simulation. 41 | 42 | The objective of ORBITM is to allow for a quick sizing of low Earth orbit (LEO) mission lifetime, while sizing the mission against propulsion units of the user's choosing. The user may input into the UI their orbital parameters, spacecraft properties (mass, area, drag parameters etc), and the software will compute your desired ΔV necessary for the mission, track the altitude profile over time, and plot the thruster-fuel profile that satisfies the orbit maintenance needs of your mission. 43 | 44 | Document tree for ORBITM is listed out below. 45 | 46 | .. toctree:: 47 | :maxdepth: 1 48 | :caption: Getting Started 49 | 50 | docs_overview.rst 51 | docs_install.rst 52 | docs_firststep.rst 53 | docs_interpreting.rst 54 | 55 | .. toctree:: 56 | :maxdepth: 1 57 | :caption: Orbit Maintenance 58 | 59 | docs_orbmaint.rst 60 | docs_functions.rst 61 | 62 | | 63 | 64 | If ORBITM has made your life somewhat easier, please do cite the work behind it! 65 | 66 | `Low, S. Y. W., &; Chia, Y. X. (2018). “Assessment of Orbit Maintenance Strategies for Small Satellites”, 32nd Annual AIAA/USU Conference on Small Satellites, Logan, Utah, Utah State University, USA. `_ 67 | 68 | 69 | For bugs, raise the issues in the `GitHub repository `_. 70 | 71 | For collaborations, reach out to me: sammmlow@gmail.com (Samuel Y. W. Low) 72 | 73 | |linkedin| |orcid| 74 | 75 | The project is licensed under the MIT license. 76 | 77 | 78 | .. toctree:: 79 | :maxdepth: 2 80 | :caption: Contents: 81 | -------------------------------------------------------------------------------- /docs/_build/html/_static/css/badge_only.css: -------------------------------------------------------------------------------- 1 | .fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-bold-italic.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-bold.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-bold.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-normal-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-normal-italic.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-normal-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-normal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-normal.woff -------------------------------------------------------------------------------- /docs/_build/html/_static/css/fonts/lato-normal.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/css/fonts/lato-normal.woff2 -------------------------------------------------------------------------------- /docs/_build/html/_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * doctools.js 3 | * ~~~~~~~~~~~ 4 | * 5 | * Sphinx JavaScript utilities for all documentation. 6 | * 7 | * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | /** 13 | * select a different prefix for underscore 14 | */ 15 | $u = _.noConflict(); 16 | 17 | /** 18 | * make the code below compatible with browsers without 19 | * an installed firebug like debugger 20 | if (!window.console || !console.firebug) { 21 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir", 22 | "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", 23 | "profile", "profileEnd"]; 24 | window.console = {}; 25 | for (var i = 0; i < names.length; ++i) 26 | window.console[names[i]] = function() {}; 27 | } 28 | */ 29 | 30 | /** 31 | * small helper function to urldecode strings 32 | * 33 | * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL 34 | */ 35 | jQuery.urldecode = function(x) { 36 | if (!x) { 37 | return x 38 | } 39 | return decodeURIComponent(x.replace(/\+/g, ' ')); 40 | }; 41 | 42 | /** 43 | * small helper function to urlencode strings 44 | */ 45 | jQuery.urlencode = encodeURIComponent; 46 | 47 | /** 48 | * This function returns the parsed url parameters of the 49 | * current request. Multiple values per key are supported, 50 | * it will always return arrays of strings for the value parts. 51 | */ 52 | jQuery.getQueryParameters = function(s) { 53 | if (typeof s === 'undefined') 54 | s = document.location.search; 55 | var parts = s.substr(s.indexOf('?') + 1).split('&'); 56 | var result = {}; 57 | for (var i = 0; i < parts.length; i++) { 58 | var tmp = parts[i].split('=', 2); 59 | var key = jQuery.urldecode(tmp[0]); 60 | var value = jQuery.urldecode(tmp[1]); 61 | if (key in result) 62 | result[key].push(value); 63 | else 64 | result[key] = [value]; 65 | } 66 | return result; 67 | }; 68 | 69 | /** 70 | * highlight a given string on a jquery object by wrapping it in 71 | * span elements with the given class name. 72 | */ 73 | jQuery.fn.highlightText = function(text, className) { 74 | function highlight(node, addItems) { 75 | if (node.nodeType === 3) { 76 | var val = node.nodeValue; 77 | var pos = val.toLowerCase().indexOf(text); 78 | if (pos >= 0 && 79 | !jQuery(node.parentNode).hasClass(className) && 80 | !jQuery(node.parentNode).hasClass("nohighlight")) { 81 | var span; 82 | var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); 83 | if (isInSVG) { 84 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 85 | } else { 86 | span = document.createElement("span"); 87 | span.className = className; 88 | } 89 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 90 | node.parentNode.insertBefore(span, node.parentNode.insertBefore( 91 | document.createTextNode(val.substr(pos + text.length)), 92 | node.nextSibling)); 93 | node.nodeValue = val.substr(0, pos); 94 | if (isInSVG) { 95 | var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 96 | var bbox = node.parentElement.getBBox(); 97 | rect.x.baseVal.value = bbox.x; 98 | rect.y.baseVal.value = bbox.y; 99 | rect.width.baseVal.value = bbox.width; 100 | rect.height.baseVal.value = bbox.height; 101 | rect.setAttribute('class', className); 102 | addItems.push({ 103 | "parent": node.parentNode, 104 | "target": rect}); 105 | } 106 | } 107 | } 108 | else if (!jQuery(node).is("button, select, textarea")) { 109 | jQuery.each(node.childNodes, function() { 110 | highlight(this, addItems); 111 | }); 112 | } 113 | } 114 | var addItems = []; 115 | var result = this.each(function() { 116 | highlight(this, addItems); 117 | }); 118 | for (var i = 0; i < addItems.length; ++i) { 119 | jQuery(addItems[i].parent).before(addItems[i].target); 120 | } 121 | return result; 122 | }; 123 | 124 | /* 125 | * backward compatibility for jQuery.browser 126 | * This will be supported until firefox bug is fixed. 127 | */ 128 | if (!jQuery.browser) { 129 | jQuery.uaMatch = function(ua) { 130 | ua = ua.toLowerCase(); 131 | 132 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 133 | /(webkit)[ \/]([\w.]+)/.exec(ua) || 134 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 135 | /(msie) ([\w.]+)/.exec(ua) || 136 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 137 | []; 138 | 139 | return { 140 | browser: match[ 1 ] || "", 141 | version: match[ 2 ] || "0" 142 | }; 143 | }; 144 | jQuery.browser = {}; 145 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; 146 | } 147 | 148 | /** 149 | * Small JavaScript module for the documentation. 150 | */ 151 | var Documentation = { 152 | 153 | init : function() { 154 | this.fixFirefoxAnchorBug(); 155 | this.highlightSearchWords(); 156 | this.initIndexTable(); 157 | if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { 158 | this.initOnKeyListeners(); 159 | } 160 | }, 161 | 162 | /** 163 | * i18n support 164 | */ 165 | TRANSLATIONS : {}, 166 | PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, 167 | LOCALE : 'unknown', 168 | 169 | // gettext and ngettext don't access this so that the functions 170 | // can safely bound to a different name (_ = Documentation.gettext) 171 | gettext : function(string) { 172 | var translated = Documentation.TRANSLATIONS[string]; 173 | if (typeof translated === 'undefined') 174 | return string; 175 | return (typeof translated === 'string') ? translated : translated[0]; 176 | }, 177 | 178 | ngettext : function(singular, plural, n) { 179 | var translated = Documentation.TRANSLATIONS[singular]; 180 | if (typeof translated === 'undefined') 181 | return (n == 1) ? singular : plural; 182 | return translated[Documentation.PLURALEXPR(n)]; 183 | }, 184 | 185 | addTranslations : function(catalog) { 186 | for (var key in catalog.messages) 187 | this.TRANSLATIONS[key] = catalog.messages[key]; 188 | this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); 189 | this.LOCALE = catalog.locale; 190 | }, 191 | 192 | /** 193 | * add context elements like header anchor links 194 | */ 195 | addContextElements : function() { 196 | $('div[id] > :header:first').each(function() { 197 | $('\u00B6'). 198 | attr('href', '#' + this.id). 199 | attr('title', _('Permalink to this headline')). 200 | appendTo(this); 201 | }); 202 | $('dt[id]').each(function() { 203 | $('\u00B6'). 204 | attr('href', '#' + this.id). 205 | attr('title', _('Permalink to this definition')). 206 | appendTo(this); 207 | }); 208 | }, 209 | 210 | /** 211 | * workaround a firefox stupidity 212 | * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 213 | */ 214 | fixFirefoxAnchorBug : function() { 215 | if (document.location.hash && $.browser.mozilla) 216 | window.setTimeout(function() { 217 | document.location.href += ''; 218 | }, 10); 219 | }, 220 | 221 | /** 222 | * highlight the search words provided in the url in the text 223 | */ 224 | highlightSearchWords : function() { 225 | var params = $.getQueryParameters(); 226 | var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; 227 | if (terms.length) { 228 | var body = $('div.body'); 229 | if (!body.length) { 230 | body = $('body'); 231 | } 232 | window.setTimeout(function() { 233 | $.each(terms, function() { 234 | body.highlightText(this.toLowerCase(), 'highlighted'); 235 | }); 236 | }, 10); 237 | $('') 239 | .appendTo($('#searchbox')); 240 | } 241 | }, 242 | 243 | /** 244 | * init the domain index toggle buttons 245 | */ 246 | initIndexTable : function() { 247 | var togglers = $('img.toggler').click(function() { 248 | var src = $(this).attr('src'); 249 | var idnum = $(this).attr('id').substr(7); 250 | $('tr.cg-' + idnum).toggle(); 251 | if (src.substr(-9) === 'minus.png') 252 | $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); 253 | else 254 | $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); 255 | }).css('display', ''); 256 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { 257 | togglers.click(); 258 | } 259 | }, 260 | 261 | /** 262 | * helper function to hide the search marks again 263 | */ 264 | hideSearchWords : function() { 265 | $('#searchbox .highlight-link').fadeOut(300); 266 | $('span.highlighted').removeClass('highlighted'); 267 | }, 268 | 269 | /** 270 | * make the url absolute 271 | */ 272 | makeURL : function(relativeURL) { 273 | return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; 274 | }, 275 | 276 | /** 277 | * get the current relative url 278 | */ 279 | getCurrentURL : function() { 280 | var path = document.location.pathname; 281 | var parts = path.split(/\//); 282 | $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { 283 | if (this === '..') 284 | parts.pop(); 285 | }); 286 | var url = parts.join('/'); 287 | return path.substring(url.lastIndexOf('/') + 1, path.length - 1); 288 | }, 289 | 290 | initOnKeyListeners: function() { 291 | $(document).keydown(function(event) { 292 | var activeElementType = document.activeElement.tagName; 293 | // don't navigate when in search box, textarea, dropdown or button 294 | if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' 295 | && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey 296 | && !event.shiftKey) { 297 | switch (event.keyCode) { 298 | case 37: // left 299 | var prevHref = $('link[rel="prev"]').prop('href'); 300 | if (prevHref) { 301 | window.location.href = prevHref; 302 | return false; 303 | } 304 | case 39: // right 305 | var nextHref = $('link[rel="next"]').prop('href'); 306 | if (nextHref) { 307 | window.location.href = nextHref; 308 | return false; 309 | } 310 | } 311 | } 312 | }); 313 | } 314 | }; 315 | 316 | // quick alias for translations 317 | _ = Documentation.gettext; 318 | 319 | $(document).ready(function() { 320 | Documentation.init(); 321 | }); 322 | -------------------------------------------------------------------------------- /docs/_build/html/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | var DOCUMENTATION_OPTIONS = { 2 | URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), 3 | VERSION: '1.1', 4 | LANGUAGE: 'None', 5 | COLLAPSE_INDEX: false, 6 | BUILDER: 'html', 7 | FILE_SUFFIX: '.html', 8 | LINK_SUFFIX: '.html', 9 | HAS_SOURCE: true, 10 | SOURCELINK_SUFFIX: '.txt', 11 | NAVIGATION_WITH_KEYS: false 12 | }; -------------------------------------------------------------------------------- /docs/_build/html/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/file.png -------------------------------------------------------------------------------- /docs/_build/html/_static/js/badge_only.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); -------------------------------------------------------------------------------- /docs/_build/html/_static/js/html5shiv-printshiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3-pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /docs/_build/html/_static/js/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /docs/_build/html/_static/js/theme.js: -------------------------------------------------------------------------------- 1 | !function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 63 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 64 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 65 | var s_v = "^(" + C + ")?" + v; // vowel in stem 66 | 67 | this.stemWord = function (w) { 68 | var stem; 69 | var suffix; 70 | var firstch; 71 | var origword = w; 72 | 73 | if (w.length < 3) 74 | return w; 75 | 76 | var re; 77 | var re2; 78 | var re3; 79 | var re4; 80 | 81 | firstch = w.substr(0,1); 82 | if (firstch == "y") 83 | w = firstch.toUpperCase() + w.substr(1); 84 | 85 | // Step 1a 86 | re = /^(.+?)(ss|i)es$/; 87 | re2 = /^(.+?)([^s])s$/; 88 | 89 | if (re.test(w)) 90 | w = w.replace(re,"$1$2"); 91 | else if (re2.test(w)) 92 | w = w.replace(re2,"$1$2"); 93 | 94 | // Step 1b 95 | re = /^(.+?)eed$/; 96 | re2 = /^(.+?)(ed|ing)$/; 97 | if (re.test(w)) { 98 | var fp = re.exec(w); 99 | re = new RegExp(mgr0); 100 | if (re.test(fp[1])) { 101 | re = /.$/; 102 | w = w.replace(re,""); 103 | } 104 | } 105 | else if (re2.test(w)) { 106 | var fp = re2.exec(w); 107 | stem = fp[1]; 108 | re2 = new RegExp(s_v); 109 | if (re2.test(stem)) { 110 | w = stem; 111 | re2 = /(at|bl|iz)$/; 112 | re3 = new RegExp("([^aeiouylsz])\\1$"); 113 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 114 | if (re2.test(w)) 115 | w = w + "e"; 116 | else if (re3.test(w)) { 117 | re = /.$/; 118 | w = w.replace(re,""); 119 | } 120 | else if (re4.test(w)) 121 | w = w + "e"; 122 | } 123 | } 124 | 125 | // Step 1c 126 | re = /^(.+?)y$/; 127 | if (re.test(w)) { 128 | var fp = re.exec(w); 129 | stem = fp[1]; 130 | re = new RegExp(s_v); 131 | if (re.test(stem)) 132 | w = stem + "i"; 133 | } 134 | 135 | // Step 2 136 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 137 | if (re.test(w)) { 138 | var fp = re.exec(w); 139 | stem = fp[1]; 140 | suffix = fp[2]; 141 | re = new RegExp(mgr0); 142 | if (re.test(stem)) 143 | w = stem + step2list[suffix]; 144 | } 145 | 146 | // Step 3 147 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 148 | if (re.test(w)) { 149 | var fp = re.exec(w); 150 | stem = fp[1]; 151 | suffix = fp[2]; 152 | re = new RegExp(mgr0); 153 | if (re.test(stem)) 154 | w = stem + step3list[suffix]; 155 | } 156 | 157 | // Step 4 158 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 159 | re2 = /^(.+?)(s|t)(ion)$/; 160 | if (re.test(w)) { 161 | var fp = re.exec(w); 162 | stem = fp[1]; 163 | re = new RegExp(mgr1); 164 | if (re.test(stem)) 165 | w = stem; 166 | } 167 | else if (re2.test(w)) { 168 | var fp = re2.exec(w); 169 | stem = fp[1] + fp[2]; 170 | re2 = new RegExp(mgr1); 171 | if (re2.test(stem)) 172 | w = stem; 173 | } 174 | 175 | // Step 5 176 | re = /^(.+?)e$/; 177 | if (re.test(w)) { 178 | var fp = re.exec(w); 179 | stem = fp[1]; 180 | re = new RegExp(mgr1); 181 | re2 = new RegExp(meq1); 182 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 183 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 184 | w = stem; 185 | } 186 | re = /ll$/; 187 | re2 = new RegExp(mgr1); 188 | if (re.test(w) && re2.test(w)) { 189 | re = /.$/; 190 | w = w.replace(re,""); 191 | } 192 | 193 | // and turn initial Y back to y 194 | if (firstch == "y") 195 | w = firstch.toLowerCase() + w.substr(1); 196 | return w; 197 | } 198 | } 199 | 200 | 201 | 202 | 203 | var splitChars = (function() { 204 | var result = {}; 205 | var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, 206 | 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, 207 | 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, 208 | 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, 209 | 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, 210 | 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, 211 | 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, 212 | 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, 213 | 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, 214 | 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; 215 | var i, j, start, end; 216 | for (i = 0; i < singles.length; i++) { 217 | result[singles[i]] = true; 218 | } 219 | var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], 220 | [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], 221 | [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], 222 | [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], 223 | [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], 224 | [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], 225 | [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], 226 | [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], 227 | [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], 228 | [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], 229 | [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], 230 | [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], 231 | [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], 232 | [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], 233 | [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], 234 | [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], 235 | [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], 236 | [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], 237 | [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], 238 | [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], 239 | [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], 240 | [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], 241 | [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], 242 | [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], 243 | [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], 244 | [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], 245 | [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], 246 | [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], 247 | [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], 248 | [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], 249 | [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], 250 | [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], 251 | [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], 252 | [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], 253 | [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], 254 | [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], 255 | [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], 256 | [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], 257 | [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], 258 | [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], 259 | [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], 260 | [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], 261 | [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], 262 | [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], 263 | [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], 264 | [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], 265 | [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], 266 | [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], 267 | [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; 268 | for (i = 0; i < ranges.length; i++) { 269 | start = ranges[i][0]; 270 | end = ranges[i][1]; 271 | for (j = start; j <= end; j++) { 272 | result[j] = true; 273 | } 274 | } 275 | return result; 276 | })(); 277 | 278 | function splitQuery(query) { 279 | var result = []; 280 | var start = -1; 281 | for (var i = 0; i < query.length; i++) { 282 | if (splitChars[query.charCodeAt(i)]) { 283 | if (start !== -1) { 284 | result.push(query.slice(start, i)); 285 | start = -1; 286 | } 287 | } else if (start === -1) { 288 | start = i; 289 | } 290 | } 291 | if (start !== -1) { 292 | result.push(query.slice(start)); 293 | } 294 | return result; 295 | } 296 | 297 | 298 | -------------------------------------------------------------------------------- /docs/_build/html/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/minus.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbitm_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbitm_favicon.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbitm_favicon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbitm_favicon2.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbitm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbitm_logo.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbitm_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbitm_thumbnail.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_deriv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_deriv1.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_deriv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_deriv2.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_deriv3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_deriv3.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_flow_sams.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_flow_sams.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_flow_stk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_flow_stk.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_logo_large_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_logo_large_old.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_logo_notext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_logo_notext.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_logo_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_logo_old.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_outp_450km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_outp_450km.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_outp_500km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_outp_500km.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_outp_550km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_outp_550km.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbm_rationale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbm_rationale.png -------------------------------------------------------------------------------- /docs/_build/html/_static/orbmgui_blank.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbmgui_blank.jpg -------------------------------------------------------------------------------- /docs/_build/html/_static/orbmgui_full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbmgui_full.jpg -------------------------------------------------------------------------------- /docs/_build/html/_static/orbmgui_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/orbmgui_old.png -------------------------------------------------------------------------------- /docs/_build/html/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/_static/plus.png -------------------------------------------------------------------------------- /docs/_build/html/_static/pygments.css: -------------------------------------------------------------------------------- 1 | pre { line-height: 125%; } 2 | td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 3 | span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 4 | td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 5 | span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 6 | .highlight .hll { background-color: #ffffcc } 7 | .highlight { background: #f8f8f8; } 8 | .highlight .c { color: #408080; font-style: italic } /* Comment */ 9 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 10 | .highlight .k { color: #008000; font-weight: bold } /* Keyword */ 11 | .highlight .o { color: #666666 } /* Operator */ 12 | .highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ 13 | .highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ 14 | .highlight .cp { color: #BC7A00 } /* Comment.Preproc */ 15 | .highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ 16 | .highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ 17 | .highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ 18 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 19 | .highlight .ge { font-style: italic } /* Generic.Emph */ 20 | .highlight .gr { color: #FF0000 } /* Generic.Error */ 21 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 22 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 23 | .highlight .go { color: #888888 } /* Generic.Output */ 24 | .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 25 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 26 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 27 | .highlight .gt { color: #0044DD } /* Generic.Traceback */ 28 | .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 29 | .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 30 | .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 31 | .highlight .kp { color: #008000 } /* Keyword.Pseudo */ 32 | .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 33 | .highlight .kt { color: #B00040 } /* Keyword.Type */ 34 | .highlight .m { color: #666666 } /* Literal.Number */ 35 | .highlight .s { color: #BA2121 } /* Literal.String */ 36 | .highlight .na { color: #7D9029 } /* Name.Attribute */ 37 | .highlight .nb { color: #008000 } /* Name.Builtin */ 38 | .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ 39 | .highlight .no { color: #880000 } /* Name.Constant */ 40 | .highlight .nd { color: #AA22FF } /* Name.Decorator */ 41 | .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ 42 | .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ 43 | .highlight .nf { color: #0000FF } /* Name.Function */ 44 | .highlight .nl { color: #A0A000 } /* Name.Label */ 45 | .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ 46 | .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ 47 | .highlight .nv { color: #19177C } /* Name.Variable */ 48 | .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ 49 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 50 | .highlight .mb { color: #666666 } /* Literal.Number.Bin */ 51 | .highlight .mf { color: #666666 } /* Literal.Number.Float */ 52 | .highlight .mh { color: #666666 } /* Literal.Number.Hex */ 53 | .highlight .mi { color: #666666 } /* Literal.Number.Integer */ 54 | .highlight .mo { color: #666666 } /* Literal.Number.Oct */ 55 | .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ 56 | .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ 57 | .highlight .sc { color: #BA2121 } /* Literal.String.Char */ 58 | .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ 59 | .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 60 | .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ 61 | .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ 62 | .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ 63 | .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ 64 | .highlight .sx { color: #008000 } /* Literal.String.Other */ 65 | .highlight .sr { color: #BB6688 } /* Literal.String.Regex */ 66 | .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ 67 | .highlight .ss { color: #19177C } /* Literal.String.Symbol */ 68 | .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ 69 | .highlight .fm { color: #0000FF } /* Name.Function.Magic */ 70 | .highlight .vc { color: #19177C } /* Name.Variable.Class */ 71 | .highlight .vg { color: #19177C } /* Name.Variable.Global */ 72 | .highlight .vi { color: #19177C } /* Name.Variable.Instance */ 73 | .highlight .vm { color: #19177C } /* Name.Variable.Magic */ 74 | .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /docs/_build/html/docs_firststep.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | First Steps — ORBITM 1.1 documentation 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 58 | 59 |
63 | 64 |
65 |
66 |
67 | 74 |
75 |
76 |
77 |
78 | 79 | _images/orbitm_logo.png 80 |
81 |

82 |
83 |
84 |

First Steps

85 |

ORBITM can be launched simply by running the Python file orbitm.py in the main directory (equivalent to the directory on the master branch on ORBITM’s GitHub). You should see a GUI that looks like the one below, pop up:

86 |
87 | _images/orbmgui_blank.jpg 88 |
89 |

Figure 2.1 - ORBITM Graphical User Interface

90 |
91 |
92 |

As a first step, you can simply load the default input parameters by clicking “Load Config”. The parameters are actually saved in the config.txt file. Configuration parameters should be loaded through the GUI, and not manually updated through the config.txt file since then the software can’t check for string formatting errors (e.g. a negative drag coefficient that was typed into the config file manually and by accident would crash the program).

93 |
94 |

Warning

95 |

An orbit eccentricity of exactly zero is not allowed, to prevent potential divide-by-zero issues during calculations. For near-perfectly circular orbits, set an arbitrarily small eccentricity number (e.g., 0.00001).

96 |
97 |

Second, you can choose which lifetime and maintenance simulator you would like to use. By default, the native “Sam’s Simulator” will be selected. If STK is selected, remember that a valid STK license for STK Integration and STK Astrogator is required.

98 |

Third, proceed to set the remainder of your orbit and spacecraft parameters. These parameters are self-explanatory. Some parameters are specific to ORBITM and are defined below:

99 |
100 |
Maintenance Tolerance Band
101 |

Threshold altitude that triggers an orbit raise (km).

102 |
103 |
Frozen Repeat Ground Track
104 |

Option to consider frozen repeat orbit maintenance.

105 |
106 |
107 |
108 |

Note

109 |

The altitude value used as the reference with the Maintenance Tolerance Band is defined as the geodetic altitude. In “Sam’s Simulator” mode, this altitude is the Keplerian semi-major axis minus Earth’s equatorial radius. However, STK-mode accounts for the oblateness of the Earth, and the presence of other perturbing forces. Thus, in STK mode, the Earth-centered altitude often oscillates with the latitude and with time, even for a “circular orbit”.

110 |

In order to prevent triggering a manoeuvre on the wrong rising or falling edge of the altitude profile, the STK mode triggers manoeuvres based on the Kozai-Izsak Mean Semi-Major Axis rather than the nominal altitude. It is acknowledged that this changes the definition for the “threshold altitude”, especially for highly elliptical orbits running in STK.

111 |
112 |

If the option for a Frozen Repeat Ground Track was selected, then the orbit raise will happen from the negative threshold below its initial altitude to a positive threshold above the initial altitude, and the thrusts will be done in perigee-apogee pairs. This minimises secular perturbations to the orbit mean eccentricity and the orbit nodal period. For example, if the Frozen Repeat Ground Track option was selected, with an initial altitude of 500km, and a threshold of 5km, the orbit raise will be triggered at 495km, and raised to 505km in two thrust pairs. Else, in the non-frozen repeat orbit maintenance case, the orbit raise will be triggered at 495km, and raised back to the original 500km.

113 |

Finally, before running the simulation (Run ORBITM), check the “thrusters.txt” file on the main ORBITM directory, and add thruster specifications that you wish to size your missions against. Some thrusters are written inside this shortlist as an example. The purpose of this shortlist is to provide the program with the thruster specifications, so that the mission planner can graphically compare its Isp and fuel capacity to the suitability of the mission (as an output of the program).

114 |

Now, you can run ORBITM. If you are a licensed STK user and you would like to use ORBITM to automate an orbit maintenance simulation in STK for you, make sure there are no running instances of STK before you run ORBITM in the STK 10 or 11 mode.

115 |
116 |

Note

117 |

ORBITM considers only atmospheric drag and not albedo and radiation effects.

118 |
119 |
120 | 121 | 122 |
123 |
124 |
128 | 129 |
130 | 131 |
132 |

© Copyright 2021, Samuel Y. W. Low.

133 |
134 | 135 | Built with Sphinx using a 136 | theme 137 | provided by Read the Docs. 138 | 139 | 140 |
141 |
142 |
143 |
144 |
145 | 150 | 151 | 152 | 161 | 162 | 163 | -------------------------------------------------------------------------------- /docs/_build/html/docs_functions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | API Reference — ORBITM 1.1 documentation 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 56 | 57 |
61 | 62 |
63 |
64 |
65 | 72 |
73 |
74 |
75 |
76 | 77 | _images/orbitm_logo.png 78 |
79 |

80 |
81 |
82 |

API Reference

83 |
84 | 85 | 86 |
87 |
88 |
91 | 92 |
93 | 94 |
95 |

© Copyright 2021, Samuel Y. W. Low.

96 |
97 | 98 | Built with Sphinx using a 99 | theme 100 | provided by Read the Docs. 101 | 102 | 103 |
104 |
105 |
106 |
107 |
108 | 113 | 114 | 115 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /docs/_build/html/docs_install.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Installation — ORBITM 1.1 documentation 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 58 | 59 |
63 | 64 |
65 |
66 |
67 | 74 |
75 |
76 |
77 |
78 | 79 | _images/orbitm_logo.png 80 |
81 |

82 |
83 |
84 |

Installation

85 |

First, find the ORBITM GitHub repository in this GitHub link, and download it. Alternatively, if you have Git installed, you can open Command Prompt or your Git Bash, enter the directory of your choice, and type:

86 |
git clone https://github.com/sammmlow/ORBITM.git
 87 | 
88 |
89 |

That’s it! No further setup is needed.

90 |
91 |

Note

92 |

Packages Required: numpy, matplotlib, tkinter, PIL, os, math, datetime, comtypes (for STK)

93 |
94 |

Next, we will need a Python interpreter (or an IDE if you’d like) to open up the main file orbitm.py.

95 |
96 | 97 | 98 |
99 |
100 |
104 | 105 |
106 | 107 |
108 |

© Copyright 2021, Samuel Y. W. Low.

109 |
110 | 111 | Built with Sphinx using a 112 | theme 113 | provided by Read the Docs. 114 | 115 | 116 |
117 |
118 |
119 |
120 |
121 | 126 | 127 | 128 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /docs/_build/html/docs_orbmaint.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Orbit Maintenance Model — ORBITM 1.1 documentation 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 57 | 58 |
62 | 63 |
64 |
65 |
66 | 73 |
74 |
75 |
76 |
77 | 78 | _images/orbitm_logo.png 79 |
80 |

81 |
82 |
83 |

Orbit Maintenance Model

84 |

This section explains the algorithm behind the fast but approximated orbit maintenance simulations (“Sam’s Simulator”).

85 |

The key idea is that one does not need to obtain all six parameters of the spacecraft during orbit propagation! Where a sufficiently accurate drag model is available, one really just needs the radial magnitude of the spacecraft in order to characterise the orbital energy loss due to the atmospheric density. This simplifies the number of calculations needed. In this section, the derivation of the decay model will be shared.

86 |

The goal of this exercise is to derive how the rate of change of a satellite’s radial distance relates to the drag forces at play. We begin with first principles - an expression on the orbit state energy - and find its derivative with respect to time and altitude.

87 |
88 | _images/orbm_deriv1.png 89 |
90 |

Figure 4.1 - Derivative of orbit state energy with respect to time and altitude.

91 |
92 |
93 |

The rate of change of work done by drag forces can be multiplied with the inverse of the altitude derivative of orbital energy, thereby removing the energy differential, dU, as the common term. Now, we have an expression for the rate of altitude change! We simply need to input the drag force F, and the radial distance of the satellite R.

94 |
95 | _images/orbm_deriv2.png 96 |
97 |

Figure 4.2 - Deriving the rate of change of the satellite altitude.

98 |
99 |
100 |

The radial distance R can be solved for through Kepler’s Equation in the Python file orbitm_func_kepler.py and using the input orbit parameters for a purely Keplerian orbit.

101 |

The drag force F, or equivalently the drag acceleration α, is computed via the standard drag equation, as a result of the satellite area-to-mass parameters (as set by the user), and the atmopsheric density value at radial distance R. The density is sourced from orbitm_func_atmos.py. This file is basically the U.S. Standard Atmosphere 1976, represented as a look-up table of coefficients for an exponential atmospheric model.

102 |

Simplifying the altitude decay rate model, we arrive at the elegant statement in 4.3:

103 |
104 | _images/orbm_deriv3.png 105 |
106 |

Equation 4.3 - Decay rate = product of drag deceleration and Keplerian period, divided by Pi

107 |
108 |
109 |

This is powerful, because it proves that the rate at which the orbit decays can be solved in closed-form without any full orbit propagation of orbit states! This is the reason why orbit maintenance computations are extremely fast on ORBITM.

110 |

As the decay rate is also small, the total decay appears almost linear within the time frame of a single LEO orbital period (~95 minutes). Thus, a larger step size can also be used, without compromising too much on accuracy.

111 |

Consequently, the ORBITM program simply loops through the scenario time, and computes the decay in each time step until the spacecraft descends below the Maintenance Tolerance Band, which then triggers an orbit raise. This repeats until the end of the simulation.

112 |
113 | 114 | 115 |
116 |
117 |
121 | 122 |
123 | 124 |
125 |

© Copyright 2021, Samuel Y. W. Low.

126 |
127 | 128 | Built with Sphinx using a 129 | theme 130 | provided by Read the Docs. 131 | 132 | 133 |
134 |
135 |
136 |
137 |
138 | 143 | 144 | 145 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /docs/_build/html/docs_overview.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | An Overview — ORBITM 1.1 documentation 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 58 | 59 |
63 | 64 |
65 |
66 |
67 | 74 |
75 |
76 |
77 |
78 | 79 | _images/orbitm_logo.png 80 |
81 |

82 |
83 |
84 |

An Overview

85 |

Why was ORBITM created? There are two key reasons behind ORBITM. First, the proliferation of tens of thousands of LEO satellites in our near future mandates a quick and efficient means of estimating the lifetime of not just the orbiters but also of debris. The second reason is that ORBITM can also be used to support rapid iterations of spacecraft designs in agile development. For example, different iterations of solar panels or radar reflector designs that are proposed frequently, would impact the drag characteristics and mission life-time. ORBITM allows for the rapid ball-park assessments of such scenarios.

86 |
87 | _images/orbm_rationale.png 88 |
89 |

Figure 1.1 - Agile development demands that the mission planner can perform frequent mission life comparisons over rapidly changing iterations of spacecraft structures.

90 |
91 |
92 |

Traditional orbit maintenance simulations can be cumbersome and tedious to do on STK, GMAT, FreeFlyer, or even on your own code. Thus, ORBITM simplifies this entire drag-simulation process - in a fast and automated way that keeps up with rapidly changing iterations, without over-burdening the mission planner with repeated mission life-time simulations.

93 |

There are two modes of simulation available in ORBITM.

94 |

The first, is a fast-compute orbit decay and maintenance model considering primarily drag effects using the U.S. Standard Atmosphere 1976 model (Sam’s Simulator).

95 | _images/orbm_flow_sams.png 96 |

The second is a more accurately modelled but resource intensive mode that interfaces with and automates STK Astrogator to perform a high-precision orbit decay and maintenance simulation. The orbit model in STK uses a 21 by 21 (degree by order) geopotential and computes drag using a Jacchia-Roberts Atmospheric Density model.

97 | _images/orbm_flow_stk.png 98 |

However, in the second mode, you would need a valid STK Astrogator and STK Integration license installed with STK 10 or 11, for the interfacing to work.

99 |
100 |

Note

101 |

ORBITM was designed for low Earth orbits. Thus, the working range of altitudes, before loss of atmospheric density accuracies, should be bounded within 86 - 1,000 km.

102 |
103 |
104 |

Warning

105 |

ORBITM was not designed for high precision, and thus the life-time estimation cannot be used for re-entry and descent positioning estimations.

106 |
107 |
108 | 109 | 110 |
111 |
112 |
116 | 117 |
118 | 119 |
120 |

© Copyright 2021, Samuel Y. W. Low.

121 |
122 | 123 | Built with Sphinx using a 124 | theme 125 | provided by Read the Docs. 126 | 127 | 128 |
129 |
130 |
131 |
132 |
133 | 138 | 139 | 140 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /docs/_build/html/genindex.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Index — ORBITM 1.1 documentation 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 55 | 56 |
60 | 61 |
62 |
63 |
64 |
    65 |
  • »
  • 66 |
  • Index
  • 67 |
  • 68 |
  • 69 |
70 |
71 |
72 |
73 |
74 | 75 | 76 |

Index

77 | 78 |
79 | 80 |
81 | 82 | 83 |
84 |
85 |
86 | 87 |
88 | 89 |
90 |

© Copyright 2021, Samuel Y. W. Low.

91 |
92 | 93 | Built with Sphinx using a 94 | theme 95 | provided by Read the Docs. 96 | 97 | 98 |
99 |
100 |
101 |
102 |
103 | 108 | 109 | 110 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /docs/_build/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | ORBITM — ORBITM 1.1 documentation 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 57 | 58 |
62 | 63 |
64 |
65 |
66 | 73 |
74 |
75 |
76 |
77 | 78 | _images/orbitm_logo.png 79 |
80 |

81 |
82 |
83 |
Github
84 |

https://github.com/sammmlow/ORBITM

85 |
86 |
Documents
87 |

https://orbitm.readthedocs.io/en/latest/

88 |
89 |
Version
90 |

1.1 (Latest)

91 |
92 |
Author
93 |

Samuel Y. W. Low

94 |
95 |
96 |

docs license linkedin orcid

97 |
98 |

ORBITM

99 |

ORBITM stands for the Orbit Maintenance and Propulsion Sizing Tool, and it is an open-source, easy-to-use, free-ware orbit maintenance simulator and propulsion sizing tool, for anyone with a Python 3 installation. The software comes with its own built-in orbit decay model and maintenance simulator, a life-time estimator, and it is also interface-able with AGI’s Systems Tool Kit (STK) as an alternative mode of simulation.

100 |

The objective of ORBITM is to allow for a quick sizing of low Earth orbit (LEO) mission lifetime, while sizing the mission against propulsion units of the user’s choosing. The user may input into the UI their orbital parameters, spacecraft properties (mass, area, drag parameters etc), and the software will compute your desired ΔV necessary for the mission, track the altitude profile over time, and plot the thruster-fuel profile that satisfies the orbit maintenance needs of your mission.

101 |

Document tree for ORBITM is listed out below.

102 |
103 |

Getting Started

104 | 110 |
111 |
112 |

Orbit Maintenance

113 | 117 |
118 |
119 |

120 |
121 |

If ORBITM has made your life somewhat easier, please do cite the work behind it!

122 |

Low, S. Y. W., &; Chia, Y. X. (2018). “Assessment of Orbit Maintenance Strategies for Small Satellites”, 32nd Annual AIAA/USU Conference on Small Satellites, Logan, Utah, Utah State University, USA.

123 |

For bugs, raise the issues in the GitHub repository.

124 |

For collaborations, reach out to me: sammmlow@gmail.com (Samuel Y. W. Low)

125 |

linkedin orcid

126 |

The project is licensed under the MIT license.

127 |
128 |
129 |
130 | 131 | 132 |
133 |
134 |
137 | 138 |
139 | 140 |
141 |

© Copyright 2021, Samuel Y. W. Low.

142 |
143 | 144 | Built with Sphinx using a 145 | theme 146 | provided by Read the Docs. 147 | 148 | 149 |
150 |
151 |
152 |
153 |
154 | 159 | 160 | 161 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /docs/_build/html/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_build/html/objects.inv -------------------------------------------------------------------------------- /docs/_build/html/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Search — ORBITM 1.1 documentation 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 58 | 59 |
63 | 64 |
65 |
66 |
67 |
    68 |
  • »
  • 69 |
  • Search
  • 70 |
  • 71 |
  • 72 |
73 |
74 |
75 |
76 |
77 | 78 | 85 | 86 | 87 |
88 | 89 |
90 | 91 |
92 |
93 |
94 | 95 |
96 | 97 |
98 |

© Copyright 2021, Samuel Y. W. Low.

99 |
100 | 101 | Built with Sphinx using a 102 | theme 103 | provided by Read the Docs. 104 | 105 | 106 |
107 |
108 |
109 |
110 |
111 | 116 | 117 | 118 | 127 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /docs/_build/html/searchindex.js: -------------------------------------------------------------------------------- 1 | Search.setIndex({docnames:["docs_firststep","docs_functions","docs_install","docs_interpreting","docs_orbmaint","docs_overview","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["docs_firststep.rst","docs_functions.rst","docs_install.rst","docs_interpreting.rst","docs_orbmaint.rst","docs_overview.rst","index.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":0,"00":3,"000":5,"00001":0,"01":3,"03":3,"04":3,"05":3,"06":3,"07":3,"08":3,"1":[0,3,4,5,6],"10":[0,3,5],"100":[],"11":[0,3,5],"12":3,"13":3,"137875776302492":3,"16":3,"1896153519034436":3,"1896281088566925":3,"1896387651453866":3,"1896504433114723":3,"1896767040214486":3,"189679576264574":3,"1976":[3,4,5],"1km":3,"2":[0,3,4],"2018":6,"2022":3,"2027":3,"21":[3,5],"2233":3,"23":3,"25":3,"252":3,"27":3,"29":3,"29940":3,"3":[3,4,6],"31":3,"32nd":6,"35":3,"38":3,"3x":[],"4":[3,4],"40":3,"4388819714236":3,"45":3,"450km":[],"49":3,"495km":0,"5":3,"500km":0,"505km":0,"54":3,"550km":3,"59":3,"5km":0,"6":3,"63":[],"86":5,"95":4,"\u03b1":4,"\u03b4v":[3,6],"case":[0,3],"default":0,"do":[5,6],"final":0,"function":3,"long":3,"while":[3,6],A:[],As:[0,4],By:0,For:[0,5,6],If:[0,6],In:[0,3,4],It:0,No:2,That:2,The:[0,3,4,5,6],There:5,These:0,To:3,abl:6,abov:0,acceler:4,accid:0,account:0,accur:[4,5],accuraci:[4,5],acknowledg:0,actual:0,add:0,after:3,against:[0,3,6],agi:6,agil:5,aiaa:6,albedo:0,algorithm:4,all:[3,4],allow:[0,5,6],almost:4,also:[3,4,5,6],altern:[2,6],although:3,altitud:[0,3,4,5,6],amount:[],an:[0,2,3,4,6],ani:4,annual:6,anyon:6,api:6,apoge:0,app:[],appear:4,appli:[],approxim:[3,4],ar:[0,3,4,5],arbitrarili:0,area:[4,6],arriv:4,assess:[5,6],astrog:[0,3,5],atmopsher:4,atmospher:[0,3,4,5],author:6,autom:[0,5],automat:3,avail:[4,5],axi:0,back:0,ball:5,band:[0,3,4],bar:3,base:0,bash:2,basic:4,becaus:4,befor:[0,5],begin:4,behind:[4,5,6],below:[0,4,6],blue:3,boost:3,both:3,bound:5,branch:0,bug:6,built:6,burden:5,calcul:[0,4],can:[0,2,3,4,5],cannot:5,capac:0,captur:[],center:0,chang:[0,4,5],characteris:4,characterist:5,chart:3,check:0,chia:6,choic:2,choos:[0,6],chosen:[],circular:[0,3],cite:6,click:0,clone:2,close:[3,4],code:5,coeffici:[0,3,4],collabor:6,com:[2,6],come:6,command:2,common:4,compar:[0,3],comparison:5,compromis:4,comput:[3,4,5,6],comtyp:2,confer:6,config:0,configur:0,consequ:4,consid:[0,5],correspond:3,counter:[],crash:0,creat:5,cross:3,cumbersom:5,d:2,data:[],datetim:2,debri:5,decai:[3,4,5,6],deceler:4,defin:0,definit:[0,3],degre:[3,5],delta:3,deltav:[],demand:5,densiti:[3,4,5],depend:[],deriv:4,descend:4,descent:5,design:5,desir:[3,6],develop:5,differ:[3,5],differenti:4,directori:[0,2,3],displai:[],distanc:4,divid:[0,4],document:6,doe:4,done:[0,4],download:2,drag:[0,4,5,6],du:4,due:4,dure:[0,4],e:[0,3],each:[3,4],earth:[0,5,6],easi:6,easier:6,eccentr:0,edg:0,effect:[0,5],effici:5,eleg:4,ellips:[],ellipt:0,els:0,embed:[],en:6,encount:[],end:4,energi:4,enter:2,entir:5,entri:5,equat:[3,4],equatori:0,equival:[0,4],error:0,especi:0,estim:[3,5,6],etc:6,even:[0,5],exactli:0,exampl:[0,5],exce:3,exercis:4,expans:3,expect:3,explain:4,explan:[],explanatori:0,explor:[],exponenti:[3,4],express:4,extract:[],extrem:4,f:4,fall:0,far:[],fast:[4,5],featur:3,figur:[0,3,4,5],file:[0,2,3,4],find:[2,4],fire:[],first:[2,3,4,5,6],forc:[0,4],form:4,format:0,frame:4,free:6,freeflyer:5,frequent:5,from:[0,4],frozen:0,fuel:[0,3,6],full:[3,4],further:2,futur:5,g:0,geodet:0,geopotenti:5,git:2,github:[0,2,6],give:[],gmail:6,gmat:5,goal:4,graphic:[0,3],ground:0,gui:0,ha:6,happen:0,have:[2,4],height:3,high:[3,5],highli:0,hohmann:3,how:[3,4],howev:[0,5],http:[2,6],i:3,id:2,idea:4,impact:5,impli:[],impuls:3,inclin:3,includ:[],increas:[],initi:0,input:[0,4,6],insid:0,instal:[5,6],instanc:0,integr:[0,5],intens:5,intepret:6,interfac:[0,5,6],interpret:[2,3],invers:4,io:6,isp:[0,3],issu:[0,6],iter:5,its:[0,4,6],izsak:0,jacchia:[3,5],just:[4,5],keep:5,kei:[4,5],kepler:4,keplerian:[0,4],kit:6,km:[0,5],kozai:0,larger:4,last:3,latest:6,latitud:0,launch:0,left:[],leo:[4,5,6],let:3,licens:[0,5,6],life:[5,6],lifetim:[0,3,5,6],like:[0,2],line:[],linear:4,link:2,list:6,load:0,logan:6,look:[0,3,4],loop:4,loss:[4,5],low:[5,6],m:3,made:6,magnitud:[3,4],mai:[3,6],main:[0,2,3],maintain:3,mainten:[0,3,5],major:0,make:[0,3],mandat:5,manoeuvr:[0,3],manual:0,margin:[],mass:[3,4,6],master:0,math:2,matplotlib:[2,3],max:3,me:6,mean:[0,5],minimis:0,minimum:3,minu:0,minut:4,mission:[0,3,5,6],mit:6,mode:[0,3,5,6],model:[3,5,6],more:5,most:3,much:[3,4],multipli:4,nativ:[0,3],necessari:6,need:[2,3,4,5,6],neg:0,next:2,nodal:0,nomin:0,non:0,now:[0,4],number:[0,4],numpi:2,object:6,oblat:0,obtain:4,occur:[],often:0,one:[0,4],onli:0,open:[2,6],option:0,orang:3,orbit:[0,3,5],orbitm:[0,2,3,4,5],orbitm_func_atmo:4,orbitm_func_kepl:4,order:[0,3,4,5],origin:0,os:2,oscil:0,other:[0,3],our:5,out:6,output:[0,3],output_manoeuvr:3,output_manoeuvre_:[],output_summari:3,output_summary_:[],over:[5,6],overview:6,own:[5,6],packag:2,pair:0,panel:5,paramet:[0,4,6],park:5,particular:3,per:[],perfectli:0,perform:[3,5],perige:0,period:[0,4],perturb:0,pi:4,pil:2,plai:4,plan:3,planner:[0,5],pleas:6,plot:[3,6],pop:0,posit:[0,5],potenti:0,power:4,precis:[3,5],presenc:0,pressur:[],prevent:0,primarili:5,principl:4,proce:0,process:5,product:4,profil:[0,3,6],program:[0,4],project:6,prolifer:5,prompt:2,propag:[3,4],properti:6,propos:5,propuls:6,prove:4,provid:0,pure:4,purpos:0,py:[0,2,4],python:[0,2,4,6],quick:[5,6],r:4,radar:5,radial:4,radiat:0,radiu:0,rais:[0,4,6],rang:5,rapid:5,rapidli:5,rate:4,rather:0,re:5,reach:6,readthedoc:6,realli:4,reason:[4,5],refer:[0,6],reflector:5,relat:4,relev:3,remaind:0,rememb:0,remov:4,repeat:[0,4,5],repositori:[2,6],repres:[3,4],requir:[0,2,3],resourc:5,respect:4,result:[4,6],rise:0,robert:[3,5],run:[0,3],s:[0,2,3,4,5,6],sam:[0,3,4,5],same:3,sammmlow:[2,6],samuel:6,satellit:[3,4,5,6],satisfi:[3,6],save:0,scale:[],scenario:[3,4,5],schedul:3,screenshot:3,second:[0,3,5],section:4,secular:0,see:0,select:0,self:0,semi:0,sens:[],separ:[],sequenc:3,set:[0,4],setup:2,share:4,shortlist:0,should:[0,5],show:[],simpl:3,simpli:[0,4],simplifi:[4,5],simul:[0,3,4,5,6],sinc:0,singl:4,six:4,size:[0,4,6],slower:3,small:[0,4,6],so:0,softwar:[0,6],solar:5,solv:4,some:0,somewhat:6,sourc:[4,6],spacecraft:[0,3,4,5,6],specif:[0,3],speed:3,spheric:[],stamp:[],stand:6,standard:[3,4,5],state:[3,4,6],statement:4,step:[4,6],stk:[0,2,3,5,6],strategi:6,string:0,structur:5,success:3,suffici:4,suitabl:0,summari:3,support:5,sure:0,system:6,t:0,tabl:[3,4],taylor:3,tediou:5,ten:5,term:[3,4],text:3,than:0,thei:3,therebi:4,thi:[0,2,4,5],third:0,thousand:5,three:3,threshold:0,through:[0,4],thrust:0,thruster:[0,3,6],thruster_shortlist:[],thu:[0,3,4,5],time:[0,4,5,6],tkinter:2,toler:[0,3,4],too:4,tool:6,top:3,total:[3,4],track:[0,6],tradit:5,tree:6,trigger:[0,4],tune:[],two:[0,3,5],txt:[0,3],type:[0,2],u:[4,5],ui:6,under:6,unit:[3,6],univers:6,until:4,up:[0,2,3,4,5],updat:0,us:[0,3,4,5,6],usa:6,user:[0,4,6],usu:6,utah:6,v:3,valid:[0,5],valu:[0,3,4],veri:3,version:6,vi:3,via:4,visa:3,w:6,wa:[0,5],wai:5,ware:6,we:[2,4],were:3,when:[],whenev:3,where:4,which:[0,3,4],why:[4,5],wish:0,within:[4,5],without:[3,4,5],word:3,work:[4,5,6],would:[0,3,5],written:0,wrong:0,x:6,y:6,year:3,you:[0,2,3,5],your:[0,2,3,5,6],zero:0},titles:["First Steps","API Reference","Installation","Intepreting Results","Orbit Maintenance Model","An Overview","ORBITM"],titleterms:{an:5,api:1,first:0,get:6,instal:2,intepret:3,mainten:[4,6],model:4,orbit:[4,6],orbitm:6,overview:5,refer:1,result:3,start:6,step:0}}) -------------------------------------------------------------------------------- /docs/_images/orbm_deriv1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_deriv1.png -------------------------------------------------------------------------------- /docs/_images/orbm_deriv2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_deriv2.png -------------------------------------------------------------------------------- /docs/_images/orbm_deriv3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_deriv3.png -------------------------------------------------------------------------------- /docs/_images/orbm_flow_sams.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_flow_sams.png -------------------------------------------------------------------------------- /docs/_images/orbm_flow_stk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_flow_stk.png -------------------------------------------------------------------------------- /docs/_images/orbm_logo_large_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_logo_large_old.png -------------------------------------------------------------------------------- /docs/_images/orbm_logo_notext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_logo_notext.png -------------------------------------------------------------------------------- /docs/_images/orbm_logo_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_logo_old.png -------------------------------------------------------------------------------- /docs/_images/orbm_outp_450km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_outp_450km.png -------------------------------------------------------------------------------- /docs/_images/orbm_outp_500km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_outp_500km.png -------------------------------------------------------------------------------- /docs/_images/orbm_outp_550km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_outp_550km.png -------------------------------------------------------------------------------- /docs/_images/orbm_rationale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbm_rationale.png -------------------------------------------------------------------------------- /docs/_images/orbmgui_blank.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbmgui_blank.jpg -------------------------------------------------------------------------------- /docs/_images/orbmgui_full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbmgui_full.jpg -------------------------------------------------------------------------------- /docs/_images/orbmgui_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_images/orbmgui_old.png -------------------------------------------------------------------------------- /docs/_papers/SSC18-PI-38 .pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_papers/SSC18-PI-38 .pdf -------------------------------------------------------------------------------- /docs/_static/orbitm_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_static/orbitm_favicon.png -------------------------------------------------------------------------------- /docs/_static/orbitm_favicon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_static/orbitm_favicon2.png -------------------------------------------------------------------------------- /docs/_static/orbitm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_static/orbitm_logo.png -------------------------------------------------------------------------------- /docs/_static/orbitm_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sammmlow/ORBITM/82f5ab7b457366b377e3d65e9822aad1608c90cd/docs/_static/orbitm_thumbnail.png -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | ############################################################################### 3 | ## ## 4 | ## _____ ___ ___ ___ _____ __ __ ## 5 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 6 | ## | |_| | <| _ < | | | | _ | \ / | ## 7 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 8 | ## v 1.1 ## 9 | ## ## 10 | ## Written by Samuel Y. W. Low. ## 11 | ## Last modified 22-Sep-2021. ## 12 | ## Website: https://github.com/sammmlow/ORBITM ## 13 | ## Documentation: https://orbitm.readthedocs.io/en/latest/ ## 14 | ## ## 15 | ############################################################################### 16 | ############################################################################### 17 | 18 | # Configuration file for the Sphinx documentation builder. 19 | # 20 | # This file only contains a selection of the most common options. For a full 21 | # list see the documentation: 22 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 23 | 24 | # -- Path setup -------------------------------------------------------------- 25 | 26 | # If extensions (or modules to document with autodoc) are in another directory, 27 | # add these directories to sys.path here. If the directory is relative to the 28 | # documentation root, use os.path.abspath to make it absolute, like shown here. 29 | # 30 | # import os 31 | # import sys 32 | # sys.path.insert(0, os.path.abspath('.')) 33 | 34 | import os 35 | import sys 36 | import sphinx_rtd_theme 37 | sys.path.insert(0, os.path.abspath('..')) 38 | sys.path.insert(0, os.path.abspath('../source')) 39 | 40 | html_theme = "sphinx_rtd_theme" 41 | # -- Project information ----------------------------------------------------- 42 | 43 | project = 'ORBITM' 44 | copyright = '2021, Samuel Y. W. Low' 45 | author = 'Samuel Y. W. Low' 46 | 47 | # The full version, including alpha/beta/rc tags 48 | release = '1.1' 49 | 50 | # -- General configuration --------------------------------------------------- 51 | 52 | # Add any Sphinx extension module names here, as strings. They can be 53 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 54 | # ones. 55 | extensions = ["sphinx_rtd_theme", 56 | "sphinx.ext.autodoc", 57 | "sphinx.ext.coverage", 58 | "sphinx.ext.napoleon"] 59 | 60 | # Add any paths that contain templates here, relative to this directory. 61 | templates_path = ['_templates'] 62 | 63 | # List of patterns, relative to source directory, that match files and 64 | # directories to ignore when looking for source files. 65 | # This pattern also affects html_static_path and html_extra_path. 66 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 67 | 68 | 69 | # -- Options for HTML output ------------------------------------------------- 70 | 71 | # The theme to use for HTML and HTML Help pages. See the documentation for 72 | # a list of builtin themes. 73 | # 74 | # html_theme = 'alabaster' 75 | 76 | # Add any paths that contain custom static files (such as style sheets) here, 77 | # relative to this directory. They are copied after the builtin static files, 78 | # so a file named "default.css" will overwrite the builtin "default.css". 79 | html_static_path = ['_static','_images'] 80 | 81 | html_theme_options = { 82 | 'analytics_id': 'UA-XXXXXXX-1', # Provided by Google in your dashboard 83 | 'analytics_anonymize_ip': False, 84 | 'logo_only': False, 85 | 'display_version': True, 86 | 'prev_next_buttons_location': 'bottom', 87 | 'style_external_links': False, 88 | 'vcs_pageview_mode': '', 89 | 'style_nav_header_background': '#222A35', 90 | # Toc options 91 | 'collapse_navigation': True, 92 | 'sticky_navigation': True, 93 | 'navigation_depth': 4, 94 | 'includehidden': True, 95 | 'titles_only': False 96 | } 97 | 98 | # Get the direct path 99 | dir_path = os.path.dirname(os.path.realpath(__file__)) 100 | 101 | # Add the HTML logo that displays on the top-left panel. 102 | html_logo = dir_path + '/_static/orbitm_favicon2.png' 103 | 104 | # Add the HTML logo. 105 | html_favicon = '_static/orbitm_favicon.png' -------------------------------------------------------------------------------- /docs/docs_firststep.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | First Steps 19 | =========== 20 | 21 | ORBITM can be launched simply by running the Python file **orbitm.py** in the main directory (equivalent to the directory on the master branch on ORBITM's GitHub). You should see a GUI that looks like the one below, pop up: 22 | 23 | .. figure:: /_images/orbmgui_blank.jpg 24 | :align: center 25 | 26 | Figure 2.1 - ORBITM Graphical User Interface 27 | 28 | As a first step, you can simply load the default input parameters by clicking "Load Config". The parameters are actually saved in the **config.txt** file. Configuration parameters should be loaded through the GUI, and not manually updated through the **config.txt** file since then the software can't check for string formatting errors (e.g. a negative drag coefficient that was typed into the config file manually and by accident would crash the program). 29 | 30 | .. warning:: An orbit eccentricity of exactly zero is not allowed, to prevent potential divide-by-zero issues during calculations. For near-perfectly circular orbits, set an arbitrarily small eccentricity number (e.g., 0.00001). 31 | 32 | Second, you can choose which lifetime and maintenance simulator you would like to use. By default, the native **"Sam's Simulator"** will be selected. If STK is selected, remember that **a valid STK license for STK Integration and STK Astrogator is required.** 33 | 34 | Third, proceed to set the remainder of your orbit and spacecraft parameters. These parameters are self-explanatory. Some parameters are specific to ORBITM and are defined below: 35 | 36 | :Maintenance Tolerance Band: Threshold altitude that triggers an orbit raise (km). 37 | 38 | :Frozen Repeat Ground Track: Option to consider frozen repeat orbit maintenance. 39 | 40 | .. note:: The altitude value used as the reference with the **Maintenance Tolerance Band** is defined as the geodetic altitude. In **"Sam's Simulator"** mode, this altitude is the Keplerian semi-major axis minus Earth's equatorial radius. However, STK-mode accounts for the oblateness of the Earth, and the presence of other perturbing forces. Thus, in STK mode, the Earth-centered altitude often oscillates with the latitude and with time, even for a "circular orbit". 41 | 42 | In order to prevent triggering a manoeuvre on the wrong rising or falling edge of the altitude profile, the STK mode triggers manoeuvres based on the **Kozai-Izsak Mean Semi-Major Axis** rather than the nominal altitude. It is acknowledged that this changes the definition for the "threshold altitude", especially for highly elliptical orbits running in STK. 43 | 44 | If the option for a **Frozen Repeat Ground Track** was selected, then the orbit raise will happen from the negative threshold below its initial altitude to a positive threshold above the initial altitude, and the thrusts will be done in perigee-apogee pairs. This minimises secular perturbations to the orbit mean eccentricity and the orbit nodal period. For example, if the **Frozen Repeat Ground Track** option was selected, with an initial altitude of 500km, and a threshold of 5km, the orbit raise will be triggered at 495km, and raised to 505km in two thrust pairs. Else, in the non-frozen repeat orbit maintenance case, the orbit raise will be triggered at 495km, and raised back to the original 500km. 45 | 46 | Finally, before running the simulation (**Run ORBITM**), check the **"thrusters.txt"** file on the main ORBITM directory, and add thruster specifications that you wish to size your missions against. Some thrusters are written inside this shortlist as an example. The purpose of this shortlist is to provide the program with the thruster specifications, so that the mission planner can graphically compare its Isp and fuel capacity to the suitability of the mission (as an output of the program). 47 | 48 | Now, you can run ORBITM. If you are a licensed STK user and you would like to use ORBITM to automate an orbit maintenance simulation in STK for you, make sure there are **no** running instances of STK before you run ORBITM in the STK 10 or 11 mode. 49 | 50 | .. note:: ORBITM considers only atmospheric drag and not albedo and radiation effects. 51 | -------------------------------------------------------------------------------- /docs/docs_functions.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | API Reference 19 | ============= 20 | 21 | -------------------------------------------------------------------------------- /docs/docs_install.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | Installation 19 | ============ 20 | 21 | First, find the ORBITM GitHub repository in this `GitHub link `_, and download it. Alternatively, if you have Git installed, you can open Command Prompt or your Git Bash, enter the directory of your choice, and type:: 22 | 23 | git clone https://github.com/sammmlow/ORBITM.git 24 | 25 | That's it! No further setup is needed. 26 | 27 | .. note:: **Packages Required:** numpy, matplotlib, tkinter, PIL, os, math, datetime, comtypes (for STK) 28 | 29 | Next, we will need a Python interpreter (or an IDE if you'd like) to open up the main file **orbitm.py**. -------------------------------------------------------------------------------- /docs/docs_interpreting.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | Intepreting Results 19 | =================== 20 | 21 | After a successful ORBITM run, you would expect two output text files in the main directory, and three Matplotlib figures. 22 | 23 | The first text file **"output_summary.txt"** is a summary of the lifetime (i.e. how long the spacecraft can last **without** orbit maintenance). 24 | 25 | :: 26 | 27 | Lifetime decay is estimated to be on 13 May 2027 16:54:31.252 after 29940 orbits. 28 | The lifetime is 5.4 years. 29 | The total impulse needed: 2233.4388819714236 30 | The total Delta-V (m/s) needed is 13.137875776302492 31 | 32 | The second text file **"output_manoeuvres.txt"** is an estimate of the orbit maintenance manoeuvre schedule. 33 | 34 | :: 35 | 36 | 1 Maintain.Hohmann 2022-03-01 11:40:00 2.1896281088566925 37 | 2 Maintain.Hohmann 2022-04-29 12:07:49 2.1896767040214486 38 | 3 Maintain.Hohmann 2022-06-27 12:35:38 2.1896387651453866 39 | 4 Maintain.Hohmann 2022-08-25 13:03:27 2.189679576264574 40 | 5 Maintain.Hohmann 2022-10-23 13:31:16 2.1896504433114723 41 | 6 Maintain.Hohmann 2022-12-21 13:59:05 2.1896153519034436 42 | 43 | To interpret the graphical results, let us run a simple orbit maintenance scenario for a satellite in a 550km altitude circular orbit at 45 degrees inclination. 44 | 45 | The plots in blue correspond to **"Sam's Simulator"**. The plots in orange correspond to using **STK 10** Astrogator, with a high precision orbit propagator, and it uses Astrogator's Automatic Sequences feature to boost the orbit up whenever the altitude of the spacecraft crosses the minimum of the maintenance tolerance band. In both orbit maintenance modes, the ΔV values were computed using a first order Taylor expansion to the Vis-Visa equation. 46 | 47 | .. figure:: /_images/orbmgui_full.jpg 48 | :align: center 49 | 50 | Figure 3.1 - Screenshot after running ORBITM, for a 550km orbit with a tolerance band of 1km 51 | 52 | The plot most relevant to mission planning that you would need is the top-most plot - the profile of the mission lifetime (in terms of total ΔV requirements) against the thruster specifications (bar charts). The height of the bar chart can be compared against the desired fuel mass needed, at the thruster's specific impulse values (Isp, units in seconds). In other words, for each thruster's Isp value, if the height of the bar chart (which represents the max fuel mass for that thruster, at that Isp) exceeds the fuel mass requirements of your mission at that particular Isp, then that thruster can satisfy your mission lifetime requirements. 53 | 54 | .. note:: The native **"Sam's Simulator"** uses the US Standard Atmosphere 1976 as the atmospheric density model as a look-up table of coefficients in an exponential function (for speed), while the **STK Mode** uses the Jacchia Roberts atmospheric density model. Also, the native mode uses an approximated orbit decay model while **STK Mode** performs a full orbit propagation for all 6 states. Thus, running ORBITM with STK makes computation very much slower, and the ∆V values in both modes would differ, although in most cases they are close (and definitely in the same order of magnitude). 55 | 56 | -------------------------------------------------------------------------------- /docs/docs_orbmaint.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | Orbit Maintenance Model 19 | ======================= 20 | 21 | This section explains the algorithm behind the fast but approximated orbit maintenance simulations (**"Sam's Simulator"**). 22 | 23 | The key idea is that one does not need to obtain all six parameters of the spacecraft during orbit propagation! Where a sufficiently accurate drag model is available, one really just needs the radial magnitude of the spacecraft in order to characterise the orbital energy loss due to the atmospheric density. This simplifies the number of calculations needed. In this section, the derivation of the decay model will be shared. 24 | 25 | The goal of this exercise is to derive how the rate of change of a satellite's radial distance relates to the drag forces at play. We begin with first principles - an expression on the orbit state energy - and find its derivative with respect to time and altitude. 26 | 27 | .. figure:: /_images/orbm_deriv1.png 28 | :align: center 29 | 30 | Figure 4.1 - Derivative of orbit state energy with respect to time and altitude. 31 | 32 | The rate of change of work done by drag forces can be multiplied with the inverse of the altitude derivative of orbital energy, thereby removing the energy differential, **dU**, as the common term. Now, we have an expression for the rate of altitude change! We simply need to input the drag force **F**, and the radial distance of the satellite **R**. 33 | 34 | .. figure:: /_images/orbm_deriv2.png 35 | :align: center 36 | 37 | Figure 4.2 - Deriving the rate of change of the satellite altitude. 38 | 39 | The radial distance **R** can be solved for through Kepler's Equation in the Python file **orbitm_func_kepler.py** and using the input orbit parameters for a purely Keplerian orbit. 40 | 41 | The drag force **F**, or equivalently the drag acceleration **α**, is computed via the standard `drag equation `_, as a result of the satellite area-to-mass parameters (as set by the user), and the atmopsheric density value at radial distance **R**. The density is sourced from **orbitm_func_atmos.py**. This file is basically the U.S. Standard Atmosphere 1976, represented as a look-up table of coefficients for an exponential atmospheric model. 42 | 43 | Simplifying the altitude decay rate model, we arrive at the elegant statement in 4.3: 44 | 45 | .. figure:: /_images/orbm_deriv3.png 46 | :align: center 47 | 48 | **Equation 4.3 - Decay rate = product of drag deceleration and Keplerian period, divided by Pi** 49 | 50 | This is powerful, because it proves that the rate at which the orbit decays can be solved in closed-form without any full orbit propagation of orbit states! This is the reason why orbit maintenance computations are extremely fast on ORBITM. 51 | 52 | As the decay rate is also small, the total decay appears almost linear within the time frame of a single LEO orbital period (~95 minutes). Thus, a larger step size can also be used, without compromising too much on accuracy. 53 | 54 | Consequently, the ORBITM program simply loops through the scenario time, and computes the decay in each time step until the spacecraft descends below the **Maintenance Tolerance Band**, which then triggers an orbit raise. This repeats until the end of the simulation. -------------------------------------------------------------------------------- /docs/docs_overview.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. image:: /_static/orbitm_logo.png 15 | 16 | | 17 | 18 | An Overview 19 | =========== 20 | 21 | **Why was ORBITM created?** There are two key reasons behind ORBITM. First, the proliferation of tens of thousands of LEO satellites in our near future mandates a quick and efficient means of estimating the lifetime of not just the orbiters but also of debris. The second reason is that ORBITM can also be used to support rapid iterations of spacecraft designs in agile development. For example, different iterations of solar panels or radar reflector designs that are proposed frequently, would impact the drag characteristics and mission life-time. ORBITM allows for the rapid ball-park assessments of such scenarios. 22 | 23 | .. figure:: /_images/orbm_rationale.png 24 | :align: center 25 | 26 | Figure 1.1 - Agile development demands that the mission planner can perform frequent mission life comparisons over rapidly changing iterations of spacecraft structures. 27 | 28 | Traditional orbit maintenance simulations can be cumbersome and tedious to do on STK, GMAT, FreeFlyer, or even on your own code. Thus, ORBITM simplifies this entire drag-simulation process - in a fast and automated way that keeps up with rapidly changing iterations, without over-burdening the mission planner with repeated mission life-time simulations. 29 | 30 | There are two modes of simulation available in ORBITM. 31 | 32 | The first, is a fast-compute orbit decay and maintenance model considering primarily drag effects using the U.S. Standard Atmosphere 1976 model (**Sam's Simulator**). 33 | 34 | .. image:: /_images/orbm_flow_sams.png 35 | 36 | The second is a more accurately modelled but resource intensive mode that interfaces with and automates STK Astrogator to perform a high-precision orbit decay and maintenance simulation. The orbit model in STK uses a 21 by 21 (degree by order) geopotential and computes drag using a Jacchia-Roberts Atmospheric Density model. 37 | 38 | .. image:: /_images/orbm_flow_stk.png 39 | 40 | However, in the second mode, you would need a valid `STK Astrogator `_ and `STK Integration `_ license installed with STK 10 or 11, for the interfacing to work. 41 | 42 | .. note:: ORBITM was designed for low Earth orbits. Thus, the working range of altitudes, before loss of atmospheric density accuracies, should be bounded within 86 - 1,000 km. 43 | 44 | .. warning:: ORBITM was **not designed for high precision**, and thus the life-time estimation **cannot be used for re-entry and descent** positioning estimations. -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. 2 | ########################################################################### 3 | ########################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ########################################################################### 12 | ########################################################################### 13 | 14 | .. |docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat-square 15 | :target: https://orbitm.readthedocs.io/en/latest/ 16 | 17 | .. |license| image:: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square 18 | :target: https://github.com/sammmlow/ORBITM/blob/master/LICENSE 19 | 20 | .. |orcid| image:: https://img.shields.io/badge/ID-0000--0002--1911--701X-a6ce39.svg 21 | :target: https://orcid.org/0000-0002-1911-701X/ 22 | 23 | .. |linkedin| image:: https://img.shields.io/badge/LinkedIn-sammmlow-blue.svg 24 | :target: https://www.linkedin.com/in/sammmlow 25 | 26 | .. image:: /_static/orbitm_logo.png 27 | 28 | | 29 | 30 | :Github: https://github.com/sammmlow/ORBITM 31 | :Documents: https://orbitm.readthedocs.io/en/latest/ 32 | :Version: 1.1 (Latest) 33 | :Author: Samuel Y. W. Low 34 | 35 | |docs| |license| |linkedin| |orcid| 36 | 37 | ORBITM 38 | ====== 39 | 40 | ORBITM stands for the **Orbit Maintenance and Propulsion Sizing Tool**, and it is an open-source, easy-to-use, free-ware orbit maintenance simulator and propulsion sizing tool, for anyone with a Python 3 installation. The software comes with its own built-in orbit decay model and maintenance simulator, a life-time estimator, and it is also interface-able with AGI's Systems Tool Kit (STK) as an alternative mode of simulation. 41 | 42 | The objective of ORBITM is to allow for a quick sizing of low Earth orbit (LEO) mission lifetime, while sizing the mission against propulsion units of the user's choosing. The user may input into the UI their orbital parameters, spacecraft properties (mass, area, drag parameters etc), and the software will compute your desired ΔV necessary for the mission, track the altitude profile over time, and plot the thruster-fuel profile that satisfies the orbit maintenance needs of your mission. 43 | 44 | Document tree for ORBITM is listed out below. 45 | 46 | .. toctree:: 47 | :maxdepth: 1 48 | :caption: Getting Started 49 | 50 | docs_overview.rst 51 | docs_install.rst 52 | docs_firststep.rst 53 | docs_interpreting.rst 54 | 55 | .. toctree:: 56 | :maxdepth: 1 57 | :caption: Orbit Maintenance 58 | 59 | docs_orbmaint.rst 60 | docs_functions.rst 61 | 62 | | 63 | 64 | If ORBITM has made your life somewhat easier, please do cite the work behind it! 65 | 66 | `Low, S. Y. W., &; Chia, Y. X. (2018). “Assessment of Orbit Maintenance Strategies for Small Satellites”, 32nd Annual AIAA/USU Conference on Small Satellites, Logan, Utah, Utah State University, USA. `_ 67 | 68 | 69 | For bugs, raise the issues in the `GitHub repository `_. 70 | 71 | For collaborations, reach out to me: sammmlow@gmail.com (Samuel Y. W. Low) 72 | 73 | |linkedin| |orcid| 74 | 75 | The project is licensed under the MIT license. 76 | 77 | 78 | .. toctree:: 79 | :maxdepth: 2 80 | :caption: Contents: 81 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /orbitm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | ############################################################################### 3 | ############################################################################### 4 | ## ## 5 | ## _____ ___ ___ ___ _____ __ __ ## 6 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 7 | ## | |_| | <| _ < | | | | _ | \ / | ## 8 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 9 | ## v 1.1 ## 10 | ## ## 11 | ## FILE DESCRIPTION: ## 12 | ## ## 13 | ## Runs the GUI that interfaces with the ORBITM source code stack. ## 14 | ## ## 15 | ## Written by Samuel Y. W. Low. ## 16 | ## First created 27-Nov-2020 12:00 PM (+8 GMT) ## 17 | ## Last modified 19-Sep-2021 22:27 PM (-7 GMT). ## 18 | ## ## 19 | ############################################################################### 20 | ############################################################################### 21 | 22 | # Import our GUI libraries. 23 | import tkinter 24 | 25 | # Import local libraries. 26 | from source import orbmgui 27 | 28 | # Initialise the GUI. 29 | root = tkinter.Tk() 30 | root_gui = orbmgui.RunGUI( root ) 31 | root.mainloop() -------------------------------------------------------------------------------- /source/atmos.py: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | ############################################################################### 3 | ## ## 4 | ## _____ ___ ___ ___ _____ __ __ ## 5 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 6 | ## | |_| | <| _ < | | | | _ | \ / | ## 7 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 8 | ## v 1.1 ## 9 | ## ## 10 | ## FILE DESCRIPTION: ## 11 | ## ## 12 | ## Atmospheric density model based on the U.S. Standard Atmosphere 1976. ## 13 | ## Returns the atmospheric density (km/m^3) given an altitude input (km). ## 14 | ## Valid only for altitudes between 86km to 1000km. ## 15 | ## ## 16 | ## Written by Samuel Y. W. Low. ## 17 | ## First created 24-May-2017 11:27 AM (+8 GMT) ## 18 | ## Last modified 19-Sep-2021 22:27 PM (-7 GMT) ## 19 | ## ## 20 | ############################################################################### 21 | ############################################################################### 22 | 23 | import math 24 | 25 | # Input R is the altitude from the surface of the Earth (km) 26 | def density(R): 27 | '''Atmospheric density model based on the U.S. Standard Atmosphere 1976. 28 | Returns the atmospheric density (km/m^3) given an altitude input (km). 29 | Valid only for altitudes between 86km to 1000km. 30 | 31 | Parameters 32 | ---------- 33 | R : float 34 | Radial altitude from the surface of the Earth (km) 35 | 36 | Returns 37 | ------- 38 | density : float 39 | Atmospheric density (kg/m^3) 40 | 41 | ''' 42 | 43 | co = [0,0,0,0,0] # Coefficient 44 | 45 | if R <= 86: 46 | co = [ 0.0000000000, 0.0000000000, 0.0000000000,-0.1523325, 0.202941] 47 | elif R <= 91: 48 | co = [ 0.0000000000,-3.322622e-06, 9.111460e-04,-0.2609971, 5.944694] 49 | elif R <= 100: 50 | co = [ 0.0000000000, 2.873405e-05,-0.008492037, 0.6541179, -23.62010] 51 | elif R <= 110: 52 | co = [-1.240774e-05, 0.005162063, -0.8048342, 55.55996, -1443.338] 53 | elif R <= 120: 54 | co = [ 0.0000000000,-8.854164e-05, 0.03373254, -4.390837, 176.5294] 55 | elif R <= 150: 56 | co = [ 3.661771e-07,-2.154344e-04, 0.04809214, -4.884744, 172.3597] 57 | elif R <= 200: 58 | co = [ 1.906032e-08,-1.527799e-05, 0.004724294, -0.6992340, 20.50921] 59 | elif R <= 300: 60 | co = [ 1.199282e-09,-1.451051e-06, 6.910474e-04,-0.1736220, -5.321644] 61 | elif R <= 500: 62 | co = [ 1.140564e-10,-2.130756e-07, 1.570762e-04,-0.07029296,-12.89844] 63 | elif R <= 750: 64 | co = [ 8.105631e-12,-2.358417e-09,-2.635110E-06,-0.01562608,-20.02246] 65 | elif R <= 1000: 66 | co = [-3.701195e-12,-8.608611e-09, 5.118829e-05,-0.06600998,-6.137674] 67 | else: 68 | co = [0,0,0,0,0] 69 | 70 | # Compute the exponent term. 71 | AtmosExp = co[0]*(R**4) 72 | AtmosExp += co[1]*(R**3) 73 | AtmosExp += co[2]*(R**2) 74 | AtmosExp += co[3]*(R) 75 | AtmosExp += co[4]*(1) 76 | 77 | # Return the atmospheric density (kg/m^3) 78 | return math.exp(AtmosExp) -------------------------------------------------------------------------------- /source/kepler.py: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | ############################################################################### 3 | ## ## 4 | ## _____ ___ ___ ___ _____ __ __ ## 5 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 6 | ## | |_| | <| _ < | | | | _ | \ / | ## 7 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 8 | ## v 1.1 ## 9 | ## ## 10 | ## FILE DESCRIPTION: ## 11 | ## ## 12 | ## A solver for Kepler's equation; taking in the mean anomaly and the ## 13 | ## orbit eccentricity as input, the program solves for the eccentric ## 14 | ## anomaly of the spacecraft via a Newton-Raphson approach. ## 15 | ## ## 16 | ## Written by Samuel Y. W. Low. ## 17 | ## First created 13-Jan-2021 10:34 AM (+8 GMT) ## 18 | ## Last modified 13-Jan-2021 10:34 AM (+8 GMT) ## 19 | ## ## 20 | ############################################################################### 21 | ############################################################################### 22 | 23 | import math 24 | 25 | def solve_kepler(M,e): 26 | '''Given some mean anomaly, M (rad), and eccentricity, e, this function 27 | finds the eccentric anomaly E from the relation M = E - e*sin(E). 28 | 29 | Parameters 30 | ---------- 31 | M : float 32 | Mean anomaly (radians) between +/- pi 33 | e : float 34 | Osculating eccentricity between (not inclusive) 0 and 1 35 | 36 | Returns 37 | ------- 38 | E : float 39 | Eccentric anomaly (radians) 40 | 41 | ''' 42 | 43 | E1 = M # Initialise eccentric anomaly 44 | residual = 1.0 # Initialise convergence residual 45 | while residual >= 0.00001: 46 | fn = E1 - (e*math.sin(E1)) - M 47 | fd = 1 - (e*math.cos(E1)) 48 | E2 = E1 - (fn/fd) 49 | residual = abs(E2-E1) # Compute residual 50 | E1 = E2 # Update the eccentric anomaly 51 | 52 | return E2 -------------------------------------------------------------------------------- /source/sun_moon_pos.py: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | ############################################################################### 3 | ## ## 4 | ## _____ ___ ___ ___ _____ __ __ ## 5 | ## | _ | _ \| _ \|_ _||_ _| | \/ | ## 6 | ## | |_| | <| _ < | | | | _ | \ / | ## 7 | ## |_____|_|\_|___/|___| |_| |_| |_|\/|_| ## 8 | ## v 1.1 ## 9 | ## ## 10 | ## FILE DESCRIPTION: ## 11 | ## ## 12 | ## Functions to calculate sun and moon position for a given UTC time. ## 13 | ## ## 14 | ## Written by Ozan Kilic ## 15 | ## Created 14-Jun-2022 10:11 AM (+1 GMT) ## 16 | ## ## 17 | ############################################################################### 18 | ############################################################################### 19 | 20 | import datetime 21 | import numpy as np 22 | import math 23 | 24 | def get_julian_datetime(date): 25 | """ 26 | Convert a datetime object into julian float. 27 | Args: 28 | date: datetime-object of date in question 29 | 30 | Returns: float - Julian calculated datetime. 31 | Raises: 32 | TypeError : Incorrect parameter type 33 | ValueError: Date out of range of equation 34 | """ 35 | 36 | # Ensure correct format 37 | if not isinstance(date, datetime.datetime): 38 | raise TypeError('Invalid type for parameter "date" - expecting datetime') 39 | elif date.year < 1801 or date.year > 2099: 40 | raise ValueError('Datetime must be between year 1801 and 2099') 41 | 42 | # Perform the calculation 43 | julian_datetime = 367 * date.year - int((7 * (date.year + int((date.month + 9) / 12.0))) / 4.0) + int( 44 | (275 * date.month) / 9.0) + date.day + 1721013.5 + ( 45 | date.hour + date.minute / 60.0 + date.second / math.pow(60, 46 | 2)) / 24.0 - 0.5 * math.copysign( 47 | 1, 100 * date.year + date.month - 190002.5) + 0.5 48 | 49 | return julian_datetime 50 | 51 | def approxECISunPosition(UTCTime): 52 | 53 | """ 54 | % Given Gregorian year(s), day(s), and time(s), calculate Earth-centered 55 | % inertial (ECI) coordinates (in meters) of the vector(s) pointing from 56 | % Earth's center to the center of the Sun. 57 | % Encapsulated by Seth B. Wagenman, from stargazing.net/kepler/sun.html as 58 | % corrected by https://astronomy.stackexchange.com/a/37199/34646 along with 59 | % other minor corrections based on recent revisions to the ecliptic plane. 60 | % Set time(s) relative to the J2000.0 epoch 61 | % 62 | Seth Wagenman (2022). approxECISunPosition 63 | (https://www.mathworks.com/matlabcentral/fileexchange/78766-approxecisunposition), 64 | MATLAB Central File Exchange. Retrieved June 14, 2022. 65 | """ 66 | 67 | fractionalDay = get_julian_datetime(UTCTime) - 2451545.0; 68 | 69 | # Mean longitude of the Sun 70 | meanLongitudeSunDegrees = 280.4606184 + \ 71 | ((36000.77005361 / 36525) * fractionalDay) # (degrees) 72 | 73 | # Mean anomaly of the Sun 74 | meanAnomalySunDegrees = 357.5277233 + \ 75 | ((35999.05034 / 36525) * fractionalDay) # (degrees) 76 | 77 | 78 | meanAnomalySunRadians = meanAnomalySunDegrees * np.pi / 180 79 | 80 | # Ecliptic longitude of the Sun 81 | eclipticLongitudeSunDegrees = meanLongitudeSunDegrees + \ 82 | (1.914666471 * np.sin(meanAnomalySunRadians)) + \ 83 | (0.918994643 * np.sin(2 * meanAnomalySunRadians)) #(degrees) 84 | 85 | eclipticLongitudeSunRadians = eclipticLongitudeSunDegrees * np.pi / 180 86 | 87 | # Obliquity of the ecliptic plane formula mostly derived from: 88 | # https://en.wikipedia.org/wiki/Ecliptic#Obliquity_of_the_ecliptic 89 | # Formula deals with time denominated in centuries 90 | epsilonDegrees = 23.43929 - ((46.8093 / 3600) * fractionalDay / 36525) #(degrees) 91 | 92 | epsilonRadians = epsilonDegrees * np.pi / 180 93 | 94 | # **** Calculations for unit vectors direction to the Sun are in ECI **** 95 | # Now calculate the Earth to Sun unit vector(s) USING RADIANS, NOT DEGREES 96 | 97 | unitEarthSunVectorTransposed = np.array([[np.cos(eclipticLongitudeSunRadians).T], 98 | [(np.cos(epsilonRadians)*np.sin(eclipticLongitudeSunRadians)).T], 99 | [(np.sin(epsilonRadians)*np.sin(eclipticLongitudeSunRadians)).T]]) 100 | 101 | unitEarthSunVector = unitEarthSunVectorTransposed.T 102 | 103 | # Scale up from unit vector(s); distances vary--Earth's orbit is elliptical 104 | distEarthToSunInAstronomicalUnits = \ 105 | 1.000140612 - \ 106 | (0.016708617 * np.cos(meanAnomalySunRadians)) - \ 107 | (0.000139589 * np.cos(2 * meanAnomalySunRadians)) # in Astronomical Units 108 | # (new international definition for an A. U.) 109 | distEarthToSunInMeters = 149597870700 * distEarthToSunInAstronomicalUnits 110 | 111 | # Multiply unit vector(s) by distance to Sun for scaling to full magnitude 112 | # Use meters for generic code compatibility 113 | vector = distEarthToSunInMeters*unitEarthSunVector 114 | 115 | return vector 116 | 117 | def approxECIMoonPosition(UTCTime): 118 | """ 119 | Reference: 120 | "An alternative lunar ephemeris model for on-board flight software use", 121 | D. G. Simpson, Proceedings of the 1999 NASA/GSFC Flight Mechanics Symposium, 122 | p. 175-184). 123 | 124 | Meysam Mahooti (2022). Moon Position 125 | (https://www.mathworks.com/matlabcentral/fileexchange/56041-moon-position), 126 | MATLAB Central File Exchange. Retrieved June 14, 2022. 127 | """ 128 | mjd = get_julian_datetime(UTCTime) - 2400000.5; 129 | 130 | century2day = 36525 131 | xcoeffs = np.array([383.0e3, 31.5e3, 10.6e3, 6.2e3, 3.2e3, 2.3e3, 0.8e3]) 132 | ycoeffs = np.array([351.0e3, 28.9e3, 13.7e3, 9.7e3, 5.7e3, 2.9e3, 2.1e3]) 133 | zcoeffs = np.array([153.2e3, 31.5e3, 12.5e3, 4.2e3, 2.5e3, 3.0e3, 1.8e3]) 134 | xa = np.array([8399.685, 70.990, 16728.377, 1185.622, 7143.070, 15613.745, 8467.263]) 135 | xp = np.array([5.381, 6.169, 1.453, 0.481, 5.017, 0.857, 1.010]) 136 | ya = np.array([8399.687, 70.997, 8433.466, 16728.380, 1185.667, 7143.058, 15613.755]) 137 | yp = np.array([3.811, 4.596, 4.766, 6.165, 5.164, 0.300, 5.565]) 138 | za = np.array([8399.672, 8433.464, 70.996, 16728.364, 1185.645, 104.881, 8399.116]) 139 | zp = np.array([3.807, 1.629, 4.595, 6.162, 5.167, 2.555, 6.248]) 140 | 141 | t = (mjd - 51544.5)/century2day # time in Julian centuries from J2000 142 | 143 | xterms = xa * t + xp 144 | yterms = ya * t + yp 145 | zterms = za * t + zp 146 | 147 | # Moon position vector in ECI, km unit 148 | r_moon = [np.dot(xcoeffs, np.sin(xterms)), 149 | np.dot(ycoeffs, np.sin(yterms)), 150 | np.dot(zcoeffs, np.sin(zterms))] 151 | 152 | return r_moon 153 | -------------------------------------------------------------------------------- /thrusters.txt: -------------------------------------------------------------------------------- 1 | COMPANY MODEL ISP_S FUEL_MASS_KG THRUST_N END 2 | NANOAVIONICS EPSS-C1K 213 0.220 1.000 END 3 | BUSEK BHT-200 1238 1.200 0.013 END 4 | LAJP HEET-05 960 1.600 0.0052 END --------------------------------------------------------------------------------