ootk 3.0.0 → 4.0.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +235 -10
- package/README.md +27 -40
- package/dist/coordinate/Hill.d.ts +49 -0
- package/dist/coordinate/Hill.js +222 -0
- package/dist/coordinate/Hill.js.map +1 -0
- package/dist/coordinate/index.d.ts +1 -0
- package/dist/coordinate/index.js +2 -0
- package/dist/coordinate/index.js.map +1 -0
- package/dist/covariance/CovarianceSample.d.ts +43 -0
- package/dist/covariance/CovarianceSample.js +147 -0
- package/dist/covariance/CovarianceSample.js.map +1 -0
- package/dist/covariance/StateCovariance.d.ts +42 -0
- package/dist/covariance/StateCovariance.js +65 -0
- package/dist/covariance/StateCovariance.js.map +1 -0
- package/dist/force/AtmosphericDrag.d.ts +31 -0
- package/dist/force/AtmosphericDrag.js +73 -0
- package/dist/force/AtmosphericDrag.js.map +1 -0
- package/dist/force/EarthGravity.d.ts +27 -0
- package/dist/force/EarthGravity.js +117 -0
- package/dist/force/EarthGravity.js.map +1 -0
- package/{lib/ootk.d.ts → dist/force/Force.d.ts} +12 -11
- package/dist/force/Force.js +31 -0
- package/dist/force/Force.js.map +1 -0
- package/dist/force/ForceModel.d.ts +37 -0
- package/dist/force/ForceModel.js +75 -0
- package/dist/force/ForceModel.js.map +1 -0
- package/dist/force/Gravity.d.ts +38 -0
- package/dist/force/Gravity.js +47 -0
- package/dist/force/Gravity.js.map +1 -0
- package/dist/{ootk.d.ts → force/SolarRadiationPressure.d.ts} +12 -11
- package/dist/force/SolarRadiationPressure.js +44 -0
- package/dist/force/SolarRadiationPressure.js.map +1 -0
- package/dist/force/ThirdBodyGravity.d.ts +26 -0
- package/dist/force/ThirdBodyGravity.js +57 -0
- package/dist/force/ThirdBodyGravity.js.map +1 -0
- package/dist/force/Thrust.d.ts +34 -0
- package/dist/force/Thrust.js +58 -0
- package/dist/force/Thrust.js.map +1 -0
- package/dist/interfaces/RfSensorParams.d.ts +28 -0
- package/dist/interfaces/RfSensorParams.js +24 -0
- package/dist/interfaces/RfSensorParams.js.map +1 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.js +2 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interpolator/ChebyshevCoefficients.d.ts +50 -0
- package/dist/interpolator/ChebyshevCoefficients.js +94 -0
- package/dist/interpolator/ChebyshevCoefficients.js.map +1 -0
- package/dist/interpolator/ChebyshevInterpolator.d.ts +38 -0
- package/dist/interpolator/ChebyshevInterpolator.js +71 -0
- package/dist/interpolator/ChebyshevInterpolator.js.map +1 -0
- package/dist/interpolator/CubicSpline.d.ts +35 -0
- package/dist/interpolator/CubicSpline.js +69 -0
- package/dist/interpolator/CubicSpline.js.map +1 -0
- package/dist/interpolator/CubicSplineInterpolator.d.ts +36 -0
- package/dist/interpolator/CubicSplineInterpolator.js +80 -0
- package/dist/interpolator/CubicSplineInterpolator.js.map +1 -0
- package/dist/interpolator/FieldInterpolator.d.ts +28 -0
- package/dist/interpolator/FieldInterpolator.js +34 -0
- package/dist/interpolator/FieldInterpolator.js.map +1 -0
- package/dist/interpolator/Interpolator.d.ts +22 -0
- package/dist/interpolator/Interpolator.js +47 -0
- package/dist/interpolator/Interpolator.js.map +1 -0
- package/dist/interpolator/LagrangeInterpolator.d.ts +40 -0
- package/dist/interpolator/LagrangeInterpolator.js +159 -0
- package/dist/interpolator/LagrangeInterpolator.js.map +1 -0
- package/dist/interpolator/StateInterpolator.d.ts +27 -0
- package/dist/interpolator/StateInterpolator.js +35 -0
- package/dist/interpolator/StateInterpolator.js.map +1 -0
- package/dist/interpolator/VerletBlendInterpolator.d.ts +43 -0
- package/dist/interpolator/VerletBlendInterpolator.js +118 -0
- package/dist/interpolator/VerletBlendInterpolator.js.map +1 -0
- package/{lib/ootk.js → dist/main.d.ts} +13 -10
- package/dist/{objects/space-object.d.ts → main.js} +17 -23
- package/dist/main.js.map +1 -0
- package/dist/maneuver/TwoBurnOrbitTransfer.d.ts +41 -0
- package/dist/maneuver/TwoBurnOrbitTransfer.js +65 -0
- package/dist/maneuver/TwoBurnOrbitTransfer.js.map +1 -0
- package/dist/maneuver/Waypoint.d.ts +91 -0
- package/dist/maneuver/Waypoint.js +179 -0
- package/dist/maneuver/Waypoint.js.map +1 -0
- package/{lib/objects/detailed-sat.d.ts → dist/objects/DetailedSatellite.d.ts} +40 -36
- package/dist/objects/DetailedSatellite.js +136 -0
- package/dist/objects/DetailedSatellite.js.map +1 -0
- package/dist/objects/DetailedSensor.d.ts +42 -0
- package/dist/objects/DetailedSensor.js +65 -0
- package/dist/objects/DetailedSensor.js.map +1 -0
- package/dist/objects/LandObject.d.ts +33 -0
- package/dist/objects/LandObject.js +34 -0
- package/dist/objects/LandObject.js.map +1 -0
- package/dist/objects/Marker.d.ts +20 -0
- package/dist/objects/Marker.js +24 -0
- package/dist/objects/Marker.js.map +1 -0
- package/dist/objects/RfSensor.d.ts +41 -0
- package/dist/objects/RfSensor.js +67 -0
- package/dist/objects/RfSensor.js.map +1 -0
- package/dist/objects/index.d.ts +5 -4
- package/dist/objects/index.js +6 -0
- package/dist/objects/index.js.map +1 -0
- package/dist/observation/Observation.d.ts +89 -0
- package/dist/observation/Observation.js +102 -0
- package/dist/observation/Observation.js.map +1 -0
- package/dist/observation/ObservationOptical.d.ts +48 -0
- package/dist/observation/ObservationOptical.js +105 -0
- package/dist/observation/ObservationOptical.js.map +1 -0
- package/dist/observation/ObservationRadar.d.ts +46 -0
- package/dist/observation/ObservationRadar.js +96 -0
- package/dist/observation/ObservationRadar.js.map +1 -0
- package/dist/observation/ObservationUtils.d.ts +20 -0
- package/dist/observation/ObservationUtils.js +32 -0
- package/dist/observation/ObservationUtils.js.map +1 -0
- package/dist/observation/PropagatorPairs.d.ts +32 -0
- package/dist/observation/PropagatorPairs.js +43 -0
- package/dist/observation/PropagatorPairs.js.map +1 -0
- package/dist/operations/BoxMuller.d.ts +46 -0
- package/dist/operations/BoxMuller.js +77 -0
- package/dist/operations/BoxMuller.js.map +1 -0
- package/dist/operations/EulerAngles.d.ts +105 -0
- package/dist/operations/EulerAngles.js +161 -0
- package/dist/operations/EulerAngles.js.map +1 -0
- package/dist/operations/Quaternion.d.ts +56 -0
- package/dist/operations/Quaternion.js +167 -0
- package/dist/operations/Quaternion.js.map +1 -0
- package/dist/operations/RandomGaussianSource.d.ts +24 -0
- package/dist/operations/RandomGaussianSource.js +43 -0
- package/dist/operations/RandomGaussianSource.js.map +1 -0
- package/dist/operations/index.d.ts +4 -0
- package/dist/operations/index.js +5 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/optimize/ChebyshevCompressor.d.ts +32 -0
- package/dist/optimize/ChebyshevCompressor.js +83 -0
- package/dist/optimize/ChebyshevCompressor.js.map +1 -0
- package/dist/optimize/DownhillSimplex.d.ts +64 -0
- package/dist/optimize/DownhillSimplex.js +182 -0
- package/dist/optimize/DownhillSimplex.js.map +1 -0
- package/dist/optimize/GoldenSection.d.ts +39 -0
- package/dist/optimize/GoldenSection.js +55 -0
- package/dist/optimize/GoldenSection.js.map +1 -0
- package/dist/optimize/PolynomialRegression.d.ts +49 -0
- package/dist/optimize/PolynomialRegression.js +83 -0
- package/dist/optimize/PolynomialRegression.js.map +1 -0
- package/dist/optimize/PolynomicalRegressionResult.d.ts +31 -0
- package/dist/optimize/PolynomicalRegressionResult.js +38 -0
- package/dist/optimize/PolynomicalRegressionResult.js.map +1 -0
- package/dist/optimize/SimpleLinearRegression.d.ts +44 -0
- package/dist/optimize/SimpleLinearRegression.js +112 -0
- package/dist/optimize/SimpleLinearRegression.js.map +1 -0
- package/dist/optimize/SimplexEntry.d.ts +32 -0
- package/dist/optimize/SimplexEntry.js +42 -0
- package/dist/optimize/SimplexEntry.js.map +1 -0
- package/dist/orbit_determination/BatchLeastSquaresOD.d.ts +65 -0
- package/dist/orbit_determination/BatchLeastSquaresOD.js +143 -0
- package/dist/orbit_determination/BatchLeastSquaresOD.js.map +1 -0
- package/dist/orbit_determination/BatchLeastSquaresResult.d.ts +31 -0
- package/{lib/objects/space-object.d.ts → dist/orbit_determination/BatchLeastSquaresResult.js} +21 -23
- package/dist/orbit_determination/BatchLeastSquaresResult.js.map +1 -0
- package/dist/orbit_determination/GibbsIOD.d.ts +38 -0
- package/dist/orbit_determination/GibbsIOD.js +76 -0
- package/dist/orbit_determination/GibbsIOD.js.map +1 -0
- package/dist/orbit_determination/GoodingIOD.d.ts +51 -0
- package/dist/orbit_determination/GoodingIOD.js +247 -0
- package/dist/orbit_determination/GoodingIOD.js.map +1 -0
- package/dist/orbit_determination/HerrickGibbsIOD.d.ts +33 -0
- package/dist/orbit_determination/HerrickGibbsIOD.js +50 -0
- package/dist/orbit_determination/HerrickGibbsIOD.js.map +1 -0
- package/dist/orbit_determination/LambertIOD.d.ts +59 -0
- package/dist/orbit_determination/LambertIOD.js +213 -0
- package/dist/orbit_determination/LambertIOD.js.map +1 -0
- package/dist/orbit_determination/ModifiedGoodingIOD.d.ts +40 -0
- package/dist/orbit_determination/ModifiedGoodingIOD.js +83 -0
- package/dist/orbit_determination/ModifiedGoodingIOD.js.map +1 -0
- package/dist/propagator/DormandPrince54Propagator.d.ts +28 -0
- package/dist/propagator/DormandPrince54Propagator.js +64 -0
- package/dist/propagator/DormandPrince54Propagator.js.map +1 -0
- package/dist/propagator/KeplerPropagator.d.ts +35 -0
- package/dist/propagator/KeplerPropagator.js +84 -0
- package/dist/propagator/KeplerPropagator.js.map +1 -0
- package/dist/propagator/Propagator.d.ts +34 -0
- package/dist/propagator/Propagator.js +162 -0
- package/dist/propagator/Propagator.js.map +1 -0
- package/dist/propagator/RkCheckpoint.d.ts +22 -0
- package/dist/propagator/RkCheckpoint.js +27 -0
- package/dist/propagator/RkCheckpoint.js.map +1 -0
- package/dist/propagator/RkResult.d.ts +23 -0
- package/dist/propagator/RkResult.js +30 -0
- package/dist/propagator/RkResult.js.map +1 -0
- package/dist/propagator/RungeKutta4Propagator.d.ts +50 -0
- package/dist/propagator/RungeKutta4Propagator.js +141 -0
- package/dist/propagator/RungeKutta4Propagator.js.map +1 -0
- package/dist/propagator/RungeKutta89Propagator.d.ts +28 -0
- package/dist/propagator/RungeKutta89Propagator.js +126 -0
- package/dist/propagator/RungeKutta89Propagator.js.map +1 -0
- package/dist/propagator/RungeKuttaAdaptive.d.ts +54 -0
- package/dist/propagator/RungeKuttaAdaptive.js +159 -0
- package/dist/propagator/RungeKuttaAdaptive.js.map +1 -0
- package/dist/propagator/Sgp4Propagator.d.ts +34 -0
- package/dist/propagator/Sgp4Propagator.js +56 -0
- package/dist/propagator/Sgp4Propagator.js.map +1 -0
- package/dist/smoothing/ExponentialSmoothing.d.ts +23 -0
- package/dist/smoothing/ExponentialSmoothing.js +81 -0
- package/dist/smoothing/ExponentialSmoothing.js.map +1 -0
- package/dist/transforms/index.d.ts +1 -0
- package/dist/transforms/index.js +2 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/transforms.d.ts +56 -92
- package/dist/transforms/transforms.js +94 -0
- package/dist/transforms/transforms.js.map +1 -0
- package/dist/types/types.d.ts +105 -584
- package/dist/types/types.js +23 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/jacobian.d.ts +11 -0
- package/dist/utils/jacobian.js +29 -0
- package/dist/utils/jacobian.js.map +1 -0
- package/package.json +34 -42
- package/src/coordinate/Hill.ts +326 -0
- package/src/coordinate/index.ts +1 -0
- package/src/covariance/CovarianceSample.ts +194 -0
- package/src/covariance/StateCovariance.ts +69 -0
- package/src/force/AtmosphericDrag.ts +101 -0
- package/src/force/EarthGravity.ts +157 -0
- package/src/force/Force.ts +33 -0
- package/src/force/ForceModel.ts +91 -0
- package/src/force/Gravity.ts +53 -0
- package/src/force/SolarRadiationPressure.ts +42 -0
- package/src/force/ThirdBodyGravity.ts +62 -0
- package/src/force/Thrust.ts +83 -0
- package/src/interfaces/RfSensorParams.ts +30 -0
- package/src/interfaces/index.ts +1 -0
- package/src/interpolator/ChebyshevCoefficients.ts +109 -0
- package/src/interpolator/ChebyshevInterpolator.ts +87 -0
- package/src/interpolator/CubicSpline.ts +72 -0
- package/src/interpolator/CubicSplineInterpolator.ts +90 -0
- package/src/interpolator/FieldInterpolator.ts +37 -0
- package/src/interpolator/Interpolator.ts +56 -0
- package/src/interpolator/LagrangeInterpolator.ts +192 -0
- package/src/interpolator/StateInterpolator.ts +39 -0
- package/src/interpolator/VerletBlendInterpolator.ts +146 -0
- package/src/main.ts +32 -0
- package/src/maneuver/TwoBurnOrbitTransfer.ts +79 -0
- package/src/maneuver/Waypoint.ts +267 -0
- package/src/objects/DetailedSatellite.ts +159 -0
- package/src/objects/DetailedSensor.ts +68 -0
- package/src/objects/LandObject.ts +46 -0
- package/src/objects/Marker.ts +25 -0
- package/src/objects/RfSensor.ts +78 -0
- package/src/objects/index.ts +5 -0
- package/src/observation/Observation.ts +125 -0
- package/src/observation/ObservationOptical.ts +146 -0
- package/src/observation/ObservationRadar.ts +131 -0
- package/src/observation/ObservationUtils.ts +40 -0
- package/src/observation/PropagatorPairs.ts +45 -0
- package/src/operations/BoxMuller.ts +87 -0
- package/src/operations/EulerAngles.ts +183 -0
- package/src/operations/Quaternion.ts +222 -0
- package/src/operations/RandomGaussianSource.ts +51 -0
- package/src/operations/index.ts +4 -0
- package/src/optimize/ChebyshevCompressor.ts +96 -0
- package/src/optimize/DownhillSimplex.ts +212 -0
- package/src/optimize/GoldenSection.ts +71 -0
- package/src/optimize/PolynomialRegression.ts +109 -0
- package/src/optimize/PolynomicalRegressionResult.ts +32 -0
- package/src/optimize/SimpleLinearRegression.ts +127 -0
- package/src/optimize/SimplexEntry.ts +50 -0
- package/src/orbit_determination/BatchLeastSquaresOD.ts +174 -0
- package/src/orbit_determination/BatchLeastSquaresResult.ts +33 -0
- package/src/orbit_determination/GibbsIOD.ts +95 -0
- package/src/orbit_determination/GoodingIOD.ts +380 -0
- package/src/orbit_determination/HerrickGibbsIOD.ts +51 -0
- package/src/orbit_determination/LambertIOD.ts +260 -0
- package/src/orbit_determination/ModifiedGoodingIOD.ts +133 -0
- package/src/propagator/DormandPrince54Propagator.ts +73 -0
- package/src/propagator/KeplerPropagator.ts +102 -0
- package/src/propagator/Propagator.ts +253 -0
- package/src/propagator/RkCheckpoint.ts +25 -0
- package/src/propagator/RkResult.ts +26 -0
- package/src/propagator/RungeKutta4Propagator.ts +179 -0
- package/src/propagator/RungeKutta89Propagator.ts +132 -0
- package/src/propagator/RungeKuttaAdaptive.ts +232 -0
- package/src/propagator/Sgp4Propagator.ts +71 -0
- package/src/smoothing/ExponentialSmoothing.ts +90 -0
- package/src/transforms/index.ts +1 -0
- package/src/transforms/transforms.ts +117 -0
- package/src/types/types.ts +135 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/jacobian.ts +38 -0
- package/.eslintrc.json +0 -244
- package/.prettierrc +0 -17
- package/babel.config.js +0 -16
- package/codecov.yml +0 -21
- package/dist/objects/base-object.d.ts +0 -40
- package/dist/objects/detailed-sat.d.ts +0 -66
- package/dist/objects/sat.d.ts +0 -92
- package/dist/objects/sensor.d.ts +0 -93
- package/dist/objects/star.d.ts +0 -46
- package/dist/ootk.js +0 -2
- package/dist/ootk.js.LICENSE.txt +0 -77
- package/dist/sgp4/sgp4.d.ts +0 -82
- package/dist/tle/tle-format-data.d.ts +0 -6
- package/dist/tle/tle.d.ts +0 -375
- package/dist/utils/constants.d.ts +0 -34
- package/dist/utils/moon-math.d.ts +0 -113
- package/dist/utils/sun-math.d.ts +0 -230
- package/dist/utils/utils.d.ts +0 -39
- package/jest.config.ts +0 -30
- package/lib/objects/base-object.d.ts +0 -40
- package/lib/objects/base-object.js +0 -79
- package/lib/objects/base-object.js.map +0 -1
- package/lib/objects/detailed-sat.js +0 -149
- package/lib/objects/detailed-sat.js.map +0 -1
- package/lib/objects/index.d.ts +0 -4
- package/lib/objects/index.js +0 -5
- package/lib/objects/index.js.map +0 -1
- package/lib/objects/sat.d.ts +0 -92
- package/lib/objects/sat.js +0 -188
- package/lib/objects/sat.js.map +0 -1
- package/lib/objects/sensor.d.ts +0 -93
- package/lib/objects/sensor.js +0 -273
- package/lib/objects/sensor.js.map +0 -1
- package/lib/objects/space-object.js +0 -60
- package/lib/objects/space-object.js.map +0 -1
- package/lib/objects/star.d.ts +0 -46
- package/lib/objects/star.js +0 -91
- package/lib/objects/star.js.map +0 -1
- package/lib/ootk.js.map +0 -1
- package/lib/sgp4/sgp4.d.ts +0 -82
- package/lib/sgp4/sgp4.js +0 -3262
- package/lib/sgp4/sgp4.js.map +0 -1
- package/lib/tle/tle-format-data.d.ts +0 -6
- package/lib/tle/tle-format-data.js +0 -10
- package/lib/tle/tle-format-data.js.map +0 -1
- package/lib/tle/tle.d.ts +0 -375
- package/lib/tle/tle.js +0 -611
- package/lib/tle/tle.js.map +0 -1
- package/lib/transforms/transforms.d.ts +0 -94
- package/lib/transforms/transforms.js +0 -308
- package/lib/transforms/transforms.js.map +0 -1
- package/lib/types/types.d.ts +0 -605
- package/lib/types/types.js +0 -36
- package/lib/types/types.js.map +0 -1
- package/lib/utils/constants.d.ts +0 -34
- package/lib/utils/constants.js +0 -35
- package/lib/utils/constants.js.map +0 -1
- package/lib/utils/moon-math.d.ts +0 -113
- package/lib/utils/moon-math.js +0 -387
- package/lib/utils/moon-math.js.map +0 -1
- package/lib/utils/sun-math.d.ts +0 -230
- package/lib/utils/sun-math.js +0 -422
- package/lib/utils/sun-math.js.map +0 -1
- package/lib/utils/utils.d.ts +0 -39
- package/lib/utils/utils.js +0 -102
- package/lib/utils/utils.js.map +0 -1
- package/sandbox.html +0 -8
- package/tsconfig.base.json +0 -31
- package/tsconfig.build.json +0 -14
- /package/{LICENSE.MD → LICENSE.md} +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { Earth, J2000 } from 'ootk-core';
|
|
18
|
+
// / Lambert two-position and time initial orbit determination.
|
|
19
|
+
export class LambertIOD {
|
|
20
|
+
mu;
|
|
21
|
+
constructor(mu = Earth.mu) {
|
|
22
|
+
this.mu = mu;
|
|
23
|
+
// Nothing to do here.
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Try to guess the short path argument given an [interceptor] and
|
|
27
|
+
* [target] state.
|
|
28
|
+
* @param interceptor Interceptor
|
|
29
|
+
* @param target Target
|
|
30
|
+
* @returns True if the short path should be used, false otherwise.
|
|
31
|
+
*/
|
|
32
|
+
static useShortPath(interceptor, target) {
|
|
33
|
+
const transN = interceptor.position.cross(target.position);
|
|
34
|
+
const h = interceptor.position.cross(interceptor.velocity);
|
|
35
|
+
return h.dot(transN) >= 0;
|
|
36
|
+
}
|
|
37
|
+
static timeOfFlight_(x, longway, mrev, minSma, speri, chord) {
|
|
38
|
+
const a = minSma / (1.0 - x * x);
|
|
39
|
+
let tof;
|
|
40
|
+
if (Math.abs(x) < 1) {
|
|
41
|
+
const beta = longway * 2.0 * Math.asin(Math.sqrt((speri - chord) / (2.0 * a)));
|
|
42
|
+
const alpha = 2.0 * Math.acos(x);
|
|
43
|
+
tof = a * Math.sqrt(a) * (alpha - Math.sin(alpha) - (beta - Math.sin(beta)) + 2.0 * Math.PI * mrev);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const alpha = 2.0 * Math.acosh(x);
|
|
47
|
+
const beta = longway * 2.0 * Math.asinh(Math.sqrt((speri - chord) / (-2.0 * a)));
|
|
48
|
+
tof = -a * Math.sqrt(-a) * (Math.sinh(alpha) - alpha - (Math.sinh(beta) - beta));
|
|
49
|
+
}
|
|
50
|
+
return tof;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Attempt to solve output velocity [v1] _(km/s)_ given radii [r1] and
|
|
54
|
+
* [r2] _(canonical)_, sweep angle [dth] _(rad)_, time of flight [tau]
|
|
55
|
+
* _(canonical)_, and number of revolutions _(mRev)_.
|
|
56
|
+
* @param r1 Radius 1
|
|
57
|
+
* @param r2 Radius 2
|
|
58
|
+
* @param dth Sweep angle
|
|
59
|
+
* @param tau Time of flight
|
|
60
|
+
* @param mRev Number of revolutions
|
|
61
|
+
* @param v1 Output velocity
|
|
62
|
+
* @returns True if successful, false otherwise.
|
|
63
|
+
*/
|
|
64
|
+
static solve(r1, r2, dth, tau, mRev, v1) {
|
|
65
|
+
const leftBranch = dth < Math.PI;
|
|
66
|
+
let longway = 1;
|
|
67
|
+
if (dth > Math.PI) {
|
|
68
|
+
longway = -1;
|
|
69
|
+
}
|
|
70
|
+
const m = Math.abs(mRev);
|
|
71
|
+
const rtof = Math.abs(tau);
|
|
72
|
+
const theta = dth;
|
|
73
|
+
const chord = Math.sqrt(r1 * r1 + r2 * r2 - 2.0 * r1 * r2 * Math.cos(theta));
|
|
74
|
+
const speri = 0.5 * (r1 + r2 + chord);
|
|
75
|
+
const minSma = 0.5 * speri;
|
|
76
|
+
const lambda = longway * Math.sqrt(1.0 - chord / speri);
|
|
77
|
+
const logt = Math.log(rtof);
|
|
78
|
+
let in1;
|
|
79
|
+
let in2;
|
|
80
|
+
let x1;
|
|
81
|
+
let x2;
|
|
82
|
+
if (m === 0) {
|
|
83
|
+
in1 = -0.6523333;
|
|
84
|
+
in2 = 0.6523333;
|
|
85
|
+
x1 = Math.log(1.0 + in1);
|
|
86
|
+
x2 = Math.log(1.0 + in2);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (!leftBranch) {
|
|
90
|
+
in1 = -0.523334;
|
|
91
|
+
in2 = -0.223334;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
in1 = 0.723334;
|
|
95
|
+
in2 = 0.523334;
|
|
96
|
+
}
|
|
97
|
+
x1 = Math.tan((in1 * Math.PI) / 2);
|
|
98
|
+
x2 = Math.tan((in2 * Math.PI) / 2);
|
|
99
|
+
}
|
|
100
|
+
const tof1 = LambertIOD.timeOfFlight_(in1, longway, m, minSma, speri, chord);
|
|
101
|
+
const tof2 = LambertIOD.timeOfFlight_(in2, longway, m, minSma, speri, chord);
|
|
102
|
+
let y1;
|
|
103
|
+
let y2;
|
|
104
|
+
if (m === 0) {
|
|
105
|
+
y1 = Math.log(tof1) - logt;
|
|
106
|
+
y2 = Math.log(tof2) - logt;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
y1 = tof1 - rtof;
|
|
110
|
+
y2 = tof2 - rtof;
|
|
111
|
+
}
|
|
112
|
+
let err = 1e20;
|
|
113
|
+
let iterations = 0;
|
|
114
|
+
const tol = 1e-13;
|
|
115
|
+
const maxiter = 50;
|
|
116
|
+
let xnew = 0.0;
|
|
117
|
+
while (err > tol && iterations < maxiter) {
|
|
118
|
+
xnew = (x1 * y2 - y1 * x2) / (y2 - y1);
|
|
119
|
+
let xt;
|
|
120
|
+
if (m === 0) {
|
|
121
|
+
xt = Math.exp(xnew) - 1.0;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
xt = (Math.atan(xnew) * 2.0) / Math.PI;
|
|
125
|
+
}
|
|
126
|
+
const tof = LambertIOD.timeOfFlight_(xt, longway, m, minSma, speri, chord);
|
|
127
|
+
let ynew;
|
|
128
|
+
if (m === 0) {
|
|
129
|
+
ynew = Math.log(tof) - logt;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
ynew = tof - rtof;
|
|
133
|
+
}
|
|
134
|
+
x1 = x2;
|
|
135
|
+
x2 = xnew;
|
|
136
|
+
y1 = y2;
|
|
137
|
+
y2 = ynew;
|
|
138
|
+
err = Math.abs(x1 - xnew);
|
|
139
|
+
++iterations;
|
|
140
|
+
}
|
|
141
|
+
if (err > tol) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
let x;
|
|
145
|
+
if (m === 0) {
|
|
146
|
+
x = Math.exp(xnew) - 1.0;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
x = (Math.atan(xnew) * 2.0) / Math.PI;
|
|
150
|
+
}
|
|
151
|
+
const sma = minSma / (1.0 - x * x);
|
|
152
|
+
let eta;
|
|
153
|
+
if (x < 1) {
|
|
154
|
+
const alfa = 2.0 * Math.acos(x);
|
|
155
|
+
const beta = longway * 2.0 * Math.asin(Math.sqrt((speri - chord) / (2.0 * sma)));
|
|
156
|
+
const psi = (alfa - beta) / 2.0;
|
|
157
|
+
const sinPsi = Math.sin(psi);
|
|
158
|
+
const etaSq = (2.0 * sma * sinPsi * sinPsi) / speri;
|
|
159
|
+
eta = Math.sqrt(etaSq);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const gamma = 2.0 * Math.acosh(x);
|
|
163
|
+
const delta = longway * 2.0 * Math.asinh(Math.sqrt((chord - speri) / (2.0 * sma)));
|
|
164
|
+
const psi = (gamma - delta) / 2.0;
|
|
165
|
+
const sinhPsi = Math.sinh(psi);
|
|
166
|
+
const etaSq = (-2.0 * sma * sinhPsi * sinhPsi) / speri;
|
|
167
|
+
eta = Math.sqrt(etaSq);
|
|
168
|
+
}
|
|
169
|
+
const vr1 = (1.0 / eta) * Math.sqrt(1.0 / minSma) * ((2.0 * lambda * minSma) / r1 - (lambda + x * eta));
|
|
170
|
+
const vt1 = (1.0 / eta) * Math.sqrt(1.0 / minSma) * Math.sqrt(r2 / r1) * Math.sin(dth / 2.0);
|
|
171
|
+
v1[0] = vr1;
|
|
172
|
+
v1[1] = vt1;
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Estimate a state vector for inertial position [p1] _(km)_ given the
|
|
177
|
+
* two epoch and positions.
|
|
178
|
+
* @param p1 Position vector 1
|
|
179
|
+
* @param p2 Position vector 2
|
|
180
|
+
* @param t1 Epoch 1
|
|
181
|
+
* @param t2 Epoch 2
|
|
182
|
+
* @param root0 Optional parameters
|
|
183
|
+
* @param root0.posigrade If true, use the positive root (default: true)
|
|
184
|
+
* @param root0.nRev Number of revolutions (default: 0)
|
|
185
|
+
* @returns A [J2000] object with the estimated state vector.
|
|
186
|
+
*/
|
|
187
|
+
estimate(p1, p2, t1, t2, { posigrade = true, nRev = 0 } = {}) {
|
|
188
|
+
const r1 = p1.magnitude();
|
|
189
|
+
const r2 = p2.magnitude();
|
|
190
|
+
const tof = t2.difference(t1);
|
|
191
|
+
const r = Math.max(r1, r2);
|
|
192
|
+
const v = Math.sqrt(this.mu / r);
|
|
193
|
+
const t = r / v;
|
|
194
|
+
let dth = p1.angle(p2);
|
|
195
|
+
if (!posigrade) {
|
|
196
|
+
dth = 2 * Math.PI - dth;
|
|
197
|
+
}
|
|
198
|
+
const vDep = new Float64Array(2);
|
|
199
|
+
const exitFlag = LambertIOD.solve(r1 / r, r2 / r, dth, tof / t, nRev, vDep);
|
|
200
|
+
if (exitFlag) {
|
|
201
|
+
const pn = p1.cross(p2);
|
|
202
|
+
const pt = pn.cross(p1);
|
|
203
|
+
let rt = pt.magnitude();
|
|
204
|
+
if (!posigrade) {
|
|
205
|
+
rt = -rt;
|
|
206
|
+
}
|
|
207
|
+
const vel1 = p1.scale((v * vDep[0]) / r1).add(pt.scale((v * vDep[1]) / rt));
|
|
208
|
+
return new J2000(t1, p1, vel1);
|
|
209
|
+
}
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=LambertIOD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LambertIOD.js","sourceRoot":"","sources":["../../src/orbit_determination/LambertIOD.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { J2000, Kilometers } from 'ootk-core';
|
|
18
|
+
import { ObservationOptical } from './../observation/ObservationOptical';
|
|
19
|
+
type SolveOptions = {
|
|
20
|
+
nRev?: number;
|
|
21
|
+
direction?: boolean;
|
|
22
|
+
posSearch?: number;
|
|
23
|
+
velSearch?: number;
|
|
24
|
+
tolerance?: number;
|
|
25
|
+
printIter?: boolean;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Gooding angles-only initial orbit determination.
|
|
29
|
+
*
|
|
30
|
+
* Used for orbit determination from multiple optical observations.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ModifiedGoodingIOD {
|
|
33
|
+
private observations_;
|
|
34
|
+
private mu_;
|
|
35
|
+
constructor(observations: ObservationOptical[], mu?: number);
|
|
36
|
+
private createInitial_;
|
|
37
|
+
private _createErrorFunction;
|
|
38
|
+
solve(r0: Kilometers, rN: Kilometers, { nRev, direction, posSearch, velSearch, tolerance, printIter, }: SolveOptions): J2000;
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { Earth, J2000, RadecTopocentric, Vector3D } from 'ootk-core';
|
|
18
|
+
import { ForceModel } from '../force/ForceModel';
|
|
19
|
+
import { RungeKutta89Propagator } from '../propagator/RungeKutta89Propagator';
|
|
20
|
+
import { DownhillSimplex } from './../optimize/DownhillSimplex';
|
|
21
|
+
import { GoodingIOD } from './GoodingIOD';
|
|
22
|
+
/**
|
|
23
|
+
* Gooding angles-only initial orbit determination.
|
|
24
|
+
*
|
|
25
|
+
* Used for orbit determination from multiple optical observations.
|
|
26
|
+
*/
|
|
27
|
+
export class ModifiedGoodingIOD {
|
|
28
|
+
observations_;
|
|
29
|
+
mu_;
|
|
30
|
+
constructor(observations, mu = Earth.mu) {
|
|
31
|
+
this.observations_ = observations;
|
|
32
|
+
this.mu_ = mu;
|
|
33
|
+
}
|
|
34
|
+
createInitial_(r0, rN, nRev, direction) {
|
|
35
|
+
const iod = new GoodingIOD(this.observations_[0], this.observations_[Math.floor(this.observations_.length / 2)], this.observations_[this.observations_.length - 1], this.mu_);
|
|
36
|
+
return iod.solve(r0, rN, nRev, direction);
|
|
37
|
+
}
|
|
38
|
+
_createErrorFunction(aprioriEpoch) {
|
|
39
|
+
const forceModel = new ForceModel().setGravity(this.mu_);
|
|
40
|
+
const scoreFn = (x) => {
|
|
41
|
+
const position = new Vector3D(x[0], x[1], x[2]);
|
|
42
|
+
const velocity = new Vector3D(x[3], x[4], x[5]);
|
|
43
|
+
const state = new J2000(aprioriEpoch, position, velocity);
|
|
44
|
+
const propagator = new RungeKutta89Propagator(state, forceModel);
|
|
45
|
+
let total = 0;
|
|
46
|
+
for (const oC of this.observations_) {
|
|
47
|
+
const sC = propagator.propagate(oC.epoch);
|
|
48
|
+
const pC = oC.site;
|
|
49
|
+
const expected = oC.observation.lineOfSight();
|
|
50
|
+
const actual = RadecTopocentric.fromStateVector(sC, pC).lineOfSight();
|
|
51
|
+
const error = expected.angle(actual);
|
|
52
|
+
total += error;
|
|
53
|
+
}
|
|
54
|
+
return total;
|
|
55
|
+
};
|
|
56
|
+
return scoreFn;
|
|
57
|
+
}
|
|
58
|
+
solve(r0, rN, { nRev = 0, direction = true, posSearch = 10.0, velSearch = 0.1, tolerance = 1e-6, printIter = false, }) {
|
|
59
|
+
if (this.observations_.length < 3) {
|
|
60
|
+
throw new Error('At least 3 observations required for Gooding IOD.');
|
|
61
|
+
}
|
|
62
|
+
const init = this.createInitial_(r0, rN, nRev, direction);
|
|
63
|
+
const guess = Float64Array.from([...init.position.toArray(), ...init.velocity.toArray()]);
|
|
64
|
+
const solveFn = this._createErrorFunction(init.epoch);
|
|
65
|
+
const simplex = [
|
|
66
|
+
Float64Array.from(guess),
|
|
67
|
+
Float64Array.from([guess[0] + posSearch, guess[1], guess[2], guess[3], guess[4], guess[5]]),
|
|
68
|
+
Float64Array.from([guess[0], guess[1] + posSearch, guess[2], guess[3], guess[4], guess[5]]),
|
|
69
|
+
Float64Array.from([guess[0], guess[1], guess[2] + posSearch, guess[3], guess[4], guess[5]]),
|
|
70
|
+
Float64Array.from([guess[0], guess[1], guess[2], guess[3] + velSearch, guess[4], guess[5]]),
|
|
71
|
+
Float64Array.from([guess[0], guess[1], guess[2], guess[3], guess[4] + velSearch, guess[5]]),
|
|
72
|
+
Float64Array.from([guess[0], guess[1], guess[2], guess[3], guess[4], guess[5] + velSearch]),
|
|
73
|
+
];
|
|
74
|
+
const result = DownhillSimplex.solveSimplex(solveFn, simplex, {
|
|
75
|
+
adaptive: true,
|
|
76
|
+
xTolerance: tolerance,
|
|
77
|
+
fTolerance: tolerance,
|
|
78
|
+
printIter,
|
|
79
|
+
});
|
|
80
|
+
return new J2000(init.epoch, new Vector3D(result[0], result[1], result[2]), new Vector3D(result[3], result[4], result[5]));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ModifiedGoodingIOD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModifiedGoodingIOD.js","sourceRoot":"","sources":["../../src/orbit_determination/ModifiedGoodingIOD.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { RungeKuttaAdaptive } from './RungeKuttaAdaptive';
|
|
18
|
+
export declare class DormandPrince54Propagator extends RungeKuttaAdaptive {
|
|
19
|
+
private _a;
|
|
20
|
+
private _b;
|
|
21
|
+
private _ch;
|
|
22
|
+
private _c;
|
|
23
|
+
get a(): Float64Array;
|
|
24
|
+
get b(): Float64Array[];
|
|
25
|
+
get ch(): Float64Array;
|
|
26
|
+
get c(): Float64Array;
|
|
27
|
+
get order(): number;
|
|
28
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
/* eslint-disable class-methods-use-this */
|
|
18
|
+
import { RungeKuttaAdaptive } from './RungeKuttaAdaptive';
|
|
19
|
+
export class DormandPrince54Propagator extends RungeKuttaAdaptive {
|
|
20
|
+
_a = Float64Array.from([0.0, 1.0 / 5.0, 3.0 / 10.0, 4.0 / 5.0, 8.0 / 9.0, 1.0, 1.0]);
|
|
21
|
+
_b = [
|
|
22
|
+
new Float64Array(),
|
|
23
|
+
Float64Array.from([1.0 / 5.0]),
|
|
24
|
+
Float64Array.from([3.0 / 40.0, 9.0 / 40.0]),
|
|
25
|
+
Float64Array.from([44.0 / 45.0, -56.0 / 15.0, 32.0 / 9.0]),
|
|
26
|
+
Float64Array.from([19372.0 / 6561.0, -25360.0 / 2187.0, 64448.0 / 6561.0, -212.0 / 729.0]),
|
|
27
|
+
Float64Array.from([9017.0 / 3168.0, -355.0 / 33.0, 46732.0 / 5247.0, 49.0 / 176.0, -5103.0 / 18656.0]),
|
|
28
|
+
Float64Array.from([35.0 / 384.0, 0.0, 500.0 / 1113.0, 125.0 / 192.0, -2187.0 / 6784.0, 11.0 / 84.0]),
|
|
29
|
+
];
|
|
30
|
+
_ch = Float64Array.from([
|
|
31
|
+
35.0 / 384.0,
|
|
32
|
+
0.0,
|
|
33
|
+
500.0 / 1113.0,
|
|
34
|
+
125.0 / 192.0,
|
|
35
|
+
-2187.0 / 6784.0,
|
|
36
|
+
11.0 / 84.0,
|
|
37
|
+
0.0,
|
|
38
|
+
]);
|
|
39
|
+
_c = Float64Array.from([
|
|
40
|
+
5179.0 / 57600.0,
|
|
41
|
+
0.0,
|
|
42
|
+
7571.0 / 16695.0,
|
|
43
|
+
393.0 / 640.0,
|
|
44
|
+
-92097.0 / 339200.0,
|
|
45
|
+
187.0 / 2100.0,
|
|
46
|
+
1.0 / 40.0,
|
|
47
|
+
]);
|
|
48
|
+
get a() {
|
|
49
|
+
return this._a;
|
|
50
|
+
}
|
|
51
|
+
get b() {
|
|
52
|
+
return this._b;
|
|
53
|
+
}
|
|
54
|
+
get ch() {
|
|
55
|
+
return this._ch;
|
|
56
|
+
}
|
|
57
|
+
get c() {
|
|
58
|
+
return this._c;
|
|
59
|
+
}
|
|
60
|
+
get order() {
|
|
61
|
+
return 5;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=DormandPrince54Propagator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DormandPrince54Propagator.js","sourceRoot":"","sources":["../../src/propagator/DormandPrince54Propagator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,2CAA2C;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,yBAA0B,SAAQ,kBAAkB;IACvD,EAAE,GAAiB,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAEnG,EAAE,GAAmB;QAC3B,IAAI,YAAY,EAAE;QAClB,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAC9B,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3C,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;QAC1D,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QAC1F,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;QACtG,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;KACrG,CAAC;IAEM,GAAG,GAAiB,YAAY,CAAC,IAAI,CAAC;QAC5C,IAAI,GAAG,KAAK;QACZ,GAAG;QACH,KAAK,GAAG,MAAM;QACd,KAAK,GAAG,KAAK;QACb,CAAC,MAAM,GAAG,MAAM;QAChB,IAAI,GAAG,IAAI;QACX,GAAG;KACJ,CAAC,CAAC;IAEK,EAAE,GAAiB,YAAY,CAAC,IAAI,CAAC;QAC3C,MAAM,GAAG,OAAO;QAChB,GAAG;QACH,MAAM,GAAG,OAAO;QAChB,KAAK,GAAG,KAAK;QACb,CAAC,OAAO,GAAG,QAAQ;QACnB,KAAK,GAAG,MAAM;QACd,GAAG,GAAG,IAAI;KACX,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,CAAC,CAAC;IACX,CAAC;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { ClassicalElements, EpochUTC, J2000 } from 'ootk-core';
|
|
18
|
+
import { Thrust } from '../force/Thrust';
|
|
19
|
+
import { VerletBlendInterpolator } from '../interpolator/VerletBlendInterpolator';
|
|
20
|
+
import { Propagator } from './Propagator';
|
|
21
|
+
export declare class KeplerPropagator extends Propagator {
|
|
22
|
+
private _initElements;
|
|
23
|
+
private _elements;
|
|
24
|
+
private _cacheState;
|
|
25
|
+
private _checkpoints;
|
|
26
|
+
constructor(initElements: ClassicalElements);
|
|
27
|
+
get state(): J2000;
|
|
28
|
+
propagate(epoch: EpochUTC): J2000;
|
|
29
|
+
reset(): void;
|
|
30
|
+
maneuver(maneuver: Thrust, interval?: number): J2000[];
|
|
31
|
+
ephemerisManeuver(start: EpochUTC, finish: EpochUTC, maneuvers: Thrust[], interval?: number): VerletBlendInterpolator;
|
|
32
|
+
checkpoint(): number;
|
|
33
|
+
clearCheckpoints(): void;
|
|
34
|
+
restore(index: number): void;
|
|
35
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { J2000 } from 'ootk-core';
|
|
18
|
+
import { VerletBlendInterpolator } from '../interpolator/VerletBlendInterpolator';
|
|
19
|
+
import { Propagator } from './Propagator';
|
|
20
|
+
// / Kepler analytical two-body propagator.
|
|
21
|
+
export class KeplerPropagator extends Propagator {
|
|
22
|
+
_initElements;
|
|
23
|
+
_elements;
|
|
24
|
+
_cacheState;
|
|
25
|
+
_checkpoints;
|
|
26
|
+
constructor(initElements) {
|
|
27
|
+
super();
|
|
28
|
+
this._initElements = initElements;
|
|
29
|
+
this._elements = initElements;
|
|
30
|
+
this._cacheState = J2000.fromClassicalElements(initElements);
|
|
31
|
+
this._checkpoints = [];
|
|
32
|
+
}
|
|
33
|
+
get state() {
|
|
34
|
+
return this._cacheState;
|
|
35
|
+
}
|
|
36
|
+
propagate(epoch) {
|
|
37
|
+
this._cacheState = J2000.fromClassicalElements(this._elements.propagate(epoch));
|
|
38
|
+
return this._cacheState;
|
|
39
|
+
}
|
|
40
|
+
reset() {
|
|
41
|
+
this._elements = this._initElements;
|
|
42
|
+
this._cacheState = J2000.fromClassicalElements(this._elements);
|
|
43
|
+
}
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
45
|
+
maneuver(maneuver, interval = 60) {
|
|
46
|
+
this._cacheState = maneuver.apply(this.propagate(maneuver.center));
|
|
47
|
+
this._elements = this._cacheState.toClassicalElements();
|
|
48
|
+
return [this._cacheState];
|
|
49
|
+
}
|
|
50
|
+
ephemerisManeuver(start, finish, maneuvers, interval = 60.0) {
|
|
51
|
+
const tMvr = maneuvers.slice(0).filter((mvr) => mvr.center >= start || mvr.center <= finish);
|
|
52
|
+
const ephemeris = [];
|
|
53
|
+
if (tMvr[0].start > start) {
|
|
54
|
+
ephemeris.push(this.propagate(start));
|
|
55
|
+
}
|
|
56
|
+
for (const mvr of tMvr) {
|
|
57
|
+
while (this._cacheState.epoch < mvr.center) {
|
|
58
|
+
const step = Math.min(mvr.center.difference(this._cacheState.epoch), interval);
|
|
59
|
+
this.propagate(this._cacheState.epoch.roll(step));
|
|
60
|
+
if (this._cacheState.epoch.posix !== mvr.center.posix) {
|
|
61
|
+
ephemeris.push(this._cacheState);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
ephemeris.push(...this.maneuver(mvr, interval));
|
|
65
|
+
}
|
|
66
|
+
while (this._cacheState.epoch < finish) {
|
|
67
|
+
const step = Math.min(finish.difference(this._cacheState.epoch), interval);
|
|
68
|
+
this.propagate(this._cacheState.epoch.roll(step));
|
|
69
|
+
ephemeris.push(this._cacheState);
|
|
70
|
+
}
|
|
71
|
+
return new VerletBlendInterpolator(ephemeris);
|
|
72
|
+
}
|
|
73
|
+
checkpoint() {
|
|
74
|
+
this._checkpoints.push(this._cacheState);
|
|
75
|
+
return this._checkpoints.length - 1;
|
|
76
|
+
}
|
|
77
|
+
clearCheckpoints() {
|
|
78
|
+
this._checkpoints = [];
|
|
79
|
+
}
|
|
80
|
+
restore(index) {
|
|
81
|
+
this._cacheState = this._checkpoints[index];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=KeplerPropagator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeplerPropagator.js","sourceRoot":"","sources":["../../src/propagator/KeplerPropagator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author @thkruz Theodore Kruczek
|
|
3
|
+
* @license AGPL-3.0-or-later
|
|
4
|
+
* @copyright (c) 2020-2024 Theodore Kruczek
|
|
5
|
+
*
|
|
6
|
+
* Orbital Object ToolKit is free software: you can redistribute it and/or modify it under the
|
|
7
|
+
* terms of the GNU Affero General Public License as published by the Free Software
|
|
8
|
+
* Foundation, either version 3 of the License, or (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* Orbital Object ToolKit is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
11
|
+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
12
|
+
* See the GNU Affero General Public License for more details.
|
|
13
|
+
*
|
|
14
|
+
* You should have received a copy of the GNU Affero General Public License along with
|
|
15
|
+
* Orbital Object ToolKit. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
import { EpochUTC, J2000, Seconds } from 'ootk-core';
|
|
18
|
+
import { Thrust } from '../force/Thrust';
|
|
19
|
+
import { VerletBlendInterpolator } from '../interpolator/VerletBlendInterpolator';
|
|
20
|
+
export declare abstract class Propagator {
|
|
21
|
+
abstract propagate(epoch: EpochUTC): J2000;
|
|
22
|
+
ephemeris(start: EpochUTC, stop: EpochUTC, interval?: Seconds): VerletBlendInterpolator;
|
|
23
|
+
abstract reset(): void;
|
|
24
|
+
abstract checkpoint(): number;
|
|
25
|
+
abstract restore(index: number): void;
|
|
26
|
+
abstract clearCheckpoints(): void;
|
|
27
|
+
abstract get state(): J2000;
|
|
28
|
+
maneuver(maneuver: Thrust, interval?: Seconds): J2000[];
|
|
29
|
+
ephemerisManeuver(start: EpochUTC, finish: EpochUTC, maneuvers: Thrust[], interval?: Seconds): VerletBlendInterpolator;
|
|
30
|
+
ascendingNodeEpoch(start: EpochUTC): EpochUTC;
|
|
31
|
+
descendingNodeEpoch(start: EpochUTC): EpochUTC;
|
|
32
|
+
apogeeEpoch(start: EpochUTC): EpochUTC;
|
|
33
|
+
perigeeEpoch(start: EpochUTC): EpochUTC;
|
|
34
|
+
}
|