ootk 5.1.0 → 6.0.0-rc.2
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/.claude/PROMPT.md +13 -0
- package/.claude/hooks/post-tool-use.ts +33 -0
- package/.claude/hooks/user-prompt-submit.ts +138 -0
- package/.claude/settings.local.json +13 -0
- package/.claude/skill-rules.json +11 -0
- package/.claude/skills/ootk-dev/SKILL.md +16 -0
- package/ADVANCED_FEATURES_GUIDE.md +1025 -0
- package/CHANGELOG.md +42 -3
- package/README.md +77 -45
- package/dist/body/Celestial.d.ts +2 -2
- package/dist/body/Celestial.js +2 -2
- package/dist/body/Celestial.js.map +1 -1
- package/dist/body/Earth.d.ts +4 -4
- package/dist/body/Earth.js +2 -2
- package/dist/body/Earth.js.map +1 -1
- package/dist/body/Moon.d.ts +3 -3
- package/dist/body/Moon.js +7 -7
- package/dist/body/Moon.js.map +1 -1
- package/dist/body/NutationAngles.d.ts +2 -2
- package/dist/body/NutationAngles.js +1 -1
- package/dist/body/PrecessionAngles.d.ts +2 -2
- package/dist/body/PrecessionAngles.js +1 -1
- package/dist/body/Sun.d.ts +2 -2
- package/dist/body/Sun.js +3 -3
- package/dist/body/Sun.js.map +1 -1
- package/dist/body/index.d.ts +5 -5
- package/dist/body/index.js +5 -5
- package/dist/body/index.js.map +1 -1
- package/dist/conjunction/ConjunctionAssessment.d.ts +156 -0
- package/dist/conjunction/ConjunctionAssessment.js +281 -0
- package/dist/conjunction/ConjunctionAssessment.js.map +1 -0
- package/dist/conjunction/ConjunctionEvent.d.ts +104 -0
- package/dist/conjunction/ConjunctionEvent.js +156 -0
- package/dist/conjunction/ConjunctionEvent.js.map +1 -0
- package/dist/conjunction/ProbabilityOfCollision.d.ts +102 -0
- package/dist/conjunction/ProbabilityOfCollision.js +240 -0
- package/dist/conjunction/ProbabilityOfCollision.js.map +1 -0
- package/dist/conjunction/index.d.ts +19 -0
- package/dist/conjunction/index.js +20 -0
- package/dist/conjunction/index.js.map +1 -0
- package/dist/coordinate/ClassicalElements.d.ts +7 -7
- package/dist/coordinate/ClassicalElements.js +7 -7
- package/dist/coordinate/ClassicalElements.js.map +1 -1
- package/dist/coordinate/EquinoctialElements.d.ts +5 -5
- package/dist/coordinate/EquinoctialElements.js +4 -4
- package/dist/coordinate/EquinoctialElements.js.map +1 -1
- package/dist/coordinate/FormatTle.d.ts +2 -2
- package/dist/coordinate/FormatTle.js +2 -2
- package/dist/coordinate/FormatTle.js.map +1 -1
- package/dist/coordinate/Geodetic.d.ts +4 -4
- package/dist/coordinate/Geodetic.js +7 -7
- package/dist/coordinate/Geodetic.js.map +1 -1
- package/dist/coordinate/Hill.d.ts +4 -4
- package/dist/coordinate/Hill.js +3 -3
- package/dist/coordinate/Hill.js.map +1 -1
- package/dist/coordinate/ITRF.d.ts +5 -5
- package/dist/coordinate/ITRF.js +6 -5
- package/dist/coordinate/ITRF.js.map +1 -1
- package/dist/coordinate/J2000.d.ts +5 -5
- package/dist/coordinate/J2000.js +5 -5
- package/dist/coordinate/J2000.js.map +1 -1
- package/dist/coordinate/RIC.d.ts +4 -4
- package/dist/coordinate/RIC.js +3 -3
- package/dist/coordinate/RIC.js.map +1 -1
- package/dist/coordinate/RelativeState.d.ts +5 -5
- package/dist/coordinate/RelativeState.js +2 -2
- package/dist/coordinate/RelativeState.js.map +1 -1
- package/dist/coordinate/StateVector.d.ts +2 -2
- package/dist/coordinate/StateVector.js +2 -2
- package/dist/coordinate/StateVector.js.map +1 -1
- package/dist/coordinate/TEME.d.ts +4 -4
- package/dist/coordinate/TEME.js +4 -4
- package/dist/coordinate/TEME.js.map +1 -1
- package/dist/coordinate/Tle.d.ts +5 -5
- package/dist/coordinate/Tle.js +9 -9
- package/dist/coordinate/Tle.js.map +1 -1
- package/dist/coordinate/index.d.ts +12 -12
- package/dist/coordinate/index.js +12 -12
- package/dist/coordinate/index.js.map +1 -1
- package/dist/coordinate/tle-format-data.d.ts +1 -1
- package/dist/coordinate/tle-format-data.js +1 -1
- package/dist/covariance/CovarianceSample.d.ts +5 -5
- package/dist/covariance/CovarianceSample.js +5 -5
- package/dist/covariance/CovarianceSample.js.map +1 -1
- package/dist/covariance/StateCovariance.d.ts +2 -2
- package/dist/covariance/StateCovariance.js +2 -2
- package/dist/covariance/StateCovariance.js.map +1 -1
- package/dist/covariance/index.d.ts +2 -2
- package/dist/covariance/index.js +2 -2
- package/dist/covariance/index.js.map +1 -1
- package/dist/data/DataHandler.d.ts +4 -4
- package/dist/data/DataHandler.js +5 -5
- package/dist/data/DataHandler.js.map +1 -1
- package/dist/data/values/Egm96Data.d.ts +1 -1
- package/dist/data/values/Egm96Data.js +3 -3
- package/dist/data/values/Egm96Data.js.map +1 -1
- package/dist/data/values/HpAtmosphereData.d.ts +2 -2
- package/dist/data/values/HpAtmosphereData.js +3 -3
- package/dist/data/values/HpAtmosphereData.js.map +1 -1
- package/dist/data/values/HpAtmosphereResult.d.ts +2 -2
- package/dist/data/values/HpAtmosphereResult.js +1 -1
- package/dist/data/values/Iau1980Data.d.ts +1 -1
- package/dist/data/values/Iau1980Data.js +2 -2
- package/dist/data/values/Iau1980Data.js.map +1 -1
- package/dist/data/values/LeapSecond.d.ts +1 -1
- package/dist/data/values/LeapSecond.js +1 -1
- package/dist/data/values/LeapSecondData.d.ts +2 -2
- package/dist/data/values/LeapSecondData.js +2 -2
- package/dist/data/values/LeapSecondData.js.map +1 -1
- package/dist/data/values/egm96.d.ts +2 -2
- package/dist/data/values/egm96.js +1 -1
- package/dist/data/values/hpAtmosphere.d.ts +2 -2
- package/dist/data/values/hpAtmosphere.js +1 -1
- package/dist/data/values/iau1980.d.ts +2 -2
- package/dist/data/values/iau1980.js +1 -1
- package/dist/enums/AngularDiameterMethod.d.ts +1 -1
- package/dist/enums/AngularDiameterMethod.js +1 -1
- package/dist/enums/AngularDistanceMethod.d.ts +1 -1
- package/dist/enums/AngularDistanceMethod.js +1 -1
- package/dist/enums/OrbitRegime.d.ts +1 -1
- package/dist/enums/OrbitRegime.js +1 -1
- package/dist/enums/PassType.d.ts +1 -1
- package/dist/enums/PassType.js +1 -1
- package/dist/enums/Sgp4OpsMode.d.ts +1 -1
- package/dist/enums/Sgp4OpsMode.js +1 -1
- package/dist/enums/index.d.ts +7 -7
- package/dist/enums/index.js +7 -7
- package/dist/enums/index.js.map +1 -1
- package/dist/fetch/horizons-constants.d.ts +43 -0
- package/dist/fetch/horizons-constants.js +50 -0
- package/dist/fetch/horizons-constants.js.map +1 -0
- package/dist/fetch/horizons-interfaces.d.ts +37 -0
- package/dist/fetch/horizons-interfaces.js +2 -0
- package/dist/fetch/horizons-interfaces.js.map +1 -0
- package/dist/fetch/horizons.d.ts +86 -0
- package/dist/fetch/horizons.js +237 -0
- package/dist/fetch/horizons.js.map +1 -0
- package/dist/force/AtmosphericDrag.d.ts +3 -3
- package/dist/force/AtmosphericDrag.js +2 -2
- package/dist/force/AtmosphericDrag.js.map +1 -1
- package/dist/force/EarthGravity.d.ts +3 -3
- package/dist/force/EarthGravity.js +2 -2
- package/dist/force/EarthGravity.js.map +1 -1
- package/dist/force/Force.d.ts +3 -3
- package/dist/force/Force.js +1 -10
- package/dist/force/Force.js.map +1 -1
- package/dist/force/ForceModel.d.ts +3 -3
- package/dist/force/ForceModel.js +7 -7
- package/dist/force/ForceModel.js.map +1 -1
- package/dist/force/Gravity.d.ts +3 -3
- package/dist/force/Gravity.js +2 -2
- package/dist/force/Gravity.js.map +1 -1
- package/dist/force/SolarRadiationPressure.d.ts +3 -3
- package/dist/force/SolarRadiationPressure.js +4 -4
- package/dist/force/SolarRadiationPressure.js.map +1 -1
- package/dist/force/ThirdBodyGravity.d.ts +3 -3
- package/dist/force/ThirdBodyGravity.js +2 -2
- package/dist/force/ThirdBodyGravity.js.map +1 -1
- package/dist/force/Thrust.d.ts +3 -3
- package/dist/force/Thrust.js +2 -2
- package/dist/force/Thrust.js.map +1 -1
- package/dist/force/index.d.ts +1 -1
- package/dist/force/index.js +1 -1
- package/dist/force/index.js.map +1 -1
- package/dist/interfaces/BaseObjectParams.d.ts +2 -2
- package/dist/interfaces/BaseObjectParams.js +1 -1
- package/dist/interfaces/ClassicalElementsParams.d.ts +2 -2
- package/dist/interfaces/ClassicalElementsParams.js +1 -1
- package/dist/interfaces/EquinoctialElementsParams.d.ts +2 -2
- package/dist/interfaces/EquinoctialElementsParams.js +1 -1
- package/dist/interfaces/GroundPositionParams.d.ts +2 -2
- package/dist/interfaces/GroundPositionParams.js +1 -1
- package/dist/interfaces/RfSensorParams.d.ts +2 -2
- package/dist/interfaces/SatelliteParams.d.ts +2 -2
- package/dist/interfaces/SensorParams.d.ts +2 -2
- package/dist/interfaces/StarObjectParams.d.ts +1 -1
- package/dist/interfaces/TimeVariables.d.ts +1 -1
- package/dist/interfaces/index.d.ts +9 -9
- package/dist/interpolator/ChebyshevCoefficients.d.ts +2 -2
- package/dist/interpolator/ChebyshevCoefficients.js +2 -2
- package/dist/interpolator/ChebyshevCoefficients.js.map +1 -1
- package/dist/interpolator/ChebyshevInterpolator.d.ts +4 -4
- package/dist/interpolator/ChebyshevInterpolator.js +3 -3
- package/dist/interpolator/ChebyshevInterpolator.js.map +1 -1
- package/dist/interpolator/CubicSpline.d.ts +2 -2
- package/dist/interpolator/CubicSpline.js +1 -1
- package/dist/interpolator/CubicSplineInterpolator.d.ts +4 -4
- package/dist/interpolator/CubicSplineInterpolator.js +4 -4
- package/dist/interpolator/CubicSplineInterpolator.js.map +1 -1
- package/dist/interpolator/FieldInterpolator.d.ts +3 -3
- package/dist/interpolator/FieldInterpolator.js +2 -12
- package/dist/interpolator/FieldInterpolator.js.map +1 -1
- package/dist/interpolator/Interpolator.d.ts +2 -2
- package/dist/interpolator/Interpolator.js +2 -2
- package/dist/interpolator/Interpolator.js.map +1 -1
- package/dist/interpolator/LagrangeInterpolator.d.ts +3 -3
- package/dist/interpolator/LagrangeInterpolator.js +3 -3
- package/dist/interpolator/LagrangeInterpolator.js.map +1 -1
- package/dist/interpolator/StateInterpolator.d.ts +4 -4
- package/dist/interpolator/StateInterpolator.js +2 -10
- package/dist/interpolator/StateInterpolator.js.map +1 -1
- package/dist/interpolator/VerletBlendInterpolator.d.ts +5 -5
- package/dist/interpolator/VerletBlendInterpolator.js +5 -5
- package/dist/interpolator/VerletBlendInterpolator.js.map +1 -1
- package/dist/main.d.ts +20 -20
- package/dist/main.js +21 -20
- package/dist/main.js.map +1 -1
- package/dist/maneuver/TwoBurnOrbitTransfer.d.ts +3 -3
- package/dist/maneuver/TwoBurnOrbitTransfer.js +3 -3
- package/dist/maneuver/TwoBurnOrbitTransfer.js.map +1 -1
- package/dist/maneuver/Waypoint.d.ts +5 -5
- package/dist/maneuver/Waypoint.js +7 -7
- package/dist/maneuver/Waypoint.js.map +1 -1
- package/dist/objects/BaseObject.d.ts +3 -3
- package/dist/objects/BaseObject.js +2 -2
- package/dist/objects/BaseObject.js.map +1 -1
- package/dist/objects/DetailedSatellite.d.ts +4 -4
- package/dist/objects/DetailedSatellite.js +4 -4
- package/dist/objects/DetailedSatellite.js.map +1 -1
- package/dist/objects/DetailedSensor.d.ts +5 -5
- package/dist/objects/DetailedSensor.js +2 -2
- package/dist/objects/DetailedSensor.js.map +1 -1
- package/dist/objects/GroundObject.d.ts +4 -4
- package/dist/objects/GroundObject.js +3 -3
- package/dist/objects/GroundObject.js.map +1 -1
- package/dist/objects/LandObject.d.ts +3 -3
- package/dist/objects/LandObject.js +2 -2
- package/dist/objects/LandObject.js.map +1 -1
- package/dist/objects/Marker.d.ts +2 -2
- package/dist/objects/Marker.js +2 -2
- package/dist/objects/Marker.js.map +1 -1
- package/dist/objects/RfSensor.d.ts +2 -2
- package/dist/objects/RfSensor.js +2 -2
- package/dist/objects/RfSensor.js.map +1 -1
- package/dist/objects/Satellite.d.ts +12 -12
- package/dist/objects/Satellite.js +14 -14
- package/dist/objects/Satellite.js.map +1 -1
- package/dist/objects/Sensor.d.ts +6 -6
- package/dist/objects/Sensor.js +5 -5
- package/dist/objects/Sensor.js.map +1 -1
- package/dist/objects/Star.d.ts +3 -3
- package/dist/objects/Star.js +3 -3
- package/dist/objects/Star.js.map +1 -1
- package/dist/objects/index.d.ts +10 -10
- package/dist/objects/index.js +10 -10
- package/dist/objects/index.js.map +1 -1
- package/dist/observation/Observation.d.ts +11 -11
- package/dist/observation/Observation.js +1 -52
- package/dist/observation/Observation.js.map +1 -1
- package/dist/observation/ObservationOptical.d.ts +6 -6
- package/dist/observation/ObservationOptical.js +4 -4
- package/dist/observation/ObservationOptical.js.map +1 -1
- package/dist/observation/ObservationRadar.d.ts +6 -6
- package/dist/observation/ObservationRadar.js +4 -4
- package/dist/observation/ObservationRadar.js.map +1 -1
- package/dist/observation/ObservationUtils.d.ts +2 -2
- package/dist/observation/ObservationUtils.js +2 -2
- package/dist/observation/ObservationUtils.js.map +1 -1
- package/dist/observation/PropagatorPairs.d.ts +2 -2
- package/dist/observation/PropagatorPairs.js +1 -1
- package/dist/observation/RAE.d.ts +6 -6
- package/dist/observation/RAE.js +6 -6
- package/dist/observation/RAE.js.map +1 -1
- package/dist/observation/RadecGeocentric.d.ts +6 -6
- package/dist/observation/RadecGeocentric.js +5 -5
- package/dist/observation/RadecGeocentric.js.map +1 -1
- package/dist/observation/RadecTopocentric.d.ts +6 -6
- package/dist/observation/RadecTopocentric.js +9 -7
- package/dist/observation/RadecTopocentric.js.map +1 -1
- package/dist/observation/index.d.ts +5 -5
- package/dist/observation/index.js +5 -5
- package/dist/observation/index.js.map +1 -1
- package/dist/operations/BoxMuller.d.ts +2 -2
- package/dist/operations/BoxMuller.js +2 -2
- package/dist/operations/BoxMuller.js.map +1 -1
- package/dist/operations/EulerAngles.d.ts +2 -2
- package/dist/operations/EulerAngles.js +2 -2
- package/dist/operations/EulerAngles.js.map +1 -1
- package/dist/operations/Matrix.d.ts +2 -2
- package/dist/operations/Matrix.js +2 -2
- package/dist/operations/Matrix.js.map +1 -1
- package/dist/operations/Quaternion.d.ts +2 -2
- package/dist/operations/Quaternion.js +2 -2
- package/dist/operations/Quaternion.js.map +1 -1
- package/dist/operations/Random.d.ts +1 -1
- package/dist/operations/Random.js +1 -1
- package/dist/operations/RandomGaussianSource.d.ts +2 -2
- package/dist/operations/RandomGaussianSource.js +3 -3
- package/dist/operations/RandomGaussianSource.js.map +1 -1
- package/dist/operations/Vector.d.ts +2 -2
- package/dist/operations/Vector.js +2 -2
- package/dist/operations/Vector.js.map +1 -1
- package/dist/operations/Vector3D.d.ts +5 -4
- package/dist/operations/Vector3D.js +5 -4
- package/dist/operations/Vector3D.js.map +1 -1
- package/dist/operations/index.d.ts +4 -4
- package/dist/operations/index.js +4 -4
- package/dist/operations/index.js.map +1 -1
- package/dist/operations/operations.d.ts +5 -5
- package/dist/operations/operations.js +5 -5
- package/dist/operations/operations.js.map +1 -1
- package/dist/optimize/ChebyshevCompressor.d.ts +3 -3
- package/dist/optimize/ChebyshevCompressor.js +4 -4
- package/dist/optimize/ChebyshevCompressor.js.map +1 -1
- package/dist/optimize/DownhillSimplex.d.ts +2 -2
- package/dist/optimize/DownhillSimplex.js +2 -2
- package/dist/optimize/DownhillSimplex.js.map +1 -1
- package/dist/optimize/GoldenSection.d.ts +2 -2
- package/dist/optimize/GoldenSection.js +1 -1
- package/dist/optimize/PolynomialRegression.d.ts +2 -2
- package/dist/optimize/PolynomialRegression.js +4 -4
- package/dist/optimize/PolynomialRegression.js.map +1 -1
- package/dist/optimize/PolynomicalRegressionResult.d.ts +1 -1
- package/dist/optimize/PolynomicalRegressionResult.js +1 -1
- package/dist/optimize/SimpleLinearRegression.d.ts +1 -1
- package/dist/optimize/SimpleLinearRegression.js +1 -1
- package/dist/optimize/SimplexEntry.d.ts +1 -1
- package/dist/optimize/SimplexEntry.js +2 -2
- package/dist/optimize/SimplexEntry.js.map +1 -1
- package/dist/orbit_determination/BatchLeastSquaresOD.d.ts +5 -5
- package/dist/orbit_determination/BatchLeastSquaresOD.js +8 -8
- package/dist/orbit_determination/BatchLeastSquaresOD.js.map +1 -1
- package/dist/orbit_determination/BatchLeastSquaresResult.d.ts +3 -3
- package/dist/orbit_determination/BatchLeastSquaresResult.js +1 -1
- package/dist/orbit_determination/GaussIOD.d.ts +98 -0
- package/dist/orbit_determination/GaussIOD.js +291 -0
- package/dist/orbit_determination/GaussIOD.js.map +1 -0
- package/dist/orbit_determination/GibbsIOD.d.ts +2 -2
- package/dist/orbit_determination/GibbsIOD.js +4 -4
- package/dist/orbit_determination/GibbsIOD.js.map +1 -1
- package/dist/orbit_determination/GoodingIOD.d.ts +58 -8
- package/dist/orbit_determination/GoodingIOD.js +225 -35
- package/dist/orbit_determination/GoodingIOD.js.map +1 -1
- package/dist/orbit_determination/HerrickGibbsIOD.d.ts +2 -2
- package/dist/orbit_determination/HerrickGibbsIOD.js +2 -2
- package/dist/orbit_determination/HerrickGibbsIOD.js.map +1 -1
- package/dist/orbit_determination/LambertIOD.d.ts +2 -2
- package/dist/orbit_determination/LambertIOD.js +2 -2
- package/dist/orbit_determination/LambertIOD.js.map +1 -1
- package/dist/orbit_determination/ModifiedGoodingIOD.d.ts +3 -3
- package/dist/orbit_determination/ModifiedGoodingIOD.js +8 -8
- package/dist/orbit_determination/ModifiedGoodingIOD.js.map +1 -1
- package/dist/orbit_determination/index.d.ts +7 -7
- package/dist/orbit_determination/index.js +7 -7
- package/dist/orbit_determination/index.js.map +1 -1
- package/dist/propagator/DormandPrince54Propagator.d.ts +2 -2
- package/dist/propagator/DormandPrince54Propagator.js +2 -2
- package/dist/propagator/DormandPrince54Propagator.js.map +1 -1
- package/dist/propagator/KeplerPropagator.d.ts +6 -6
- package/dist/propagator/KeplerPropagator.js +6 -7
- package/dist/propagator/KeplerPropagator.js.map +1 -1
- package/dist/propagator/Propagator.d.ts +5 -5
- package/dist/propagator/Propagator.js +5 -5
- package/dist/propagator/Propagator.js.map +1 -1
- package/dist/propagator/RkCheckpoint.d.ts +2 -2
- package/dist/propagator/RkCheckpoint.js +1 -1
- package/dist/propagator/RkResult.d.ts +2 -2
- package/dist/propagator/RkResult.js +1 -1
- package/dist/propagator/RungeKutta4Propagator.d.ts +6 -6
- package/dist/propagator/RungeKutta4Propagator.js +5 -5
- package/dist/propagator/RungeKutta4Propagator.js.map +1 -1
- package/dist/propagator/RungeKutta89Propagator.d.ts +2 -2
- package/dist/propagator/RungeKutta89Propagator.js +2 -2
- package/dist/propagator/RungeKutta89Propagator.js.map +1 -1
- package/dist/propagator/RungeKuttaAdaptive.d.ts +6 -6
- package/dist/propagator/RungeKuttaAdaptive.js +52 -9
- package/dist/propagator/RungeKuttaAdaptive.js.map +1 -1
- package/dist/propagator/Sgp4Propagator.d.ts +7 -7
- package/dist/propagator/Sgp4Propagator.js +4 -4
- package/dist/propagator/Sgp4Propagator.js.map +1 -1
- package/dist/propagator/index.d.ts +3 -3
- package/dist/propagator/index.js +3 -3
- package/dist/propagator/index.js.map +1 -1
- package/dist/sgp4/index.d.ts +2 -2
- package/dist/sgp4/index.js +2 -2
- package/dist/sgp4/index.js.map +1 -1
- package/dist/sgp4/sgp4.d.ts +3 -3
- package/dist/sgp4/sgp4.js +11 -5
- package/dist/sgp4/sgp4.js.map +1 -1
- package/dist/smoothing/ExponentialSmoothing.d.ts +2 -2
- package/dist/smoothing/ExponentialSmoothing.js +1 -1
- package/dist/time/Epoch.d.ts +2 -2
- package/dist/time/Epoch.js +2 -2
- package/dist/time/Epoch.js.map +1 -1
- package/dist/time/EpochGPS.d.ts +3 -3
- package/dist/time/EpochGPS.js +3 -3
- package/dist/time/EpochGPS.js.map +1 -1
- package/dist/time/EpochTAI.d.ts +2 -2
- package/dist/time/EpochTAI.js +2 -2
- package/dist/time/EpochTAI.js.map +1 -1
- package/dist/time/EpochTDB.d.ts +2 -2
- package/dist/time/EpochTDB.js +2 -2
- package/dist/time/EpochTDB.js.map +1 -1
- package/dist/time/EpochTT.d.ts +2 -2
- package/dist/time/EpochTT.js +2 -2
- package/dist/time/EpochTT.js.map +1 -1
- package/dist/time/EpochUTC.d.ts +7 -7
- package/dist/time/EpochUTC.js +9 -9
- package/dist/time/EpochUTC.js.map +1 -1
- package/dist/time/EpochWindow.d.ts +2 -2
- package/dist/time/EpochWindow.js +1 -1
- package/dist/time/TimeStamped.d.ts +2 -2
- package/dist/time/TimeStamped.js +1 -1
- package/dist/time/index.d.ts +8 -8
- package/dist/time/index.js +8 -8
- package/dist/time/index.js.map +1 -1
- package/dist/transforms/TransformCache.d.ts +1 -1
- package/dist/transforms/TransformCache.js +1 -1
- package/dist/transforms/conversions.d.ts +2 -2
- package/dist/transforms/conversions.js +2 -2
- package/dist/transforms/conversions.js.map +1 -1
- package/dist/transforms/index.d.ts +2 -2
- package/dist/transforms/index.js +2 -2
- package/dist/transforms/index.js.map +1 -1
- package/dist/transforms/transforms.d.ts +1 -1
- package/dist/transforms/transforms.js +1 -1
- package/dist/transforms/transforms.js.map +1 -1
- package/dist/types/types.d.ts +8 -3
- package/dist/types/types.js +6 -1
- package/dist/types/types.js.map +1 -1
- package/dist/utils/constants.d.ts +2 -2
- package/dist/utils/constants.js +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/create-covariance-from-tle.d.ts +1 -1
- package/dist/utils/create-covariance-from-tle.js +1 -1
- package/dist/utils/create-covariance-from-tle.js.map +1 -1
- package/dist/utils/functions.d.ts +4 -4
- package/dist/utils/functions.js +9 -4
- package/dist/utils/functions.js.map +1 -1
- package/dist/utils/index.d.ts +5 -5
- package/dist/utils/index.js +5 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jacobian.d.ts +2 -2
- package/dist/utils/jacobian.js +1 -1
- package/dist/utils/jacobian.js.map +1 -1
- package/dist/utils/linearDistance.d.ts +1 -1
- package/docs/README.md +132 -0
- package/docs/getting-started.md +792 -0
- package/docs/lambert-satellite-integration-guide.md +766 -0
- package/docs/user-guide.md +1935 -0
- package/jest.config.mjs +28 -0
- package/package.json +3 -4
- package/src/body/Celestial.ts +2 -2
- package/src/body/Earth.ts +4 -4
- package/src/body/Moon.ts +7 -7
- package/src/body/NutationAngles.ts +2 -2
- package/src/body/PrecessionAngles.ts +2 -2
- package/src/body/Sun.ts +4 -4
- package/src/body/index.ts +6 -5
- package/src/conjunction/ConjunctionAssessment.ts +417 -0
- package/src/conjunction/ConjunctionEvent.ts +149 -0
- package/src/conjunction/ProbabilityOfCollision.ts +300 -0
- package/src/conjunction/index.ts +24 -0
- package/src/coordinate/ClassicalElements.ts +16 -11
- package/src/coordinate/EquinoctialElements.ts +7 -7
- package/src/coordinate/FormatTle.ts +2 -2
- package/src/coordinate/Geodetic.ts +8 -8
- package/src/coordinate/Hill.ts +4 -4
- package/src/coordinate/ITRF.ts +6 -6
- package/src/coordinate/J2000.ts +7 -7
- package/src/coordinate/RIC.ts +4 -4
- package/src/coordinate/RelativeState.ts +5 -5
- package/src/coordinate/StateVector.ts +8 -3
- package/src/coordinate/TEME.ts +6 -6
- package/src/coordinate/Tle.ts +9 -9
- package/src/coordinate/index.ts +13 -12
- package/src/coordinate/tle-format-data.ts +1 -1
- package/src/covariance/CovarianceSample.ts +13 -13
- package/src/covariance/StateCovariance.ts +2 -2
- package/src/covariance/index.ts +3 -2
- package/src/data/DataHandler.ts +6 -6
- package/src/data/values/Egm96Data.ts +3 -3
- package/src/data/values/HpAtmosphereData.ts +3 -3
- package/src/data/values/HpAtmosphereResult.ts +2 -2
- package/src/data/values/Iau1980Data.ts +2 -2
- package/src/data/values/LeapSecond.ts +1 -1
- package/src/data/values/LeapSecondData.ts +2 -2
- package/src/data/values/egm96.ts +2 -2
- package/src/data/values/hpAtmosphere.ts +2 -2
- package/src/data/values/iau1980.ts +2 -2
- package/src/enums/AngularDiameterMethod.ts +1 -1
- package/src/enums/AngularDistanceMethod.ts +1 -1
- package/src/enums/OrbitRegime.ts +1 -1
- package/src/enums/PassType.ts +1 -1
- package/src/enums/Sgp4OpsMode.ts +1 -1
- package/src/enums/index.ts +8 -7
- package/src/fetch/horizons-constants.ts +53 -0
- package/src/fetch/horizons-interfaces.ts +38 -0
- package/src/fetch/horizons.ts +300 -0
- package/src/force/AtmosphericDrag.ts +3 -3
- package/src/force/EarthGravity.ts +3 -3
- package/src/force/Force.ts +3 -5
- package/src/force/ForceModel.ts +9 -9
- package/src/force/Gravity.ts +3 -3
- package/src/force/SolarRadiationPressure.ts +4 -4
- package/src/force/ThirdBodyGravity.ts +3 -3
- package/src/force/Thrust.ts +3 -3
- package/src/force/index.ts +2 -1
- package/src/interfaces/BaseObjectParams.ts +2 -2
- package/src/interfaces/ClassicalElementsParams.ts +2 -2
- package/src/interfaces/EquinoctialElementsParams.ts +2 -2
- package/src/interfaces/GroundPositionParams.ts +2 -2
- package/src/interfaces/RfSensorParams.ts +2 -2
- package/src/interfaces/SatelliteParams.ts +2 -2
- package/src/interfaces/SensorParams.ts +3 -3
- package/src/interfaces/StarObjectParams.ts +1 -1
- package/src/interfaces/TimeVariables.ts +1 -1
- package/src/interfaces/index.ts +10 -9
- package/src/interpolator/ChebyshevCoefficients.ts +2 -2
- package/src/interpolator/ChebyshevInterpolator.ts +4 -4
- package/src/interpolator/CubicSpline.ts +2 -2
- package/src/interpolator/CubicSplineInterpolator.ts +4 -4
- package/src/interpolator/FieldInterpolator.ts +3 -5
- package/src/interpolator/Interpolator.ts +2 -2
- package/src/interpolator/LagrangeInterpolator.ts +3 -3
- package/src/interpolator/StateInterpolator.ts +4 -6
- package/src/interpolator/VerletBlendInterpolator.ts +5 -5
- package/src/main.ts +41 -20
- package/src/maneuver/TwoBurnOrbitTransfer.ts +3 -3
- package/src/maneuver/Waypoint.ts +8 -8
- package/src/objects/BaseObject.ts +3 -3
- package/src/objects/DetailedSatellite.ts +9 -9
- package/src/objects/DetailedSensor.ts +5 -5
- package/src/objects/GroundObject.ts +9 -9
- package/src/objects/LandObject.ts +3 -3
- package/src/objects/Marker.ts +2 -2
- package/src/objects/RfSensor.ts +2 -2
- package/src/objects/Satellite.ts +21 -21
- package/src/objects/Sensor.ts +7 -7
- package/src/objects/Star.ts +3 -3
- package/src/objects/index.ts +11 -10
- package/src/observation/Observation.ts +11 -23
- package/src/observation/ObservationOptical.ts +7 -7
- package/src/observation/ObservationRadar.ts +7 -7
- package/src/observation/ObservationUtils.ts +2 -2
- package/src/observation/PropagatorPairs.ts +2 -2
- package/src/observation/RAE.ts +9 -9
- package/src/observation/RadecGeocentric.ts +9 -9
- package/src/observation/RadecTopocentric.ts +13 -10
- package/src/observation/index.ts +6 -5
- package/src/operations/BoxMuller.ts +2 -2
- package/src/operations/EulerAngles.ts +2 -2
- package/src/operations/Matrix.ts +2 -2
- package/src/operations/Quaternion.ts +2 -2
- package/src/operations/Random.ts +1 -1
- package/src/operations/RandomGaussianSource.ts +3 -3
- package/src/operations/Vector.ts +2 -2
- package/src/operations/Vector3D.ts +6 -4
- package/src/operations/index.ts +5 -4
- package/src/operations/operations.ts +6 -5
- package/src/optimize/ChebyshevCompressor.ts +5 -5
- package/src/optimize/DownhillSimplex.ts +2 -2
- package/src/optimize/GoldenSection.ts +2 -2
- package/src/optimize/PolynomialRegression.ts +4 -4
- package/src/optimize/PolynomicalRegressionResult.ts +1 -1
- package/src/optimize/SimpleLinearRegression.ts +1 -1
- package/src/optimize/SimplexEntry.ts +2 -2
- package/src/orbit_determination/BatchLeastSquaresOD.ts +10 -10
- package/src/orbit_determination/BatchLeastSquaresResult.ts +3 -3
- package/src/orbit_determination/GaussIOD.ts +393 -0
- package/src/orbit_determination/GibbsIOD.ts +4 -4
- package/src/orbit_determination/GoodingIOD.ts +458 -160
- package/src/orbit_determination/HerrickGibbsIOD.ts +2 -2
- package/src/orbit_determination/LambertIOD.ts +2 -2
- package/src/orbit_determination/ModifiedGoodingIOD.ts +33 -22
- package/src/orbit_determination/index.ts +8 -7
- package/src/propagator/DormandPrince54Propagator.ts +2 -2
- package/src/propagator/KeplerPropagator.ts +7 -8
- package/src/propagator/Propagator.ts +6 -6
- package/src/propagator/RkCheckpoint.ts +2 -2
- package/src/propagator/RkResult.ts +2 -2
- package/src/propagator/RungeKutta4Propagator.ts +6 -6
- package/src/propagator/RungeKutta89Propagator.ts +2 -2
- package/src/propagator/RungeKuttaAdaptive.ts +62 -12
- package/src/propagator/Sgp4Propagator.ts +7 -7
- package/src/propagator/index.ts +4 -3
- package/src/sgp4/index.ts +3 -2
- package/src/sgp4/sgp4.ts +6 -6
- package/src/smoothing/ExponentialSmoothing.ts +2 -2
- package/src/time/Epoch.ts +3 -3
- package/src/time/EpochGPS.ts +5 -5
- package/src/time/EpochTAI.ts +2 -2
- package/src/time/EpochTDB.ts +2 -2
- package/src/time/EpochTT.ts +2 -2
- package/src/time/EpochUTC.ts +10 -10
- package/src/time/EpochWindow.ts +2 -2
- package/src/time/TimeStamped.ts +2 -2
- package/src/time/index.ts +9 -8
- package/src/transforms/TransformCache.ts +1 -1
- package/src/transforms/conversions.ts +2 -2
- package/src/transforms/index.ts +3 -2
- package/src/transforms/transforms.ts +4 -4
- package/src/types/types.ts +8 -3
- package/src/utils/constants.ts +2 -2
- package/src/utils/create-covariance-from-tle.ts +1 -1
- package/src/utils/functions.ts +10 -5
- package/src/utils/index.ts +6 -5
- package/src/utils/jacobian.ts +2 -2
- package/src/utils/linearDistance.ts +1 -1
|
@@ -0,0 +1,792 @@
|
|
|
1
|
+
# Getting Started with OOTK
|
|
2
|
+
|
|
3
|
+
Welcome to the Orbital Object Toolkit (OOTK)! This guide will help you get started with orbital mechanics programming, whether you're a beginner or an experienced developer new to this library.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [What is OOTK?](#what-is-ootk)
|
|
10
|
+
2. [Installation](#installation)
|
|
11
|
+
3. [Your First Satellite](#your-first-satellite)
|
|
12
|
+
4. [Understanding Coordinates](#understanding-coordinates)
|
|
13
|
+
5. [Working with Sensors](#working-with-sensors)
|
|
14
|
+
6. [Common Use Cases](#common-use-cases)
|
|
15
|
+
7. [Next Steps](#next-steps)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## What is OOTK?
|
|
20
|
+
|
|
21
|
+
OOTK (Orbital Object Toolkit) is a comprehensive library for orbital mechanics calculations in TypeScript/JavaScript. Think of it as your Swiss Army knife for:
|
|
22
|
+
|
|
23
|
+
- **Tracking satellites** from TLE data
|
|
24
|
+
- **Predicting satellite passes** over ground stations
|
|
25
|
+
- **Converting between coordinate systems** (latitude/longitude, ECI, ECF)
|
|
26
|
+
- **Calculating orbital parameters** (altitude, velocity, period)
|
|
27
|
+
- **Determining orbits from observations**
|
|
28
|
+
- **Planning orbital maneuvers**
|
|
29
|
+
|
|
30
|
+
### Who is this for?
|
|
31
|
+
|
|
32
|
+
- Web developers building satellite tracking applications
|
|
33
|
+
- Researchers doing orbital mechanics analysis
|
|
34
|
+
- Students learning astrodynamics
|
|
35
|
+
- Hobbyists interested in space and satellites
|
|
36
|
+
|
|
37
|
+
### What makes OOTK different?
|
|
38
|
+
|
|
39
|
+
- **Type-safe**: Uses TypeScript for catching errors at compile time
|
|
40
|
+
- **Unit types**: Prevents mixing degrees with radians, kilometers with meters
|
|
41
|
+
- **Browser-friendly**: Works in web browsers and Node.js
|
|
42
|
+
- **Comprehensive**: Everything from simple tracking to advanced orbit determination
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Installation
|
|
47
|
+
|
|
48
|
+
### Prerequisites
|
|
49
|
+
|
|
50
|
+
You'll need:
|
|
51
|
+
- **Node.js** (version 14 or higher)
|
|
52
|
+
- **npm** (comes with Node.js)
|
|
53
|
+
|
|
54
|
+
### Install OOTK
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install ootk
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Verify Installation
|
|
61
|
+
|
|
62
|
+
Create a test file `test.js`:
|
|
63
|
+
|
|
64
|
+
```javascript
|
|
65
|
+
import { Earth } from 'ootk';
|
|
66
|
+
console.log('Earth radius:', Earth.radiusMean, 'km');
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Run it:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
node test.js
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
You should see: `Earth radius: 6371 km`
|
|
76
|
+
|
|
77
|
+
### TypeScript Setup (Optional but Recommended)
|
|
78
|
+
|
|
79
|
+
If using TypeScript:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm install --save-dev typescript @types/node
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Create `tsconfig.json`:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"compilerOptions": {
|
|
90
|
+
"target": "ES2020",
|
|
91
|
+
"module": "ES2020",
|
|
92
|
+
"moduleResolution": "node",
|
|
93
|
+
"strict": true,
|
|
94
|
+
"esModuleInterop": true
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Your First Satellite
|
|
102
|
+
|
|
103
|
+
Let's track the International Space Station (ISS)!
|
|
104
|
+
|
|
105
|
+
### Step 1: Get TLE Data
|
|
106
|
+
|
|
107
|
+
TLE (Two-Line Element) sets describe a satellite's orbit. You can get them from:
|
|
108
|
+
- https://celestrak.org/
|
|
109
|
+
- https://www.space-track.org/
|
|
110
|
+
- https://api.keeptrack.space/
|
|
111
|
+
|
|
112
|
+
Example ISS TLE:
|
|
113
|
+
```
|
|
114
|
+
ISS (ZARYA)
|
|
115
|
+
1 25544U 98067A 24028.54545847 .00031576 00000-0 57240-3 0 9991
|
|
116
|
+
2 25544 51.6418 292.2590 0002595 167.5319 252.0460 15.49326324436741
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Step 2: Create a Satellite Object
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { Satellite, TleLine1, TleLine2 } from 'ootk';
|
|
123
|
+
|
|
124
|
+
// ISS TLE data
|
|
125
|
+
const tle1 = '1 25544U 98067A 24028.54545847 .00031576 00000-0 57240-3 0 9991' as TleLine1;
|
|
126
|
+
const tle2 = '2 25544 51.6418 292.2590 0002595 167.5319 252.0460 15.49326324436741' as TleLine2;
|
|
127
|
+
|
|
128
|
+
// Create satellite object
|
|
129
|
+
const iss = new Satellite({ tle1, tle2 });
|
|
130
|
+
|
|
131
|
+
console.log('ISS created successfully!');
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Step 3: Get Current Position
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// Get position now
|
|
138
|
+
const eci = iss.eci();
|
|
139
|
+
|
|
140
|
+
console.log('Position (ECI):');
|
|
141
|
+
console.log(' X:', eci.position.x, 'km');
|
|
142
|
+
console.log(' Y:', eci.position.y, 'km');
|
|
143
|
+
console.log(' Z:', eci.position.z, 'km');
|
|
144
|
+
|
|
145
|
+
console.log('Velocity (ECI):');
|
|
146
|
+
console.log(' X:', eci.velocity.x, 'km/s');
|
|
147
|
+
console.log(' Y:', eci.velocity.y, 'km/s');
|
|
148
|
+
console.log(' Z:', eci.velocity.z, 'km/s');
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Output Example:**
|
|
152
|
+
```
|
|
153
|
+
Position (ECI):
|
|
154
|
+
X: 3590.123 km
|
|
155
|
+
Y: -5234.789 km
|
|
156
|
+
Z: 2100.456 km
|
|
157
|
+
Velocity (ECI):
|
|
158
|
+
X: 4.567 km/s
|
|
159
|
+
Y: 3.210 km/s
|
|
160
|
+
Z: 5.432 km/s
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Step 4: Get Latitude/Longitude
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
const lla = iss.lla();
|
|
167
|
+
|
|
168
|
+
console.log('Latitude:', lla.lat, '°');
|
|
169
|
+
console.log('Longitude:', lla.lon, '°');
|
|
170
|
+
console.log('Altitude:', lla.alt, 'km');
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Output Example:**
|
|
174
|
+
```
|
|
175
|
+
Latitude: 23.456 °
|
|
176
|
+
Longitude: -45.678 °
|
|
177
|
+
Altitude: 418.234 km
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Step 5: Get Orbital Parameters
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
console.log('Orbital Parameters:');
|
|
184
|
+
console.log(' Inclination:', iss.inclination, '°');
|
|
185
|
+
console.log(' Eccentricity:', iss.eccentricity);
|
|
186
|
+
console.log(' Period:', iss.period, 'minutes');
|
|
187
|
+
console.log(' Apogee:', iss.apogee, 'km');
|
|
188
|
+
console.log(' Perigee:', iss.perigee, 'km');
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**Congratulations!** You've just tracked your first satellite with OOTK!
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Understanding Coordinates
|
|
196
|
+
|
|
197
|
+
OOTK uses several coordinate systems. Here's a simple explanation:
|
|
198
|
+
|
|
199
|
+
### 1. Geodetic (Latitude/Longitude/Altitude)
|
|
200
|
+
|
|
201
|
+
**What**: The coordinates you're familiar with from maps.
|
|
202
|
+
|
|
203
|
+
**When to use**: Displaying positions on a map, human-readable locations.
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
const lla = iss.lla();
|
|
207
|
+
// { lat: 23.456°, lon: -45.678°, alt: 418 km }
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 2. ECI (Earth-Centered Inertial)
|
|
211
|
+
|
|
212
|
+
**What**: X, Y, Z coordinates in a non-rotating reference frame.
|
|
213
|
+
|
|
214
|
+
**When to use**: Physics calculations, propagating orbits.
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
const eci = iss.eci();
|
|
218
|
+
// { position: {x, y, z}, velocity: {x, y, z} }
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 3. ECF (Earth-Centered Fixed)
|
|
222
|
+
|
|
223
|
+
**What**: X, Y, Z coordinates that rotate with Earth.
|
|
224
|
+
|
|
225
|
+
**When to use**: Ground station calculations, terrain modeling.
|
|
226
|
+
|
|
227
|
+
```typescript
|
|
228
|
+
const ecf = iss.ecf();
|
|
229
|
+
// { position: {x, y, z}, velocity: {x, y, z} }
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Quick Conversions
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// Satellite gives you all of them:
|
|
236
|
+
const lla = satellite.lla(); // Geodetic
|
|
237
|
+
const eci = satellite.eci(); // ECI
|
|
238
|
+
const ecf = satellite.ecf(); // ECF
|
|
239
|
+
const j2000 = satellite.toJ2000(); // J2000 (specific ECI frame)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Working with Sensors
|
|
245
|
+
|
|
246
|
+
A "sensor" in OOTK is a ground station or observation point that tracks satellites.
|
|
247
|
+
|
|
248
|
+
### Create a Sensor
|
|
249
|
+
|
|
250
|
+
Let's create a sensor for Cape Cod:
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
import { Sensor, Degrees, Kilometers } from 'ootk';
|
|
254
|
+
|
|
255
|
+
const capeCod = new Sensor({
|
|
256
|
+
lat: 41.754785 as Degrees,
|
|
257
|
+
lon: -70.539151 as Degrees,
|
|
258
|
+
alt: 0.060966 as Kilometers,
|
|
259
|
+
minEl: 5 as Degrees, // Don't track below 5° elevation
|
|
260
|
+
maxEl: 85 as Degrees, // Don't track above 85°
|
|
261
|
+
minRng: 0 as Kilometers,
|
|
262
|
+
maxRng: 5000 as Kilometers // Maximum tracking range
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Note**: The `as Degrees` and `as Kilometers` are TypeScript type casts that ensure you're using the right units.
|
|
267
|
+
|
|
268
|
+
### Calculate Look Angles
|
|
269
|
+
|
|
270
|
+
Get Range, Azimuth, Elevation from sensor to satellite:
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
const rae = capeCod.rae(iss);
|
|
274
|
+
|
|
275
|
+
console.log('Range:', rae.rng, 'km');
|
|
276
|
+
console.log('Azimuth:', rae.az, '° (0=North, 90=East)');
|
|
277
|
+
console.log('Elevation:', rae.el, '° (0=horizon, 90=zenith)');
|
|
278
|
+
console.log('Range Rate:', rae.rngRate, 'km/s');
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Interpretation**:
|
|
282
|
+
- **Range**: Distance to satellite
|
|
283
|
+
- **Azimuth**: Which direction to point (compass heading)
|
|
284
|
+
- **Elevation**: How high to look up
|
|
285
|
+
- **Range Rate**: How fast distance is changing (negative = approaching)
|
|
286
|
+
|
|
287
|
+
### Check Visibility
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
const isVisible = capeCod.isSatInFov(iss);
|
|
291
|
+
|
|
292
|
+
if (isVisible) {
|
|
293
|
+
console.log('ISS is currently visible from Cape Cod!');
|
|
294
|
+
const rae = capeCod.rae(iss);
|
|
295
|
+
console.log('Look', rae.az.toFixed(1), '° at', rae.el.toFixed(1), '° elevation');
|
|
296
|
+
} else {
|
|
297
|
+
console.log('ISS is not visible right now.');
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Predict Passes
|
|
302
|
+
|
|
303
|
+
Find when satellite will be visible:
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
// Calculate passes over next 24 hours, checking every 10 seconds
|
|
307
|
+
const passes = capeCod.calculatePasses(10, iss, {
|
|
308
|
+
startDate: new Date(),
|
|
309
|
+
lengthDays: 1
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
console.log(`Found ${passes.length} passes in the next 24 hours:`);
|
|
313
|
+
|
|
314
|
+
passes.forEach((pass, index) => {
|
|
315
|
+
console.log(`\nPass ${index + 1}:`);
|
|
316
|
+
console.log(' Rise:', pass.rise.toLocaleString());
|
|
317
|
+
console.log(' Peak:', pass.culmination.toLocaleString());
|
|
318
|
+
console.log(' Set:', pass.set.toLocaleString());
|
|
319
|
+
console.log(' Max Elevation:', pass.maxEl.toFixed(1), '°');
|
|
320
|
+
console.log(' Duration:', (pass.duration / 60).toFixed(1), 'minutes');
|
|
321
|
+
});
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
**Output Example**:
|
|
325
|
+
```
|
|
326
|
+
Found 3 passes in the next 24 hours:
|
|
327
|
+
|
|
328
|
+
Pass 1:
|
|
329
|
+
Rise: 1/28/2024, 6:23:45 PM
|
|
330
|
+
Peak: 1/28/2024, 6:28:12 PM
|
|
331
|
+
Set: 1/28/2024, 6:32:51 PM
|
|
332
|
+
Max Elevation: 45.3 °
|
|
333
|
+
Duration: 9.1 minutes
|
|
334
|
+
|
|
335
|
+
Pass 2:
|
|
336
|
+
Rise: 1/28/2024, 8:01:23 PM
|
|
337
|
+
Peak: 1/28/2024, 8:05:45 PM
|
|
338
|
+
Set: 1/28/2024, 8:10:12 PM
|
|
339
|
+
Max Elevation: 78.6 °
|
|
340
|
+
Duration: 8.8 minutes
|
|
341
|
+
...
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Common Use Cases
|
|
347
|
+
|
|
348
|
+
### 1. Real-Time Satellite Tracker
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
import { Satellite, TleLine1, TleLine2 } from 'ootk';
|
|
352
|
+
|
|
353
|
+
class SatelliteTracker {
|
|
354
|
+
private satellite: Satellite;
|
|
355
|
+
|
|
356
|
+
constructor(tle1: TleLine1, tle2: TleLine2) {
|
|
357
|
+
this.satellite = new Satellite({ tle1, tle2 });
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
getCurrentPosition() {
|
|
361
|
+
const lla = this.satellite.lla();
|
|
362
|
+
return {
|
|
363
|
+
latitude: lla.lat,
|
|
364
|
+
longitude: lla.lon,
|
|
365
|
+
altitude: lla.alt
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
getVelocity() {
|
|
370
|
+
const eci = this.satellite.eci();
|
|
371
|
+
const speed = Math.sqrt(
|
|
372
|
+
eci.velocity.x ** 2 +
|
|
373
|
+
eci.velocity.y ** 2 +
|
|
374
|
+
eci.velocity.z ** 2
|
|
375
|
+
);
|
|
376
|
+
return speed; // km/s
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// Usage
|
|
381
|
+
const tracker = new SatelliteTracker(tle1, tle2);
|
|
382
|
+
|
|
383
|
+
setInterval(() => {
|
|
384
|
+
const pos = tracker.getCurrentPosition();
|
|
385
|
+
const speed = tracker.getVelocity();
|
|
386
|
+
|
|
387
|
+
console.log(
|
|
388
|
+
`Lat: ${pos.latitude.toFixed(2)}°, ` +
|
|
389
|
+
`Lon: ${pos.longitude.toFixed(2)}°, ` +
|
|
390
|
+
`Alt: ${pos.altitude.toFixed(1)} km, ` +
|
|
391
|
+
`Speed: ${speed.toFixed(2)} km/s`
|
|
392
|
+
);
|
|
393
|
+
}, 1000); // Update every second
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### 2. Ground Station Pass Predictor
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
import { Sensor, Satellite, Degrees, Kilometers } from 'ootk';
|
|
400
|
+
|
|
401
|
+
function predictPasses(
|
|
402
|
+
sensorLat: number,
|
|
403
|
+
sensorLon: number,
|
|
404
|
+
sensorAlt: number,
|
|
405
|
+
tle1: TleLine1,
|
|
406
|
+
tle2: TleLine2,
|
|
407
|
+
days: number = 7
|
|
408
|
+
) {
|
|
409
|
+
const sensor = new Sensor({
|
|
410
|
+
lat: sensorLat as Degrees,
|
|
411
|
+
lon: sensorLon as Degrees,
|
|
412
|
+
alt: sensorAlt as Kilometers,
|
|
413
|
+
minEl: 10 as Degrees, // Only show passes above 10°
|
|
414
|
+
maxEl: 90 as Degrees,
|
|
415
|
+
minRng: 0 as Kilometers,
|
|
416
|
+
maxRng: 5000 as Kilometers
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
const satellite = new Satellite({ tle1, tle2 });
|
|
420
|
+
|
|
421
|
+
const passes = sensor.calculatePasses(30, satellite, {
|
|
422
|
+
startDate: new Date(),
|
|
423
|
+
lengthDays: days
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
return passes.map(pass => ({
|
|
427
|
+
riseTime: pass.rise,
|
|
428
|
+
setTime: pass.set,
|
|
429
|
+
peakTime: pass.culmination,
|
|
430
|
+
maxElevation: pass.maxEl,
|
|
431
|
+
durationMinutes: pass.duration / 60
|
|
432
|
+
}));
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Usage
|
|
436
|
+
const myPasses = predictPasses(
|
|
437
|
+
40.7128, // New York City latitude
|
|
438
|
+
-74.0060, // longitude
|
|
439
|
+
0.010, // altitude (km)
|
|
440
|
+
isstle1,
|
|
441
|
+
isstle2,
|
|
442
|
+
7 // next 7 days
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
console.log('Upcoming passes:', myPasses);
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 3. Multi-Satellite Tracker
|
|
449
|
+
|
|
450
|
+
```typescript
|
|
451
|
+
class MultiSatelliteTracker {
|
|
452
|
+
private satellites: Map<string, Satellite> = new Map();
|
|
453
|
+
|
|
454
|
+
addSatellite(name: string, tle1: TleLine1, tle2: TleLine2) {
|
|
455
|
+
this.satellites.set(name, new Satellite({ tle1, tle2 }));
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
getAllPositions() {
|
|
459
|
+
const positions = {};
|
|
460
|
+
this.satellites.forEach((sat, name) => {
|
|
461
|
+
const lla = sat.lla();
|
|
462
|
+
positions[name] = {
|
|
463
|
+
lat: lla.lat,
|
|
464
|
+
lon: lla.lon,
|
|
465
|
+
alt: lla.alt
|
|
466
|
+
};
|
|
467
|
+
});
|
|
468
|
+
return positions;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
findVisible(sensorLat: number, sensorLon: number) {
|
|
472
|
+
const sensor = new Sensor({
|
|
473
|
+
lat: sensorLat as Degrees,
|
|
474
|
+
lon: sensorLon as Degrees,
|
|
475
|
+
alt: 0 as Kilometers,
|
|
476
|
+
minEl: 5 as Degrees,
|
|
477
|
+
maxEl: 85 as Degrees,
|
|
478
|
+
minRng: 0 as Kilometers,
|
|
479
|
+
maxRng: 5000 as Kilometers
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
const visible = [];
|
|
483
|
+
this.satellites.forEach((sat, name) => {
|
|
484
|
+
if (sensor.isSatInFov(sat)) {
|
|
485
|
+
const rae = sensor.rae(sat);
|
|
486
|
+
visible.push({
|
|
487
|
+
name,
|
|
488
|
+
azimuth: rae.az,
|
|
489
|
+
elevation: rae.el,
|
|
490
|
+
range: rae.rng
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
return visible;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// Usage
|
|
500
|
+
const tracker = new MultiSatelliteTracker();
|
|
501
|
+
tracker.addSatellite('ISS', isstle1, isstle2);
|
|
502
|
+
tracker.addSatellite('HUBBLE', hubbleTle1, hubbleTle2);
|
|
503
|
+
tracker.addSatellite('GPS-1', gpsTle1, gpsTle2);
|
|
504
|
+
|
|
505
|
+
// Get all positions
|
|
506
|
+
const allPositions = tracker.getAllPositions();
|
|
507
|
+
console.log(allPositions);
|
|
508
|
+
|
|
509
|
+
// Find what's visible from your location
|
|
510
|
+
const visibleSats = tracker.findVisible(40.7128, -74.0060);
|
|
511
|
+
console.log('Currently visible:', visibleSats);
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### 4. Satellite Position at Specific Time
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
import { Satellite, EpochUTC } from 'ootk';
|
|
518
|
+
|
|
519
|
+
const satellite = new Satellite({ tle1, tle2 });
|
|
520
|
+
|
|
521
|
+
// Position at a specific time
|
|
522
|
+
const specificDate = new Date('2024-12-31T00:00:00Z');
|
|
523
|
+
const eci = satellite.eci(specificDate);
|
|
524
|
+
const lla = satellite.lla(specificDate);
|
|
525
|
+
|
|
526
|
+
console.log('Position on New Year 2024:');
|
|
527
|
+
console.log(' Lat:', lla.lat, '°');
|
|
528
|
+
console.log(' Lon:', lla.lon, '°');
|
|
529
|
+
console.log(' Alt:', lla.alt, 'km');
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 5. Calculate Orbit Period
|
|
533
|
+
|
|
534
|
+
```typescript
|
|
535
|
+
function analyzeSatellite(tle1: TleLine1, tle2: TleLine2) {
|
|
536
|
+
const sat = new Satellite({ tle1, tle2 });
|
|
537
|
+
|
|
538
|
+
console.log('Orbital Analysis:');
|
|
539
|
+
console.log(' Period:', sat.period.toFixed(2), 'minutes');
|
|
540
|
+
console.log(' Apogee:', sat.apogee.toFixed(1), 'km');
|
|
541
|
+
console.log(' Perigee:', sat.perigee.toFixed(1), 'km');
|
|
542
|
+
console.log(' Inclination:', sat.inclination.toFixed(2), '°');
|
|
543
|
+
console.log(' Eccentricity:', sat.eccentricity.toFixed(6));
|
|
544
|
+
|
|
545
|
+
// Classify orbit
|
|
546
|
+
const avgAlt = (sat.apogee + sat.perigee) / 2;
|
|
547
|
+
let orbitType;
|
|
548
|
+
if (avgAlt < 2000) orbitType = 'LEO (Low Earth Orbit)';
|
|
549
|
+
else if (avgAlt < 35786) orbitType = 'MEO (Medium Earth Orbit)';
|
|
550
|
+
else if (Math.abs(avgAlt - 35786) < 100) orbitType = 'GEO (Geostationary)';
|
|
551
|
+
else orbitType = 'HEO (High Earth Orbit)';
|
|
552
|
+
|
|
553
|
+
console.log(' Classification:', orbitType);
|
|
554
|
+
|
|
555
|
+
// Orbits per day
|
|
556
|
+
const orbitsPerDay = (24 * 60) / sat.period;
|
|
557
|
+
console.log(' Orbits per day:', orbitsPerDay.toFixed(2));
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
analyzeSatellite(isstle1, isstle2);
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
## Next Steps
|
|
566
|
+
|
|
567
|
+
### Beginner Level
|
|
568
|
+
|
|
569
|
+
Now that you understand the basics:
|
|
570
|
+
|
|
571
|
+
1. **Try different satellites**: Get TLEs from https://celestrak.org/
|
|
572
|
+
2. **Change sensor locations**: Track from your city
|
|
573
|
+
3. **Experiment with times**: Look at positions in the past or future
|
|
574
|
+
4. **Build a web interface**: Display positions on a map
|
|
575
|
+
|
|
576
|
+
### Intermediate Level
|
|
577
|
+
|
|
578
|
+
Ready for more? Explore:
|
|
579
|
+
|
|
580
|
+
1. **Different propagators**: Try `RungeKutta4Propagator` for higher accuracy
|
|
581
|
+
2. **Coordinate transformations**: Convert between J2000, TEME, ITRF
|
|
582
|
+
3. **Time systems**: Work with UTC, GPS time, Julian dates
|
|
583
|
+
4. **Force models**: Add gravity harmonics, drag, solar radiation pressure
|
|
584
|
+
|
|
585
|
+
See the [User Guide](./user-guide.md) sections:
|
|
586
|
+
- [Orbit Propagation](./user-guide.md#orbit-propagation)
|
|
587
|
+
- [Coordinate Systems](./user-guide.md#coordinate-systems)
|
|
588
|
+
- [Time Systems](./user-guide.md#time-systems)
|
|
589
|
+
|
|
590
|
+
### Advanced Level
|
|
591
|
+
|
|
592
|
+
For advanced orbital mechanics:
|
|
593
|
+
|
|
594
|
+
1. **Initial Orbit Determination**: Determine orbits from observations
|
|
595
|
+
2. **Maneuver Planning**: Calculate delta-v for orbit changes
|
|
596
|
+
3. **Covariance Propagation**: Track uncertainty in orbits
|
|
597
|
+
4. **Custom Propagators**: Create your own propagation methods
|
|
598
|
+
|
|
599
|
+
See the [User Guide](./user-guide.md) sections:
|
|
600
|
+
- [Initial Orbit Determination](./user-guide.md#initial-orbit-determination)
|
|
601
|
+
- [Maneuvers](./user-guide.md#maneuvers)
|
|
602
|
+
- [Force Models](./user-guide.md#force-models)
|
|
603
|
+
- [Advanced Topics](./user-guide.md#advanced-topics)
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
## Troubleshooting
|
|
608
|
+
|
|
609
|
+
### Common Issues
|
|
610
|
+
|
|
611
|
+
#### 1. "Cannot find module 'ootk'"
|
|
612
|
+
|
|
613
|
+
**Problem**: Import error
|
|
614
|
+
|
|
615
|
+
**Solution**: Make sure you've installed OOTK:
|
|
616
|
+
```bash
|
|
617
|
+
npm install ootk
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
And that your `package.json` has `"type": "module"` for ES modules.
|
|
621
|
+
|
|
622
|
+
#### 2. Type errors with numbers
|
|
623
|
+
|
|
624
|
+
**Problem**: TypeScript complains about number types
|
|
625
|
+
|
|
626
|
+
**Solution**: Cast to appropriate types:
|
|
627
|
+
```typescript
|
|
628
|
+
// Wrong
|
|
629
|
+
const lat = 41.7;
|
|
630
|
+
|
|
631
|
+
// Correct
|
|
632
|
+
const lat = 41.7 as Degrees;
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
#### 3. Satellite position seems wrong
|
|
636
|
+
|
|
637
|
+
**Problem**: Position doesn't match expected values
|
|
638
|
+
|
|
639
|
+
**Solutions**:
|
|
640
|
+
- Check TLE is current (TLEs expire quickly, especially for LEO)
|
|
641
|
+
- Verify the time (use `new Date()` for current time)
|
|
642
|
+
- Ensure TLE lines are correct (no extra spaces or truncation)
|
|
643
|
+
|
|
644
|
+
#### 4. No passes found
|
|
645
|
+
|
|
646
|
+
**Problem**: `calculatePasses()` returns empty array
|
|
647
|
+
|
|
648
|
+
**Solutions**:
|
|
649
|
+
- Increase `lengthDays` parameter (satellite may not pass for several days)
|
|
650
|
+
- Lower `minEl` on sensor (try 0 degrees)
|
|
651
|
+
- Increase `maxRng` on sensor
|
|
652
|
+
- Check satellite orbit (geostationary satellites don't "pass")
|
|
653
|
+
|
|
654
|
+
### Getting Help
|
|
655
|
+
|
|
656
|
+
- **Documentation**: See [User Guide](./user-guide.md)
|
|
657
|
+
- **Examples**: Check `/examples` folder in repository
|
|
658
|
+
- **Issues**: https://github.com/thkruz/ootk/issues
|
|
659
|
+
- **Discussions**: https://github.com/thkruz/ootk/discussions
|
|
660
|
+
|
|
661
|
+
---
|
|
662
|
+
|
|
663
|
+
## Quick Reference
|
|
664
|
+
|
|
665
|
+
### Essential Imports
|
|
666
|
+
|
|
667
|
+
```typescript
|
|
668
|
+
// Basic tracking
|
|
669
|
+
import { Satellite, TleLine1, TleLine2 } from 'ootk';
|
|
670
|
+
|
|
671
|
+
// Sensors
|
|
672
|
+
import { Sensor, Degrees, Kilometers } from 'ootk';
|
|
673
|
+
|
|
674
|
+
// Advanced
|
|
675
|
+
import {
|
|
676
|
+
Satellite,
|
|
677
|
+
Sensor,
|
|
678
|
+
EpochUTC,
|
|
679
|
+
J2000,
|
|
680
|
+
ClassicalElements,
|
|
681
|
+
RungeKutta4Propagator,
|
|
682
|
+
ForceModel
|
|
683
|
+
} from 'ootk';
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
### Common Patterns
|
|
687
|
+
|
|
688
|
+
```typescript
|
|
689
|
+
// Create satellite
|
|
690
|
+
const sat = new Satellite({ tle1, tle2 });
|
|
691
|
+
|
|
692
|
+
// Get position now
|
|
693
|
+
const lla = sat.lla();
|
|
694
|
+
const eci = sat.eci();
|
|
695
|
+
|
|
696
|
+
// Get position at specific time
|
|
697
|
+
const date = new Date('2024-12-31T00:00:00Z');
|
|
698
|
+
const llaFuture = sat.lla(date);
|
|
699
|
+
|
|
700
|
+
// Create sensor
|
|
701
|
+
const sensor = new Sensor({
|
|
702
|
+
lat: latitude as Degrees,
|
|
703
|
+
lon: longitude as Degrees,
|
|
704
|
+
alt: altitude as Kilometers,
|
|
705
|
+
minEl: 5 as Degrees,
|
|
706
|
+
maxEl: 85 as Degrees,
|
|
707
|
+
minRng: 0 as Kilometers,
|
|
708
|
+
maxRng: 5000 as Kilometers
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
// Check visibility
|
|
712
|
+
const visible = sensor.isSatInFov(sat);
|
|
713
|
+
|
|
714
|
+
// Get look angles
|
|
715
|
+
const rae = sensor.rae(sat);
|
|
716
|
+
|
|
717
|
+
// Find passes
|
|
718
|
+
const passes = sensor.calculatePasses(30, sat, {
|
|
719
|
+
startDate: new Date(),
|
|
720
|
+
lengthDays: 7
|
|
721
|
+
});
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
---
|
|
725
|
+
|
|
726
|
+
## Example Projects to Build
|
|
727
|
+
|
|
728
|
+
### 1. ISS Notifier
|
|
729
|
+
Build a program that alerts you when the ISS will pass overhead.
|
|
730
|
+
|
|
731
|
+
**Skills**: Satellite tracking, pass prediction, notifications
|
|
732
|
+
|
|
733
|
+
### 2. Satellite Constellation Visualizer
|
|
734
|
+
Display multiple satellites on a map in real-time.
|
|
735
|
+
|
|
736
|
+
**Skills**: Multi-satellite tracking, web development, visualization
|
|
737
|
+
|
|
738
|
+
### 3. Ground Station Planner
|
|
739
|
+
Determine the best location for a ground station to maximize satellite contact time.
|
|
740
|
+
|
|
741
|
+
**Skills**: Sensor placement, pass analysis, optimization
|
|
742
|
+
|
|
743
|
+
### 4. Orbit Comparator
|
|
744
|
+
Compare different satellites' orbits and find close approaches.
|
|
745
|
+
|
|
746
|
+
**Skills**: Coordinate transformations, distance calculations
|
|
747
|
+
|
|
748
|
+
### 5. TLE Age Checker
|
|
749
|
+
Monitor a catalog of TLEs and alert when they're getting old.
|
|
750
|
+
|
|
751
|
+
**Skills**: TLE parsing, date handling, automation
|
|
752
|
+
|
|
753
|
+
---
|
|
754
|
+
|
|
755
|
+
## Resources
|
|
756
|
+
|
|
757
|
+
### Where to Get TLE Data
|
|
758
|
+
|
|
759
|
+
- **CelesTrak**: https://celestrak.org/ (free, no account needed)
|
|
760
|
+
- **Space-Track**: https://www.space-track.org/ (free account required)
|
|
761
|
+
- **KeepTrack API**: https://api.keeptrack.space/ (simple REST API)
|
|
762
|
+
|
|
763
|
+
### Learning More
|
|
764
|
+
|
|
765
|
+
- **Orbital Mechanics**: "Fundamentals of Astrodynamics" by Bate, Mueller, White
|
|
766
|
+
- **SGP4**: "Revisiting Spacetrack Report #3" by Vallado et al.
|
|
767
|
+
- **OOTK Repository**: https://github.com/thkruz/ootk
|
|
768
|
+
- **Full Documentation**: [User Guide](./user-guide.md)
|
|
769
|
+
|
|
770
|
+
### Related Projects
|
|
771
|
+
|
|
772
|
+
- **KeepTrack**: https://github.com/thkruz/keeptrack.space
|
|
773
|
+
- **satellite.js**: Alternative JavaScript satellite library
|
|
774
|
+
- **Skyfield**: Python satellite library
|
|
775
|
+
|
|
776
|
+
---
|
|
777
|
+
|
|
778
|
+
## Congratulations!
|
|
779
|
+
|
|
780
|
+
You're now ready to start building with OOTK. Start simple with satellite tracking, then explore more advanced features as you need them.
|
|
781
|
+
|
|
782
|
+
**Happy coding!**
|
|
783
|
+
|
|
784
|
+
If you build something cool with OOTK, consider sharing it with the community!
|
|
785
|
+
|
|
786
|
+
---
|
|
787
|
+
|
|
788
|
+
**License**: AGPL-3.0
|
|
789
|
+
|
|
790
|
+
**Version**: 5.1.1
|
|
791
|
+
|
|
792
|
+
**Last Updated**: January 2024
|