{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook analyzes the perturbation effects on an orbit due to the Earth's gravity field." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parameters:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "# Keplerian parameters\n", "a = 6578137.0\n", "ex = 0.0\n", "ey = 0.0\n", "i = float(np.deg2rad(90.0))\n", "raan = 0.0\n", "alpha = 0.0 # true latitude argument\n", "\n", "import datetime\n", "epoch = datetime.datetime(2020, 1, 1)\n", "\n", "n_harmonics = 8 # Number of spheric harmonics to use\n", "\n", "dt = 30.0 # s\n", "duration = 5300.0\n", "\n", "position_tolerance = 1.0 \n", "prop_min_step = 0.001 # s\n", "prop_max_step = 300.0 # s\n", "prop_position_error = 10.0 # m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Firing up a JVM for Orekit, and downloading and importing the Orekit data ZIP" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading file from: https://gitlab.orekit.org/orekit/orekit-data/-/archive/master/orekit-data-master.zip\n" ] } ], "source": [ "import orekit\n", "orekit.initVM()\n", "\n", "from orekit.pyhelpers import download_orekit_data_curdir, setup_orekit_curdir\n", "try:\n", " download_orekit_data_curdir()\n", "except:\n", " print('Download failed')\n", "setup_orekit_curdir()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting up models (frames, timescales)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from org.orekit.frames import FramesFactory\n", "eme2000 = FramesFactory.getEME2000()\n", "\n", "from org.orekit.utils import IERSConventions\n", "itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, True)\n", "\n", "from org.orekit.models.earth import ReferenceEllipsoid\n", "wgs84_ellipsoid = ReferenceEllipsoid.getWgs84(itrf)\n", "\n", "from org.orekit.time import TimeScalesFactory\n", "utc = TimeScalesFactory.getUTC()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting up the initial orbit in Earth-inertial frame." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from org.orekit.orbits import CircularOrbit, PositionAngle, OrbitType\n", "from orekit.pyhelpers import datetime_to_absolutedate\n", "from org.orekit.utils import Constants as orekit_constants\n", "date_init = datetime_to_absolutedate(epoch)\n", "date_end = date_init.shiftedBy(duration)\n", "orbit = CircularOrbit(a, ex, ey, i, raan, alpha,\n", " PositionAngle.TRUE, \n", " eme2000, \n", " date_init,\n", " orekit_constants.EIGEN5C_EARTH_MU)\n", "\n", "satellite_mass = 100.0 # kg\n", "from org.orekit.propagation import SpacecraftState\n", "initialState = SpacecraftState(orbit, satellite_mass) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setting up numerical propagator and gravity force model" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from org.orekit.propagation.numerical import NumericalPropagator\n", "tol = NumericalPropagator.tolerances(position_tolerance, orbit, OrbitType.CIRCULAR)\n", "\n", "from orekit import JArray_double\n", "from org.hipparchus.ode.nonstiff import DormandPrince853Integrator\n", "integrator = DormandPrince853Integrator(prop_min_step, prop_max_step, \n", " JArray_double.cast_(tol[0]), # Double array of doubles needs to be casted in Python\n", " JArray_double.cast_(tol[1]))\n", "integrator.setInitialStepSize(prop_max_step)\n", "\n", "propagator = NumericalPropagator(integrator)\n", "propagator.setOrbitType(OrbitType.CIRCULAR)\n", "propagator.setInitialState(initialState)\n", "\n", "# Earth gravity field with degree 64 and order 64\n", "from org.orekit.forces.gravity.potential import GravityFieldFactory\n", "gravity_provider = GravityFieldFactory.getConstantNormalizedProvider(n_harmonics, n_harmonics)\n", "from org.orekit.forces.gravity import HolmesFeatherstoneAttractionModel\n", "gravity_attraction_model = HolmesFeatherstoneAttractionModel(itrf, gravity_provider)\n", "propagator.addForceModel(gravity_attraction_model)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", " | a | \n", "e | \n", "h | \n", "h_sphere | \n", "
---|---|---|---|---|
2020-01-01 00:00:00 | \n", "6.578137e+06 | \n", "0.000000 | \n", "200000.078389 | \n", "200000.000000 | \n", "
2020-01-01 00:00:30 | \n", "6.578108e+06 | \n", "0.000054 | \n", "200023.751508 | \n", "199993.691746 | \n", "
2020-01-01 00:01:00 | \n", "6.578029e+06 | \n", "0.000109 | \n", "200088.815971 | \n", "199974.788490 | \n", "
2020-01-01 00:01:30 | \n", "6.577900e+06 | \n", "0.000164 | \n", "200194.909968 | \n", "199943.357709 | \n", "
2020-01-01 00:02:00 | \n", "6.577721e+06 | \n", "0.000219 | \n", "200341.444678 | \n", "199899.513540 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
2020-01-01 01:26:00 | \n", "6.577554e+06 | \n", "0.000253 | \n", "200358.910527 | \n", "199740.578695 | \n", "
2020-01-01 01:26:30 | \n", "6.577767e+06 | \n", "0.000198 | \n", "200181.584244 | \n", "199792.555412 | \n", "
2020-01-01 01:27:00 | \n", "6.577930e+06 | \n", "0.000144 | \n", "200044.202611 | \n", "199832.321503 | \n", "
2020-01-01 01:27:30 | \n", "6.578043e+06 | \n", "0.000091 | \n", "199947.521385 | \n", "199859.727307 | \n", "
2020-01-01 01:28:00 | \n", "6.578104e+06 | \n", "0.000040 | \n", "199892.075235 | \n", "199874.673139 | \n", "
177 rows × 4 columns
\n", "