generated from ztimson/template
init
This commit is contained in:
+27
@@ -0,0 +1,27 @@
|
||||
Savage Benchmark (100 runs) Double Precision
|
||||
--------------------------------------------
|
||||
The first four are from [TS Kelso's System Benchmarking column](http://celestrak.com/columns/v02n04/)
|
||||
The Core i7 is Shashwat Kandadai's personal laptop
|
||||
```
|
||||
Value: Avg Time:
|
||||
386DX-33 2500.00000000117734 6.81 s 33 MHz : MS-DOS 6.20
|
||||
486DX2-66 " 1.26 s 66 MHz : Windows 95
|
||||
Pentium 90 " 0.55 s 90 MHz : Windows 95
|
||||
Pentium 133 " 0.38 s 133 MHz : Windows 95
|
||||
Core i7 2500.0000000025643 0.58 ms 2.0 GHz : Mac OS X
|
||||
```
|
||||
|
||||
|
||||
Full day propagation results (1440 propagations)
|
||||
-------------------------------------------------
|
||||
```
|
||||
Honeywell-6000 (from Space-Track Report #3)
|
||||
init ms prpgtion ms
|
||||
SGP4 1.9 2.5
|
||||
SDP4 5.1 3.6
|
||||
|
||||
Core i7 (Shashwat Kandadai's personal computer)
|
||||
init ms prpgtion ms
|
||||
SGP4 0.074 0.0017
|
||||
SDP4 0.092 0.0046
|
||||
```
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
# Changelog
|
||||
|
||||
## 6.0.2
|
||||
|
||||
- fix: `twoline2satrec` couldn't parse eccentricity padded with spaces instead of zeros
|
||||
(this only affects TLE generated by rare specialized software; see #153)
|
||||
|
||||
## 6.0.1 (2025-07-04)
|
||||
|
||||
- fix: `json2satrec` couldn't parse OMM `EPOCH` that was ending with Z
|
||||
- fix: `OMMJsonObject.REV_AT_EPOCH` is made optional according to OMM spec
|
||||
|
||||
## 6.0.0 (2025-04-06)
|
||||
|
||||
- chore: The library is rewritten to TypeScript and type definitions are now not hand-written
|
||||
but compiled from source code.
|
||||
- feature: New `json2satrec` function that allows parsing orbital elements in
|
||||
[OMM](https://www.nasa.gov/wp-content/uploads/2017/12/orbit_data_messages.pdf) format,
|
||||
**encoded as JSON**. Orbital elements in OMM format are already available for download
|
||||
from Celestrak and Space-Track. `json2satrec` supports both of these sources and aims
|
||||
to support all sources of properly formatted OMM data.
|
||||
|
||||
To obtain OMM as JSON from Celestrak, select "JSON" option at the top of "Current GP
|
||||
Element Sets" page or follow
|
||||
[this link](https://celestrak.org/NORAD/elements/index.php?FORMAT=json) where it will
|
||||
be already selected.
|
||||
|
||||
Space-Track doesn't expose the JSON format in their UI, so to get JSON encoded OMM,
|
||||
on "Recent ELSETs" page, from "Current Catalog Files", copy a URL for the needed category
|
||||
and change the ending part of the URL from `/format/xml` to be `/format/json`.
|
||||
- **BREAKING**: The return type of the `sgp4` and `propagate` functions is changed from:
|
||||
```ts
|
||||
{
|
||||
position: EciVec3<Kilometer> | false
|
||||
velocity: EciVec3<KilometerPerSecond> | false
|
||||
}
|
||||
```
|
||||
to:
|
||||
```ts
|
||||
null | {
|
||||
position: EciVec3<Kilometer>
|
||||
velocity: EciVec3<KilometerPerSecond>
|
||||
meanElements: MeanElements
|
||||
}
|
||||
```
|
||||
Where, if propagation failed, `null` is returned instead of individual keys set to `false`.
|
||||
- **BREAKING**: removed overloads of `gstime` and return types of `sgp4` and `propagate` that
|
||||
were not documented by TypeScript definitions as of v5.0.0, but could happen in runtime with v5.0.0.
|
||||
- feature: New `SatRecError` enum that lists all error codes that can be set on `SatRec.error`.
|
||||
- feature: `sgp4` and `propagate` function result object returns `meanElements` key,
|
||||
which is orbit parameters as they have evolved at the propagation moment. Since they are always
|
||||
internally calculated by SGP4 model, this doesn't impact performance.
|
||||
- feature: New `sunPos` function that calculates Sun position at date, useful to calculate if
|
||||
a satellite is in Earth umbra. Its accuracy is within 0.01 angular degree between years
|
||||
1950 and 2050.
|
||||
- feature: Many additional properties of `SatRec` are documented
|
||||
- fix: `dopplerFactor` produces correct results depending on if the satellite is moving
|
||||
towards or away from the observer.
|
||||
|
||||
## 5.0.0 (2023-01-06)
|
||||
|
||||
- Errors in calculations are fixed, WGS72 is used instead of WGS84 (#107).
|
||||
- Dependencies are upgraded.
|
||||
|
||||
## 4.1.4 (2022-07-18)
|
||||
|
||||
- TypeScript definition for `ecfToEci` function is added.
|
||||
|
||||
## 4.1.3 (2020-12-18)
|
||||
|
||||
- Fixed calculation of Doppler effect (`dopplerFactor`).
|
||||
|
||||
## 4.1.2 (2020-10-13)
|
||||
|
||||
- Expose `error` in TypeScript definition of `SatRec`.
|
||||
- Fix TypeScript definition for `PositionAndVelocity` to allow error handling.
|
||||
|
||||
## 4.1.1 (2020-09-15)
|
||||
|
||||
- Fix TypeScript definition for `gstime` (#73).
|
||||
- Fix documentation and TypeScript definition for `degreesLong` and `degreesLat` (#74).
|
||||
|
||||
## 4.1.0 (2020-09-14)
|
||||
|
||||
- TypeScript support is added via new TypeScript definitions file (#71).
|
||||
- Rollup and some other dependencies are upgraded.
|
||||
|
||||
## 4.0.0 (2020-01-21)
|
||||
|
||||
- Node.js 12 support is added. Node.js 6 and Node.js 8 support is dropped (breaking change).
|
||||
- Mocha, Chai and Istanbul are replaced by [Jest](https://jestjs.io/).
|
||||
- Dependencies are upgraded.
|
||||
|
||||
## 3.0.1 (2019-03-14)
|
||||
|
||||
- Unnecessary calculations in `sgp4` function are reduced (#47).
|
||||
- `vkmpersec` calculation is moved to constants (#50).
|
||||
- `degreesToRadians` function is used in docs instead of `deg2rad` constant (#53).
|
||||
- Typos' fixes (#54).
|
||||
|
||||
## 3.0.0 (2018-11-26)
|
||||
|
||||
- Node.js 4 support is dropped (breaking change).
|
||||
- Deprecated functions `gstimeFromJday` and `gstimeFromDate` are removed (breaking change).
|
||||
- New transformation functions are added: `radiansToDegrees`, `degreesToRadians`, `radiansLat`, `radiansLong`.
|
||||
|
||||
## 2.0.3 (2018-09-15)
|
||||
|
||||
- `satrec` object is not cloned in `sgp4` and `sgp4init` functions due to [performance reasons](https://github.com/shashwatak/satellite-js/issues/45).
|
||||
|
||||
## 2.0.2 (2018-04-16)
|
||||
|
||||
- [Wrong predictions for Molniya 3-47 orbits](https://github.com/shashwatak/satellite-js/issues/43) are fixed. Special thanks to [@nhamer](https://github.com/nhamer).
|
||||
|
||||
## 2.0.1 (2018-03-01)
|
||||
|
||||
- `sgp4` function's call result is used in `sgp4init`.
|
||||
- Longitude of `eciToGeodetic` result is in [-PI; PI] range now.
|
||||
|
||||
## 2.0.0 (2017-12-23)
|
||||
|
||||
- Library became ES and Common.js compatible.
|
||||
- Source code is reorganized to match [original Python library](https://pypi.python.org/pypi/sgp4/).
|
||||
- `degreesLat` and `degreesLong` don't adjust input radians value and throw `RangeError` if it's out of bounds (breaking change).
|
||||
- `invjday` function is added.
|
||||
- [Julian day calculations take account of milliseconds](https://github.com/shashwatak/satellite-js/issues/31)
|
||||
([#38](https://github.com/shashwatak/satellite-js/pull/38)).
|
||||
- [Incorrect position and velocity bug](https://github.com/shashwatak/satellite-js/issues/26) for times not close to TLE epoch is fixed ([#37](https://github.com/shashwatak/satellite-js/pull/37)).
|
||||
- Continuous integration and test coverage are provided.
|
||||
- [Bower support is dropped](https://github.com/shashwatak/satellite-js/issues/40).
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (C) 2013 Shashwat Kandadai, UCSC Jack Baskin School of Engineering
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: sgp4
|
||||
Version: 1.1
|
||||
Summary: Track earth satellite TLE orbits using up-to-date 2010 version of SGP4
|
||||
Home-page: https://github.com/brandon-rhodes/python-sgp4
|
||||
Author: Brandon Rhodes
|
||||
Author-email: brandon@rhodesmill.org
|
||||
License: MIT
|
||||
Description:
|
||||
This Python package computes the position and velocity of an
|
||||
earth-orbiting satellite, given the satellite's TLE orbital elements
|
||||
from a source like `Celestrak <http://celestrak.com/>`_. It implements
|
||||
the most recent version of SGP4, and is regularly run against the SGP4
|
||||
test suite to make sure that its satellite position predictions **agree
|
||||
to within 1 µm** of the predictions of the standard C++ implementation
|
||||
of the algorithm. This error is far less than the 1–3 km/day by which
|
||||
satellites themselves deviate from the ideal orbits described in TLE
|
||||
files.
|
||||
|
||||
The C++ function names have been retained, since users may already be
|
||||
familiar with this library in other languages. Here is how to compute
|
||||
the x,y,z position and velocity for Vanguard 1 at 12:50:19 on 29
|
||||
June 2000:
|
||||
|
||||
>>> from sgp4.earth_gravity import wgs72
|
||||
>>> from sgp4.io import twoline2rv
|
||||
>>> line1 = ('1 00005U 58002B 00179.78495062 '
|
||||
... '.00000023 00000-0 28098-4 0 4753')
|
||||
>>> line2 = ('2 00005 34.2682 348.7242 1859667 '
|
||||
... '331.7664 19.3264 10.82419157413667')
|
||||
>>>
|
||||
>>> satellite = twoline2rv(line1, line2, wgs72)
|
||||
>>> position, velocity = satellite.propagate(
|
||||
... 2000, 6, 29, 12, 50, 19)
|
||||
>>>
|
||||
>>> position
|
||||
[5576.056952400586, -3999.371134576452, -1521.9571594376037]
|
||||
>>> velocity
|
||||
[4.772627303379319, 5.119817120959591, 4.275553909172126]
|
||||
|
||||
The position vector measures the satellite position in **meters** from
|
||||
the center of the earth. The velocity is the rate at which those same
|
||||
three parameters are changing, expressed in **meters per second**.
|
||||
|
||||
There are three gravity models available that you can import from the
|
||||
``earth_gravity`` module:
|
||||
|
||||
* ``wgs72``
|
||||
* ``wgs72old``
|
||||
* ``wgs84``
|
||||
|
||||
The ``wgs72`` model seems to be the most commonly used in the satellite
|
||||
tracking community, and is probably the model behind most TLE elements
|
||||
that are available for download.
|
||||
|
||||
The ``twoline2rv()`` function returns a ``Satellite`` object whose
|
||||
attributes carry the data loaded from the TLE entry.
|
||||
Most of this class's hundred-plus attributes are intermediate values
|
||||
of interest only to the propagation algorithm itself. Here are the
|
||||
attributes set by ``sgp4.io.twoline2rv()`` in which users are likely
|
||||
to be interested:
|
||||
|
||||
``satnum``
|
||||
Unique satellite number given in the TLE file.
|
||||
``epochyr``
|
||||
Full four-digit year of this element set's epoch moment.
|
||||
``epochdays``
|
||||
Fractional days into the year of the epoch moment.
|
||||
``jdsatepoch``
|
||||
Julian date of the epoch (computed from ``epochyr`` and ``epochdays``).
|
||||
``ndot``
|
||||
First time derivative of the mean motion (ignored by SGP4).
|
||||
``nddot``
|
||||
Second time derivative of the mean motion (ignored by SGP4).
|
||||
``bstar``
|
||||
Ballistic drag coefficient B* in inverse earth radii.
|
||||
``inclo``
|
||||
Inclination in radians.
|
||||
``nodeo``
|
||||
Right ascension of ascending node in radians.
|
||||
``ecco``
|
||||
Eccentricity.
|
||||
``argpo``
|
||||
Argument of perigee in radians.
|
||||
``mo``
|
||||
Mean anomaly in radians.
|
||||
``no``
|
||||
Mean motion in radians per minute.
|
||||
|
||||
|
||||
|
||||
This implementation passes all of the automated tests in the August 2010
|
||||
release of the reference implementation of SGP4 by Vallado et al., who
|
||||
originally published their revision of SGP4 in 2006:
|
||||
|
||||
Vallado, David A., Paul Crawford, Richard Hujsak, and T.S. Kelso, “Revisiting Spacetrack Report #3,” presented at the AIAA/AAS Astrodynamics Specialist Conference, Keystone, CO, 2006 August 21–24.
|
||||
|
||||
If you would like to review the paper, it is `available online
|
||||
<http://www.celestrak.com/publications/AIAA/2006-6753/>`_. You can
|
||||
always download the latest version of their code for comparison against
|
||||
this Python module (or other implementations) at `AIAA-2006-6753.zip
|
||||
<http://www.celestrak.com/publications/AIAA/2006-6753/AIAA-2006-6753.zip>`_.
|
||||
|
||||
This module was adapted from Vallado's C++ code since its revision date
|
||||
was the most recently updated SGP4 implementation in their zip file:
|
||||
|
||||
* C++, August 2010
|
||||
* Fortran, August 2008
|
||||
* Pascal, August 2008
|
||||
* Matlab, May 2008
|
||||
* Java, July 2005
|
||||
|
||||
Changelog
|
||||
---------
|
||||
|
||||
| 2012-11-22 — 1.1 — Python 3 compatibility; more documentation
|
||||
| 2012-08-27 — 1.0 — Initial release
|
||||
|
||||
|
||||
Platform: UNKNOWN
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Science/Research
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python :: 2
|
||||
Classifier: Programming Language :: Python :: 2.6
|
||||
Classifier: Programming Language :: Python :: 2.7
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Programming Language :: Python :: 3.1
|
||||
Classifier: Programming Language :: Python :: 3.2
|
||||
Classifier: Topic :: Scientific/Engineering :: Astronomy
|
||||
+568
@@ -0,0 +1,568 @@
|
||||
# satellite.js
|
||||
|
||||
[](https://www.npmjs.com/package/satellite.js)
|
||||
[](https://www.npmjs.com/package/satellite.js)
|
||||
[](LICENSE.md)
|
||||
|
||||
## Introduction
|
||||
|
||||
A library to make satellite propagation via TLEs or [OMM](https://www.nasa.gov/wp-content/uploads/2017/12/orbit_data_messages.pdf)
|
||||
possible in the web. Provides the functions necessary for SGP4/SDP4 calculations, as callable javascript. Also provides
|
||||
functions for coordinate transforms.
|
||||
|
||||
The internals of this library are nearly identical to
|
||||
[Brandon Rhode's sgp4 python library](https://pypi.python.org/pypi/sgp4/).
|
||||
|
||||
Special thanks to all contributors for improving usability and bug fixes :)
|
||||
|
||||
- [ezze (Dmitriy Pushkov)](https://github.com/ezze)
|
||||
- [davidcalhoun (David Calhoun)](https://github.com/davidcalhoun)
|
||||
- [tikhonovits (Nikos Sagias)](https://github.com/tikhonovits)
|
||||
- [dangodev (Drew Powers)](https://github.com/dangodev)
|
||||
- [thkruz (Theodore Kruczek)](https://github.com/thkruz)
|
||||
- [bakercp (Christopher Baker)](https://github.com/bakercp)
|
||||
- [kylegmaxwell (Kyle G. Maxwell)](https://github.com/kylegmaxwell)
|
||||
- [iamthechad (Chad Johnston)](https://github.com/iamthechad)
|
||||
- [drom (Aliaksei Chapyzhenka)](https://github.com/drom)
|
||||
- [PeterDaveHello (Peter Dave Hello)](https://github.com/PeterDaveHello)
|
||||
- [Alesha72003](https://github.com/Alesha72003)
|
||||
- [nhamer](https://github.com/nhamer)
|
||||
- [owntheweb](https://github.com/owntheweb)
|
||||
- [Zigone](https://github.com/Zigone)
|
||||
|
||||
Sites using the library can be found [here](https://github.com/shashwatak/satellite-js/wiki/Sites-using-satellite.js).
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
npm install satellite.js
|
||||
```
|
||||
|
||||
```bash
|
||||
yarn add satellite.js
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### ES Modules
|
||||
|
||||
```js
|
||||
import { sgp4 } from 'satellite.js';
|
||||
...
|
||||
const positionAndVelocity = sgp4(satrec, time);
|
||||
```
|
||||
|
||||
### Common.js ([Node.js](https://nodejs.org))
|
||||
|
||||
```js
|
||||
const satellite = require('satellite.js');
|
||||
...
|
||||
const positionAndVelocity = satellite.sgp4(satrec, time);
|
||||
```
|
||||
|
||||
### AMD ([Require.js](http://requirejs.org/))
|
||||
|
||||
```js
|
||||
define(['path/to/dist/satellite'], function(satellite) {
|
||||
...
|
||||
var positionAndVelocity = satellite.sgp4(satrec, time);
|
||||
});
|
||||
```
|
||||
|
||||
### Script tag
|
||||
|
||||
Include `dist/satellite.min.js` as a script in your html:
|
||||
|
||||
```html
|
||||
<script src="path/to/dist/satellite.min.js"></script>
|
||||
```
|
||||
|
||||
`satellite` object will be available in global scope:
|
||||
|
||||
```js
|
||||
const positionAndVelocity = satellite.sgp4(satrec, time);
|
||||
```
|
||||
|
||||
## Sample Usage: calculate Look Angles, Geodetic Position etc
|
||||
|
||||
```js
|
||||
// Sample TLE
|
||||
const tleLine1 = '1 25544U 98067A 19156.50900463 .00003075 00000-0 59442-4 0 9992',
|
||||
tleLine2 = '2 25544 51.6433 59.2583 0008217 16.4489 347.6017 15.51174618173442';
|
||||
|
||||
// Initialize a satellite record
|
||||
const satrec = satellite.twoline2satrec(tleLine1, tleLine2);
|
||||
|
||||
// Or sample OMM - preferred for new applications
|
||||
const omm = {
|
||||
"OBJECT_NAME": "HELIOS 2A",
|
||||
"OBJECT_ID": "2004-049A",
|
||||
"EPOCH": "2025-03-26T05:19:34.116960",
|
||||
"MEAN_MOTION": 15.00555103,
|
||||
"ECCENTRICITY": 0.000583,
|
||||
"INCLINATION": 98.3164,
|
||||
"RA_OF_ASC_NODE": 103.8411,
|
||||
"ARG_OF_PERICENTER": 20.5667,
|
||||
"MEAN_ANOMALY": 339.5789,
|
||||
"EPHEMERIS_TYPE": 0,
|
||||
"CLASSIFICATION_TYPE": "U",
|
||||
"NORAD_CAT_ID": 28492,
|
||||
"ELEMENT_SET_NO": 999,
|
||||
"REV_AT_EPOCH": 8655,
|
||||
"BSTAR": 0.00048021,
|
||||
"MEAN_MOTION_DOT": 0.00005995,
|
||||
"MEAN_MOTION_DDOT": 0
|
||||
};
|
||||
|
||||
const satrecFromOmm = satellite.json2satrec(omm);
|
||||
|
||||
// Propagate satellite using time since epoch (in minutes).
|
||||
const positionAndVelocity = satellite.sgp4(satrec, timeSinceTleEpochMinutes);
|
||||
|
||||
// Or you can use a JavaScript Date
|
||||
const positionAndVelocity = satellite.propagate(satrec, new Date());
|
||||
|
||||
// if the result is `null`, it means that the propagation failed;
|
||||
// consult `satrec.error` property for a specific reason.
|
||||
if (positionAndVelocity === null) {
|
||||
switch (satrec.error) {
|
||||
// all possible values are listed in SatRecError enum:
|
||||
case satellite.SatRecError.Decayed:
|
||||
console.log('The satellite has decayed')
|
||||
// ...
|
||||
}
|
||||
}
|
||||
|
||||
// The positionAndVelocity result is a pair of ECI coordinates.
|
||||
// These are the base results from which all other coordinates are derived.
|
||||
const positionEci = positionAndVelocity.position,
|
||||
velocityEci = positionAndVelocity.velocity;
|
||||
|
||||
// Set the Observer at 122.03 West by 36.96 North, in RADIANS
|
||||
const observerGd = {
|
||||
longitude: satellite.degreesToRadians(-122.0308),
|
||||
latitude: satellite.degreesToRadians(36.9613422),
|
||||
height: 0.370
|
||||
};
|
||||
|
||||
// You will need GMST for some of the coordinate transforms.
|
||||
// http://en.wikipedia.org/wiki/Sidereal_time#Definition
|
||||
const gmst = satellite.gstime(new Date());
|
||||
|
||||
// You can get ECF, Geodetic, Look Angles, and Doppler Factor.
|
||||
const positionEcf = satellite.eciToEcf(positionEci, gmst),
|
||||
observerEcf = satellite.geodeticToEcf(observerGd),
|
||||
positionGd = satellite.eciToGeodetic(positionEci, gmst),
|
||||
lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf),
|
||||
dopplerFactor = satellite.dopplerFactor(observerCoordsEcf, positionEcf, velocityEcf);
|
||||
|
||||
// The coordinates are all stored in key-value pairs.
|
||||
// ECI and ECF are accessed by `x`, `y`, `z` properties.
|
||||
const satelliteX = positionEci.x,
|
||||
satelliteY = positionEci.y,
|
||||
satelliteZ = positionEci.z;
|
||||
|
||||
// Look Angles may be accessed by `azimuth`, `elevation`, `rangeSat` properties.
|
||||
const azimuth = lookAngles.azimuth,
|
||||
elevation = lookAngles.elevation,
|
||||
rangeSat = lookAngles.rangeSat;
|
||||
|
||||
// Geodetic coords are accessed via `longitude`, `latitude`, `height`.
|
||||
const longitude = positionGd.longitude,
|
||||
latitude = positionGd.latitude,
|
||||
height = positionGd.height;
|
||||
|
||||
// Convert the RADIANS to DEGREES.
|
||||
const longitudeDeg = satellite.degreesLong(longitude),
|
||||
latitudeDeg = satellite.degreesLat(latitude);
|
||||
```
|
||||
|
||||
## Resources
|
||||
|
||||
- [TS Kelso's Columns for Satellite Times](http://celestrak.com/columns/), Orbital Propagation Parts I and II a must!
|
||||
- [Wikipedia: Simplified Perturbations Model](http://en.wikipedia.org/wiki/Simplified_perturbations_models)
|
||||
- [SpaceTrack Report #3, by Hoots and Roehrich](http://celestrak.com/NORAD/documentation/spacetrk.pdf).
|
||||
|
||||
The TypeScript in this library is heavily based (propagation procedures straight copied) from:
|
||||
|
||||
- The python [sgp4 1.1 by Brandon Rhodes](https://pypi.python.org/pypi/sgp4/)
|
||||
- The C++ code by [David Vallado, et al](http://www.celestrak.com/publications/AIAA/2006-6753/)
|
||||
|
||||
The original PKG-INFO file from the python library is included.
|
||||
|
||||
The coordinate transforms are based off T.S. Kelso's columns:
|
||||
|
||||
- [Part I](http://celestrak.com/columns/v02n01/)
|
||||
- [Part II](http://celestrak.com/columns/v02n02/)
|
||||
- [Part III](http://celestrak.com/columns/v02n03/)
|
||||
|
||||
And the coursework for UC Boulder's ASEN students
|
||||
- [Coodinate Transforms @ UC Boulder](http://ccar.colorado.edu/ASEN5070/handouts/coordsys.doc)
|
||||
|
||||
I would recommend anybody interested in satellite tracking or orbital propagation to read
|
||||
[all of TS Kelso's columns](http://celestrak.com/columns/). Without his work, this project would not be possible.
|
||||
|
||||
Get a free [Space Track account](https://www.space-track.org/auth/login) and download your own up to date TLEs or OMM
|
||||
for use with this library.
|
||||
|
||||
## Exposed Objects
|
||||
|
||||
### SatRec
|
||||
|
||||
The `SatRec` object comes from the original code by Rhodes as well as Vallado. It is immense and complex, but the
|
||||
most important values it contains are the Keplerian Elements and the other values pulled from the TLE/OMM. I do not
|
||||
suggest that anybody try to simplify it unless they have absolute understanding of Orbital Mechanics.
|
||||
|
||||
- `satnum` Unique satellite number given in the TLE file.
|
||||
- `epochyr` Full four-digit year of this element set's epoch moment.
|
||||
- `epochdays` Fractional days into the year of the epoch moment.
|
||||
- `jdsatepoch` Julian date of the epoch (computed from `epochyr` and `epochdays`).
|
||||
- `ndot` First time derivative of the mean motion (ignored by SGP4).
|
||||
- `nddot` Second time derivative of the mean motion (ignored by SGP4).
|
||||
- `bstar` Ballistic drag coefficient B* in inverse earth radii.
|
||||
- `inclo` Inclination in radians.
|
||||
- `nodeo` Right ascension of ascending node in radians.
|
||||
- `ecco` Eccentricity.
|
||||
- `argpo` Argument of perigee in radians.
|
||||
- `mo` Mean anomaly in radians.
|
||||
- `no` Mean motion in radians per minute.
|
||||
- `error` The error code that is set by SGP4 model in case when propagation fails.
|
||||
|
||||
### SatRecError
|
||||
|
||||
The enum that lists all possible error codes in `SatRec.error property:
|
||||
- `None` - No error, propagation for the last supplied date is successful
|
||||
- `MeanEccentricityOutOfRange` - Mean eccentricity is out of range 0 ≤ e < 1
|
||||
- `MeanMotionBelowZero` - Mean motion has fallen below zero
|
||||
- `PerturbedEccentricityOutOfRange` - Perturbed eccentricity is out of range 0 ≤ e < 1
|
||||
- `SemiLatusRectumBelowZero` - Length of the orbit’s semi-latus rectum has fallen below zero
|
||||
- `Decayed` - Orbit has decayed: the computed position is underground
|
||||
|
||||
## Exposed Functions
|
||||
|
||||
### Initialization
|
||||
|
||||
NOTE! You are responsible for providing OMM or TLE.
|
||||
[Get your free Space Track account here.](https://www.space-track.org/auth/login)
|
||||
If you use Space Track, there should be no problem.
|
||||
|
||||
#### From OMM (preferred for new applications)
|
||||
|
||||
```js
|
||||
const satrec = satellite.json2satrec(ommObject);
|
||||
```
|
||||
|
||||
returns satrec object, created from JSON object that follows
|
||||
[OMM format](https://www.nasa.gov/wp-content/uploads/2017/12/orbit_data_messages.pdf).
|
||||
**OMM is a preferred default method for new applications**, since TLE format is constrained
|
||||
to 5 digits in NORAD section and the number of catalogued objects quickly approches 100 000.
|
||||
|
||||
To obtain OMM as JSON from Celestrak, select "JSON" option at the top of "Current GP
|
||||
Element Sets" page or follow
|
||||
[this link](https://celestrak.org/NORAD/elements/index.php?FORMAT=json) where it will
|
||||
be already selected.
|
||||
|
||||
Space-Track doesn't expose the JSON format in their UI, so to get JSON encoded OMM,
|
||||
on "Recent ELSETs" page, from "Current Catalog Files", copy a URL for the needed category
|
||||
and change the ending part of the URL from `/format/xml` to be `/format/json`.
|
||||
|
||||
#### From TLE
|
||||
|
||||
```js
|
||||
const satrec = satellite.twoline2satrec(longstr1, longstr2);
|
||||
```
|
||||
|
||||
returns satrec object, created from the TLEs passed in. longstr1 and longstr2 are the two lines of the TLE,
|
||||
properly formatted by NASA and NORAD standards.
|
||||
|
||||
___
|
||||
|
||||
The satrec object is vastly complicated, but you don't have to do anything with it, except pass it around.
|
||||
|
||||
### Propagation
|
||||
|
||||
Both `propagate()` and `sgp4()` functions return position and velocity; as well as mean elements:
|
||||
|
||||
```json
|
||||
{
|
||||
"position": { "x" : 1, "y" : 1, "z" : 1 },
|
||||
"velocity": { "x" : 1, "y" : 1, "z" : 1 },
|
||||
"meanElements": {
|
||||
"Om": 2.2835713400168607,
|
||||
"am": 1.3043985097733939,
|
||||
"em": 0.166565,
|
||||
"im": 0.5743651675510579,
|
||||
"mm": -4.361270622785478,
|
||||
"nm": 0.049918822378349076,
|
||||
"om": 4.074394344293675,
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
position is in km, velocity is in km/s, both the ECI coordinate frame. Mean elements are satellite orbit elements as they
|
||||
evolved at the propagation date: `am` (semi-major axis, Earth radii), `em` (eccentricity), `im` (inclination, radians),
|
||||
`Om` (right ascension of ascending node, radians), `om` (argument of perigee, radians),
|
||||
`nm` (mean motion, radians per minute).
|
||||
|
||||
```js
|
||||
const positionAndVelocity = satellite.propagate(satrec, new Date());
|
||||
```
|
||||
|
||||
Returns position and velocity, given a satrec and the calendar date. Is merely a wrapper for `sgp4()`, converts the
|
||||
calendar day to Julian time since satellite epoch. Sometimes it's better to ask for position and velocity given
|
||||
a specific date.
|
||||
|
||||
```js
|
||||
const positionAndVelocity = satellite.sgp4(satrec, timeSinceTleEpochMinutes);
|
||||
```
|
||||
|
||||
Returns position and velocity, given a satrec and the time in minutes since epoch. Sometimes it's better to ask for
|
||||
position and velocity given the time elapsed since epoch.
|
||||
|
||||
### Doppler
|
||||
|
||||
You can get the satellites current Doppler factor, relative to your position, using the `dopplerFactor()` function.
|
||||
Use either ECI or ECF coordinates, but don't mix them.
|
||||
|
||||
```js
|
||||
const dopplerFactor = satellite.dopplerFactor(observer, position, velocity);
|
||||
```
|
||||
|
||||
See the section on Coordinate Transforms to see how to get ECF/ECI/Geodetic coordinates.
|
||||
|
||||
### Coordinate Transforms
|
||||
|
||||
#### Greenwich Mean Sidereal Time
|
||||
|
||||
You'll need to provide some of the coordinate transform functions with your current GMST aka GSTIME. You can use
|
||||
Julian Day:
|
||||
|
||||
```js
|
||||
const gmst = satellite.gstime(julianDay);
|
||||
```
|
||||
|
||||
or a JavaScript Date:
|
||||
|
||||
```js
|
||||
const gmst = satellite.gstime(new Date());
|
||||
```
|
||||
|
||||
#### Transforms
|
||||
|
||||
Most of these are self explanatory from their names. Coords are arrays of three floats EX: [1.1, 1.2, 1.3] in
|
||||
kilometers. Once again, read the following first.
|
||||
|
||||
The coordinate transforms are based off T.S. Kelso's columns:
|
||||
* [Part I](http://celestrak.com/columns/v02n01/)
|
||||
* [Part II](http://celestrak.com/columns/v02n02/)
|
||||
* [Part III](http://celestrak.com/columns/v02n03/)
|
||||
|
||||
And the coursework for UC Boulder's ASEN students
|
||||
* [Coodinate Transforms @ UC Boulder](http://ccar.colorado.edu/ASEN5070/handouts/coordsys.doc)
|
||||
|
||||
These four are used to convert between ECI, ECF, and Geodetic, as you need them. ECI and ECF coordinates are in
|
||||
km or km/s. Geodetic coords are in radians.
|
||||
|
||||
```js
|
||||
const ecfCoords = satellite.eciToEcf(eciCoords, gmst);
|
||||
```
|
||||
|
||||
```js
|
||||
const eciCoords = satellite.ecfToEci(ecfCoords, gmst);
|
||||
```
|
||||
|
||||
```js
|
||||
const geodeticCoords = satellite.eciToGeodetic(eciCoords, gmst);
|
||||
```
|
||||
|
||||
```js
|
||||
const ecfCoords = satellite.geodeticToEcf(geodeticCoords);
|
||||
```
|
||||
|
||||
These function is used to compute the look angle, from your geodetic position to a satellite in ECF coordinates.
|
||||
Make sure you convert the ECI output from sgp4() and propagate() to ECF first.
|
||||
|
||||
```js
|
||||
const lookAngles = satellite.ecfToLookAngles(observerGeodetic, satelliteEcf);
|
||||
```
|
||||
|
||||
#### Latitude and Longitude
|
||||
|
||||
These two functions will return human readable Latitude or Longitude strings (Ex: "125.35W" or "45.565N")
|
||||
from `geodeticCoords`:
|
||||
|
||||
```js
|
||||
const latitudeStr = satellite.degreesLat(geodeticRadians),
|
||||
longitudeStr = satellite.degreesLong(geodeticRadians);
|
||||
```
|
||||
|
||||
#### Sun position
|
||||
|
||||
This function returns Sun position at the given date. This is useful to further calculate if a given satellite
|
||||
is in Earth umbra. Position is returned as geocentric equatorial vector pointing at the sun,
|
||||
along with Right Ascension and Declination. This is the low precision formula and is valid for years from 1950
|
||||
to 2050. Accuracy of apparent coordinates is 0.01 degrees.
|
||||
```js
|
||||
const jday = satellite.jday(new Date())
|
||||
const sunPosition = satellite.sunPos(jday)
|
||||
|
||||
{
|
||||
rsun: [1, 1, 1], // x, y, z; astronomical units
|
||||
rtasc: 0.5, // radians
|
||||
decl: 0.5 // radians
|
||||
}
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
This repo follows [Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow).
|
||||
Before starting a work on new [pull request](https://github.com/shashwatak/satellite-js/compare), please, checkout your
|
||||
feature or bugfix branch from `develop` branch:
|
||||
|
||||
```bash
|
||||
git checkout develop
|
||||
git fetch origin
|
||||
git merge origin/develop
|
||||
git checkout -b my-feature
|
||||
```
|
||||
|
||||
Make sure that your changes don't break the existing code by running
|
||||
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
and that your code follows [Airbnb](https://www.npmjs.com/package/eslint-config-airbnb-base) style
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
npm run lint:test
|
||||
```
|
||||
|
||||
Implementing new functions or features, please, if possible, provide tests to cover them and mention your works in
|
||||
[Changelog](CHANGELOG.md). Please don't change version number in `package.json` and don't add it to `CHANGELOG.md`.
|
||||
All these things should be done later with [raise-version](https://github.com/ezze/node-raise-version) when
|
||||
merging to `master`:
|
||||
|
||||
```bash
|
||||
npm run raise major
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```bash
|
||||
npm run raise minor
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```bash
|
||||
npm run raise patch
|
||||
```
|
||||
|
||||
In order to get test code coverage run the following:
|
||||
|
||||
```bash
|
||||
npm run test:coverage
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
The source code is written in [TypeScript](https://www.typescriptlang.org/) and uses a strict tsconfig.
|
||||
|
||||
In order to build the library follow these steps:
|
||||
|
||||
- install [Node.js](https://nodejs.org/) and [Node Package Manager](https://www.npmjs.com/);
|
||||
|
||||
- install all required packages with NPM by running the following command from repository's root directory:
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
- run the following NPM script to build everything:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
- run the following NPM script to run test specs `test/*.spec.js` files with [Mocha](https://mochajs.org/):
|
||||
|
||||
```bash
|
||||
npm test
|
||||
```
|
||||
|
||||
These is a full list of all available NPM scripts:
|
||||
|
||||
- `build` builds everything;
|
||||
- `transpile` transpiles ES source files located in `src` directory to Common.js compatible modules and saves
|
||||
the resulting files in `lib` directory;
|
||||
- `dist` builds ES and UMD modules in `dist` directory;
|
||||
- `dist:es` builds ES module in `dist` directory;
|
||||
- `dist:umd` builds [UMD](https://github.com/umdjs/umd) module in `dist` directory (both non-compressed and
|
||||
compressed versions);
|
||||
- `dist:umd:dev` builds non-compressed version of UMD module in `dist` directory;
|
||||
- `dist:umd:prod` builds compressed version of UMD module in `dist` directory;
|
||||
- `watch:es` watches for changes in `src` directory and automatically rebuilds ES module;
|
||||
- `copy` copies built library from `dist` to [SGP4 verification](#benchmarking) application's directory;
|
||||
- `lint` lints sources code located in `src` directory with [ESLint](http://eslint.org/) with
|
||||
[Airbnb shared configuration]((https://www.npmjs.com/package/eslint-config-airbnb));
|
||||
- `lint:test` lints tests located in `test` directory with ESLint;
|
||||
- `test` runs tests;
|
||||
- `test:coverage` runs tests with [Istanbul](https://github.com/gotwarlost/istanbul) coverage summary;
|
||||
|
||||
## ES5 and satellite.min.js
|
||||
|
||||
Only the "src" directory is included in the Git repository, "dist" and "lib" directories are ignored. It's done intentionally to retain the size of the repository as small as possible. A full detailed explanation of why is located [here](https://github.com/shashwatak/satellite-js/issues/80#issuecomment-749225324).
|
||||
|
||||
You should install satellite.js with your package manager (npm or yarn) and then find satellite.js and satellite.min.js in node_modules/satellite.js/dist directory.
|
||||
|
||||
## Note about Code Conventions
|
||||
|
||||
Like Brandon Rhodes before me, I chose to maintain as little difference between this implementation and the prior
|
||||
works. This is to make adapting future changes suggested by Vallado much simpler. Thus, some of the conventions
|
||||
used in this library are very weird.
|
||||
|
||||
## How this was written
|
||||
|
||||
I took advantage of the fact that Python and JavaScript are nearly semantically identical. Most of the code is
|
||||
just copied straight from Python. Brandon Rhodes did me the favor of including semi-colons on most of the lines of
|
||||
code. JavaScript doesn't support multiple values returned per statement, so I had to rewrite the function calls.
|
||||
Absolutely none of the mathematical logic had to be rewritten.
|
||||
|
||||
## Benchmarking
|
||||
|
||||
I've included a small testing app, that provides some benchmarking tools and verifies SGP4 and SDP4 using the
|
||||
Test Criteria provided by SpaceTrack Report #3, and is based off
|
||||
[System Benchmarking](http://celestrak.com/columns/v02n04/) by TS Kelso.
|
||||
|
||||
The testing app is a Chrome Packaged App that uses the `angular.js` framework.
|
||||
|
||||
Before running the app build the library and copy resulting files from `dist` directory to app's directory with
|
||||
the following command:
|
||||
|
||||
```bash
|
||||
npm run copy
|
||||
```
|
||||
|
||||
To run the test, open up Chrome, go to the extensions page, and check "Developer Mode". Then, click "Load Unpacked App",
|
||||
and select the `sgp4_verification` folder. Then run the app from within Chrome. The test file is located within
|
||||
the `sgp4_verification` directory, as a JSON file called `spacetrack-report-3.json`.
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
Major thanks go to Brandon Rhodes, TS Kelso, and David Vallado's team. Also, I'd like to thank Professor Steve
|
||||
Petersen (AC6P) of UCSC for pointing me in the correct directions.
|
||||
|
||||
## License
|
||||
|
||||
All files marked with the License header at the top are Licensed. Any files unmarked by me or others are
|
||||
unlicensed, and are kept only as a resource for [Shashwat Kandadai and other developers] for testing.
|
||||
|
||||
I chose the [MIT License](LICENSE.md) because this library is a derivative work off
|
||||
[Brandon Rhodes sgp4](https://pypi.python.org/pypi/sgp4/), and that is licensed with MIT.
|
||||
|
||||
I worked in the Dining Hall at UCSC for a month, which means I signed a form that gives UCSC partial ownership of
|
||||
anything I make while under their aegis, so I included them as owners of the copyright.
|
||||
|
||||
Please email all complaints to help@ucsc.edu
|
||||
+3110
File diff suppressed because it is too large
Load Diff
+3151
File diff suppressed because it is too large
Load Diff
+1
File diff suppressed because one or more lines are too long
+30
@@ -0,0 +1,30 @@
|
||||
import eslint from '@eslint/js';
|
||||
import tseslint from 'typescript-eslint';
|
||||
|
||||
export default tseslint.config(
|
||||
eslint.configs.recommended,
|
||||
tseslint.configs.strict,
|
||||
tseslint.configs.stylistic,
|
||||
{
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
projectService: true,
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ignores: ['/dist', '/lib', '*.mjs']
|
||||
},
|
||||
{
|
||||
rules: {
|
||||
'@typescript-eslint/unified-signatures': ['error', {
|
||||
'ignoreDifferentlyNamedParameters': true
|
||||
}],
|
||||
// since much of the propagation code is built on loops and if statements,
|
||||
// and typescript doesn't follow when a variable is assigned there,
|
||||
// this rule is disabled
|
||||
'@typescript-eslint/no-non-null-assertion': 'off'
|
||||
}
|
||||
}
|
||||
);
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.xpdotp = exports.xke = exports.x2o3 = exports.vkmpersec = exports.twoPi = exports.tumin = exports.rad2deg = exports.pi = exports.mu = exports.minutesPerDay = exports.j4 = exports.j3oj2 = exports.j3 = exports.j2 = exports.earthRadius = exports.deg2rad = void 0;
|
||||
var pi = exports.pi = Math.PI;
|
||||
var twoPi = exports.twoPi = pi * 2;
|
||||
var deg2rad = exports.deg2rad = pi / 180.0;
|
||||
var rad2deg = exports.rad2deg = 180 / pi;
|
||||
var minutesPerDay = exports.minutesPerDay = 1440.0;
|
||||
var mu = exports.mu = 398600.8; // in km3 / s2
|
||||
var earthRadius = exports.earthRadius = 6378.135; // in km
|
||||
var xke = exports.xke = 60.0 / Math.sqrt(earthRadius * earthRadius * earthRadius / mu);
|
||||
var vkmpersec = exports.vkmpersec = earthRadius * xke / 60.0;
|
||||
var tumin = exports.tumin = 1.0 / xke;
|
||||
var j2 = exports.j2 = 0.001082616;
|
||||
var j3 = exports.j3 = -0.00000253881;
|
||||
var j4 = exports.j4 = -0.00000165597;
|
||||
var j3oj2 = exports.j3oj2 = j3 / j2;
|
||||
var x2o3 = exports.x2o3 = 2.0 / 3.0;
|
||||
var xpdotp = exports.xpdotp = 1440.0 / (2.0 * pi); // 229.1831180523293;
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = dopplerFactor;
|
||||
var earthRotation = 7.292115E-5;
|
||||
var c = 299792.458; // Speed of light in km/s
|
||||
/**
|
||||
* Negative range rate means the satellite is moving towards the observer and
|
||||
* its frequency is shifted higher because 1 minus a negative range rate is
|
||||
* positive. If the range rate is positive, the satellite is moving away from
|
||||
* the observer and its frequency is shifted lower.
|
||||
*/
|
||||
function dopplerFactor(observerCoordsEcf, positionEcf, velocityEcf) {
|
||||
var rangeX = positionEcf.x - observerCoordsEcf.x;
|
||||
var rangeY = positionEcf.y - observerCoordsEcf.y;
|
||||
var rangeZ = positionEcf.z - observerCoordsEcf.z;
|
||||
var length = Math.sqrt(Math.pow(rangeX, 2) + Math.pow(rangeY, 2) + Math.pow(rangeZ, 2));
|
||||
var rangeVel = {
|
||||
x: velocityEcf.x + earthRotation * observerCoordsEcf.y,
|
||||
y: velocityEcf.y - earthRotation * observerCoordsEcf.x,
|
||||
z: velocityEcf.z
|
||||
};
|
||||
var rangeRate = (rangeX * rangeVel.x + rangeY * rangeVel.y + rangeZ * rangeVel.z) / length;
|
||||
return 1 - rangeRate / c;
|
||||
}
|
||||
+145
@@ -0,0 +1,145 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.days2mdhms = days2mdhms;
|
||||
exports.invjday = invjday;
|
||||
exports.jday = jday;
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure days2mdhms
|
||||
*
|
||||
* this procedure converts the day of the year, days, to the equivalent month
|
||||
* day, hour, minute and second.
|
||||
*
|
||||
* algorithm : set up array for the number of days per month
|
||||
* find leap year - use 1900 because 2000 is a leap year
|
||||
* loop through a temp value while the value is < the days
|
||||
* perform int conversions to the correct day and month
|
||||
* convert remainder into h m s using type conversions
|
||||
*
|
||||
* author : david vallado 719-573-2600 1 mar 2001
|
||||
*
|
||||
* inputs description range / units
|
||||
* year - year 1900 .. 2100
|
||||
* days - julian day of the year 0.0 .. 366.0
|
||||
*
|
||||
* outputs :
|
||||
* mon - month 1 .. 12
|
||||
* day - day 1 .. 28,29,30,31
|
||||
* hr - hour 0 .. 23
|
||||
* min - minute 0 .. 59
|
||||
* sec - second 0.0 .. 59.999
|
||||
*
|
||||
* locals :
|
||||
* dayofyr - day of year
|
||||
* temp - temporary extended values
|
||||
* inttemp - temporary int value
|
||||
* i - index
|
||||
* lmonth[12] - int array containing the number of days per month
|
||||
*
|
||||
* coupling :
|
||||
* none.
|
||||
* --------------------------------------------------------------------------- */
|
||||
function days2mdhms(year, days) {
|
||||
var lmonth = [31, year % 4 === 0 ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
||||
var dayofyr = Math.floor(days);
|
||||
// ----------------- find month and day of month ----------------
|
||||
var i = 1;
|
||||
var inttemp = 0;
|
||||
// i starts from 1 so no null check is needed
|
||||
while (dayofyr > inttemp + lmonth[i - 1] && i < 12) {
|
||||
inttemp += lmonth[i - 1];
|
||||
i += 1;
|
||||
}
|
||||
var mon = i;
|
||||
var day = dayofyr - inttemp;
|
||||
// ----------------- find hours minutes and seconds -------------
|
||||
var temp = (days - dayofyr) * 24.0;
|
||||
var hr = Math.floor(temp);
|
||||
temp = (temp - hr) * 60.0;
|
||||
var minute = Math.floor(temp);
|
||||
var sec = (temp - minute) * 60.0;
|
||||
return {
|
||||
mon: mon,
|
||||
day: day,
|
||||
hr: hr,
|
||||
minute: minute,
|
||||
sec: sec
|
||||
};
|
||||
}
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure jday
|
||||
*
|
||||
* this procedure finds the julian date given the year, month, day, and time.
|
||||
* the julian date is defined by each elapsed day since noon, jan 1, 4713 bc.
|
||||
*
|
||||
* algorithm : calculate the answer in one step for efficiency
|
||||
*
|
||||
* author : david vallado 719-573-2600 1 mar 2001
|
||||
*
|
||||
* inputs description range / units
|
||||
* year - year 1900 .. 2100
|
||||
* mon - month 1 .. 12
|
||||
* day - day 1 .. 28,29,30,31
|
||||
* hr - universal time hour 0 .. 23
|
||||
* min - universal time min 0 .. 59
|
||||
* sec - universal time sec 0.0 .. 59.999
|
||||
*
|
||||
* outputs :
|
||||
* jd - julian date days from 4713 bc
|
||||
*
|
||||
* locals :
|
||||
* none.
|
||||
*
|
||||
* coupling :
|
||||
* none.
|
||||
*
|
||||
* references :
|
||||
* vallado 2007, 189, alg 14, ex 3-14
|
||||
*
|
||||
* --------------------------------------------------------------------------- */
|
||||
function jdayInternal(year, mon, day, hr, minute, sec) {
|
||||
var msec = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
|
||||
return 367.0 * year - Math.floor(7 * (year + Math.floor((mon + 9) / 12.0)) * 0.25) + Math.floor(275 * mon / 9.0) + day + 1721013.5 + ((msec / 60000 + sec / 60.0 + minute) / 60.0 + hr) / 24.0 // ut in days
|
||||
// # - 0.5*sgn(100.0*year + mon - 190002.5) + 0.5;
|
||||
;
|
||||
}
|
||||
function jday(yearOrDate, mon, day, hr, minute, sec) {
|
||||
var msec = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
|
||||
if (yearOrDate instanceof Date) {
|
||||
var date = yearOrDate;
|
||||
return jdayInternal(date.getUTCFullYear(), date.getUTCMonth() + 1,
|
||||
// Note, this function requires months in range 1-12.
|
||||
date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());
|
||||
}
|
||||
return jdayInternal(yearOrDate, mon, day, hr, minute, sec, msec);
|
||||
}
|
||||
function invjday(jd, asArray) {
|
||||
// --------------- find year and days of the year -
|
||||
var temp = jd - 2415019.5;
|
||||
var tu = temp / 365.25;
|
||||
var year = 1900 + Math.floor(tu);
|
||||
var leapyrs = Math.floor((year - 1901) * 0.25);
|
||||
// optional nudge by 8.64x10-7 sec to get even outputs
|
||||
var days = temp - ((year - 1900) * 365.0 + leapyrs) + 0.00000000001;
|
||||
// ------------ check for case of beginning of a year -----------
|
||||
if (days < 1.0) {
|
||||
year -= 1;
|
||||
leapyrs = Math.floor((year - 1901) * 0.25);
|
||||
days = temp - ((year - 1900) * 365.0 + leapyrs);
|
||||
}
|
||||
// ----------------- find remaing data -------------------------
|
||||
var mdhms = days2mdhms(year, days);
|
||||
var mon = mdhms.mon,
|
||||
day = mdhms.day,
|
||||
hr = mdhms.hr,
|
||||
minute = mdhms.minute;
|
||||
var sec = mdhms.sec - 0.00000086400;
|
||||
if (asArray) {
|
||||
return [year, mon, day, hr, minute, Math.floor(sec)];
|
||||
}
|
||||
return new Date(Date.UTC(year, mon - 1, day, hr, minute, Math.floor(sec)));
|
||||
}
|
||||
+181
@@ -0,0 +1,181 @@
|
||||
"use strict";
|
||||
|
||||
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
var _exportNames = {
|
||||
constants: true,
|
||||
jday: true,
|
||||
invjday: true,
|
||||
twoline2satrec: true,
|
||||
json2satrec: true,
|
||||
propagate: true,
|
||||
sgp4: true,
|
||||
gstime: true,
|
||||
dopplerFactor: true,
|
||||
radiansToDegrees: true,
|
||||
degreesToRadians: true,
|
||||
degreesLat: true,
|
||||
degreesLong: true,
|
||||
radiansLat: true,
|
||||
radiansLong: true,
|
||||
geodeticToEcf: true,
|
||||
eciToGeodetic: true,
|
||||
eciToEcf: true,
|
||||
ecfToEci: true,
|
||||
ecfToLookAngles: true,
|
||||
sunPos: true,
|
||||
SatRecError: true
|
||||
};
|
||||
Object.defineProperty(exports, "SatRecError", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _SatRec.SatRecError;
|
||||
}
|
||||
});
|
||||
exports.constants = void 0;
|
||||
Object.defineProperty(exports, "degreesLat", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.degreesLat;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "degreesLong", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.degreesLong;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "degreesToRadians", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.degreesToRadians;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "dopplerFactor", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _dopplerFactor["default"];
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "ecfToEci", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.ecfToEci;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "ecfToLookAngles", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.ecfToLookAngles;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "eciToEcf", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.eciToEcf;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "eciToGeodetic", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.eciToGeodetic;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "geodeticToEcf", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.geodeticToEcf;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "gstime", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _propagation.gstime;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "invjday", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _ext.invjday;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "jday", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _ext.jday;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "json2satrec", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _io.json2satrec;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "propagate", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _propagation.propagate;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "radiansLat", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.radiansLat;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "radiansLong", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.radiansLong;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "radiansToDegrees", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _transforms.radiansToDegrees;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "sgp4", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _propagation.sgp4;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "sunPos", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _sun.sunPos;
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "twoline2satrec", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _io.twoline2satrec;
|
||||
}
|
||||
});
|
||||
var constants_1 = _interopRequireWildcard(require("./constants"));
|
||||
exports.constants = constants_1;
|
||||
var _ext = require("./ext");
|
||||
var _io = require("./io");
|
||||
var _propagation = require("./propagation");
|
||||
var _dopplerFactor = _interopRequireDefault(require("./dopplerFactor"));
|
||||
var _transforms = require("./transforms");
|
||||
var _sun = require("./sun");
|
||||
var _SatRec = require("./propagation/SatRec.js");
|
||||
var _commonTypes = require("./common-types.js");
|
||||
Object.keys(_commonTypes).forEach(function (key) {
|
||||
if (key === "default" || key === "__esModule") return;
|
||||
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
||||
if (key in exports && exports[key] === _commonTypes[key]) return;
|
||||
Object.defineProperty(exports, key, {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _commonTypes[key];
|
||||
}
|
||||
});
|
||||
});
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
||||
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
"use strict";
|
||||
|
||||
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var constants = _interopRequireWildcard(require("./constants"));
|
||||
var _ext = require("./ext");
|
||||
var _io = require("./io");
|
||||
var _propagation = require("./propagation");
|
||||
var _SatRec = require("./propagation/SatRec.js");
|
||||
var types = _interopRequireWildcard(require("./common-types.js"));
|
||||
var _dopplerFactor = _interopRequireDefault(require("./dopplerFactor"));
|
||||
var _transforms = require("./transforms");
|
||||
var _sun = require("./sun");
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
||||
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
||||
var _default = exports["default"] = Object.assign(Object.assign({
|
||||
constants: constants,
|
||||
// Propagation
|
||||
propagate: _propagation.propagate,
|
||||
sgp4: _propagation.sgp4,
|
||||
twoline2satrec: _io.twoline2satrec,
|
||||
json2satrec: _io.json2satrec,
|
||||
gstime: _propagation.gstime,
|
||||
jday: _ext.jday,
|
||||
invjday: _ext.invjday,
|
||||
dopplerFactor: _dopplerFactor["default"],
|
||||
// Coordinate transforms
|
||||
radiansToDegrees: _transforms.radiansToDegrees,
|
||||
degreesToRadians: _transforms.degreesToRadians,
|
||||
degreesLat: _transforms.degreesLat,
|
||||
degreesLong: _transforms.degreesLong,
|
||||
radiansLat: _transforms.radiansLat,
|
||||
radiansLong: _transforms.radiansLong,
|
||||
geodeticToEcf: _transforms.geodeticToEcf,
|
||||
eciToGeodetic: _transforms.eciToGeodetic,
|
||||
eciToEcf: _transforms.eciToEcf,
|
||||
ecfToEci: _transforms.ecfToEci,
|
||||
ecfToLookAngles: _transforms.ecfToLookAngles,
|
||||
// Sun Position
|
||||
sunPos: _sun.sunPos
|
||||
}, types), {
|
||||
SatRecError: _SatRec.SatRecError
|
||||
});
|
||||
+233
@@ -0,0 +1,233 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.json2satrec = json2satrec;
|
||||
exports.twoline2satrec = twoline2satrec;
|
||||
var _constants = require("./constants");
|
||||
var _ext = require("./ext");
|
||||
var _sgp4init = _interopRequireDefault(require("./propagation/sgp4init"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* function twoline2satrec
|
||||
*
|
||||
* this function converts the two line element set character string data to
|
||||
* variables and initializes the sgp4 variables. several intermediate varaibles
|
||||
* and quantities are determined. note that the result is a structure so multiple
|
||||
* satellites can be processed simultaneously without having to reinitialize. the
|
||||
* verification mode is an important option that permits quick checks of any
|
||||
* changes to the underlying technical theory. this option works using a
|
||||
* modified tle file in which the start, stop, and delta time values are
|
||||
* included at the end of the second line of data. this only works with the
|
||||
* verification mode. the catalog mode simply propagates from -1440 to 1440 min
|
||||
* from epoch and is useful when performing entire catalog runs.
|
||||
*
|
||||
* author : david vallado 719-573-2600 1 mar 2001
|
||||
*
|
||||
* inputs :
|
||||
* longstr1 - first line of the tle
|
||||
* longstr2 - second line of the tle
|
||||
* typerun - type of run verification 'v', catalog 'c',
|
||||
* manual 'm'
|
||||
* typeinput - type of manual input mfe 'm', epoch 'e', dayofyr 'd'
|
||||
* opsmode - mode of operation afspc or improved 'a', 'i'
|
||||
* whichconst - which set of constants to use 72, 84
|
||||
*
|
||||
* outputs :
|
||||
* satrec - structure containing all the sgp4 satellite information
|
||||
*
|
||||
* coupling :
|
||||
* getgravconst-
|
||||
* days2mdhms - conversion of days to month, day, hour, minute, second
|
||||
* jday - convert day month year hour minute second into julian date
|
||||
* sgp4init - initialize the sgp4 variables
|
||||
*
|
||||
* references :
|
||||
* norad spacetrack report #3
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
--------------------------------------------------------------------------- */
|
||||
/**
|
||||
* Return a Satellite imported from two lines of TLE data.
|
||||
*
|
||||
* Provide the two TLE lines as strings `tleLine1` and `tleLine2`,
|
||||
* and select which standard set of gravitational constants you want
|
||||
* by providing `gravity_constants`:
|
||||
*
|
||||
* `sgp4.propagation.wgs72` - Standard WGS 72 model
|
||||
* `sgp4.propagation.wgs84` - More recent WGS 84 model
|
||||
* `sgp4.propagation.wgs72old` - Legacy support for old SGP4 behavior
|
||||
*
|
||||
* Normally, computations are made using letious recent improvements
|
||||
* to the algorithm. If you want to turn some of these off and go
|
||||
* back into "afspc" mode, then set `afspc_mode` to `True`.
|
||||
*/
|
||||
function twoline2satrec(longstr1, longstr2) {
|
||||
var opsmode = 'i';
|
||||
var error = 0;
|
||||
var satnum = longstr1.substring(2, 7);
|
||||
var epochyr = parseInt(longstr1.substring(18, 20), 10);
|
||||
var epochdays = parseFloat(longstr1.substring(20, 32));
|
||||
var ndot = parseFloat(longstr1.substring(33, 43));
|
||||
var nddot = parseFloat("".concat(longstr1.substring(44, 45), ".").concat(longstr1.substring(45, 50), "E").concat(longstr1.substring(50, 52)));
|
||||
var bstar = parseFloat("".concat(longstr1.substring(53, 54), ".").concat(longstr1.substring(54, 59), "E").concat(longstr1.substring(59, 61)));
|
||||
// satrec.satnum = longstr2.substring(2, 7);
|
||||
// ---- find standard orbital elements ----
|
||||
var inclo = parseFloat(longstr2.substring(8, 16)) * _constants.deg2rad;
|
||||
var nodeo = parseFloat(longstr2.substring(17, 25)) * _constants.deg2rad;
|
||||
var ecco = parseFloat(".".concat(longstr2.substring(26, 33).replace(/\s/g, '0')));
|
||||
var argpo = parseFloat(longstr2.substring(34, 42)) * _constants.deg2rad;
|
||||
var mo = parseFloat(longstr2.substring(43, 51)) * _constants.deg2rad;
|
||||
// ---- find no, ndot, nddot ----
|
||||
var no = parseFloat(longstr2.substring(52, 63)) / _constants.xpdotp;
|
||||
// satrec.nddot= satrec.nddot * Math.pow(10.0, nexp);
|
||||
// satrec.bstar= satrec.bstar * Math.pow(10.0, ibexp);
|
||||
// ---- convert to sgp4 units ----
|
||||
// satrec.ndot /= (xpdotp * 1440.0); // ? * minperday
|
||||
// satrec.nddot /= (xpdotp * 1440.0 * 1440);
|
||||
// ----------------------------------------------------------------
|
||||
// find sgp4epoch time of element set
|
||||
// remember that sgp4 uses units of days from 0 jan 1950 (sgp4epoch)
|
||||
// and minutes from the epoch (time)
|
||||
// ----------------------------------------------------------------
|
||||
// ---------------- temp fix for years from 1957-2056 -------------------
|
||||
// --------- correct fix will occur when year is 4-digit in tle ---------
|
||||
var year = epochyr < 57 ? epochyr + 2000 : epochyr + 1900;
|
||||
var mdhmsResult = (0, _ext.days2mdhms)(year, epochdays);
|
||||
var mon = mdhmsResult.mon,
|
||||
day = mdhmsResult.day,
|
||||
hr = mdhmsResult.hr,
|
||||
minute = mdhmsResult.minute,
|
||||
sec = mdhmsResult.sec;
|
||||
var jdsatepoch = (0, _ext.jday)(year, mon, day, hr, minute, sec);
|
||||
var satrec = {
|
||||
error: error,
|
||||
satnum: satnum,
|
||||
epochyr: epochyr,
|
||||
epochdays: epochdays,
|
||||
ndot: ndot,
|
||||
nddot: nddot,
|
||||
bstar: bstar,
|
||||
inclo: inclo,
|
||||
nodeo: nodeo,
|
||||
ecco: ecco,
|
||||
argpo: argpo,
|
||||
mo: mo,
|
||||
no: no,
|
||||
jdsatepoch: jdsatepoch
|
||||
};
|
||||
// ---------------- initialize the orbit at sgp4epoch -------------------
|
||||
(0, _sgp4init["default"])(satrec, {
|
||||
opsmode: opsmode,
|
||||
satn: satrec.satnum,
|
||||
epoch: satrec.jdsatepoch - 2433281.5,
|
||||
xbstar: satrec.bstar,
|
||||
xecco: satrec.ecco,
|
||||
xargpo: satrec.argpo,
|
||||
xinclo: satrec.inclo,
|
||||
xmo: satrec.mo,
|
||||
xno: satrec.no,
|
||||
xnodeo: satrec.nodeo
|
||||
});
|
||||
return satrec;
|
||||
}
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* function json2satrec
|
||||
*
|
||||
* this function converts the OMM json data to variables and initializes the sgp4
|
||||
* variables. several intermediate varaibles and quantities are determined. note
|
||||
* that the result is a structure so multiple satellites can be processed
|
||||
* simultaneously without having to reinitialize. the verification mode is an
|
||||
* important option that permits quick checks of any changes to the underlying
|
||||
* technical theory. this option works using a modified tle file in which the
|
||||
* start, stop, and delta time values are included at the end of the second line
|
||||
* of data. this only works with the verification mode. the catalog mode simply
|
||||
* propagates from -1440 to 1440 min from epoch and is useful when performing
|
||||
* entire catalog runs.
|
||||
*
|
||||
* author : Hariharan Vitaladevuni 18 Aug 2023
|
||||
* Theodore Kruczek 19 Aug 2023
|
||||
*
|
||||
* inputs :
|
||||
* jsonobj - OMM json data
|
||||
* opsmode - mode of operation afspc or improved 'a', 'i'. Default: 'i'.
|
||||
*
|
||||
* outputs :
|
||||
* satrec - structure containing all the sgp4 satellite information
|
||||
*
|
||||
* coupling :
|
||||
* days2mdhms - conversion of days to month, day, hour, minute, second
|
||||
* jday - convert day month year hour minute second into julian date
|
||||
* sgp4init - initialize the sgp4 variables
|
||||
*
|
||||
* warning : the epoch date in OMM format is more accurate than TLE format!
|
||||
* this will result in extremely close, but different
|
||||
* position/velocity values. Depending on your use case, it may
|
||||
* be better to use twoline2satrec, but for the average user this
|
||||
* will provide comparable results.
|
||||
*
|
||||
* references :
|
||||
* https://celestrak.org/NORAD/documentation/gp-data-formats.php
|
||||
--------------------------------------------------------------------------- */
|
||||
function json2satrec(jsonobj) {
|
||||
var opsmode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'i';
|
||||
var error = 0;
|
||||
var satnum = jsonobj.NORAD_CAT_ID.toString();
|
||||
var epoch = new Date(jsonobj.EPOCH.endsWith('Z') ? jsonobj.EPOCH : jsonobj.EPOCH + 'Z');
|
||||
var year = epoch.getUTCFullYear();
|
||||
var epochyr = Number(year.toString().slice(-2));
|
||||
var epochdays = (epoch.valueOf() - new Date(Date.UTC(year, 0, 1, 0, 0, 0)).valueOf()) / (86400 * 1000) + 1;
|
||||
var ndot = Number(jsonobj.MEAN_MOTION_DOT);
|
||||
var nddot = Number(jsonobj.MEAN_MOTION_DDOT);
|
||||
var bstar = Number(jsonobj.BSTAR);
|
||||
var inclo = Number(jsonobj.INCLINATION) * _constants.deg2rad;
|
||||
var nodeo = Number(jsonobj.RA_OF_ASC_NODE) * _constants.deg2rad;
|
||||
var ecco = Number(jsonobj.ECCENTRICITY);
|
||||
var argpo = Number(jsonobj.ARG_OF_PERICENTER) * _constants.deg2rad;
|
||||
var mo = Number(jsonobj.MEAN_ANOMALY) * _constants.deg2rad;
|
||||
var no = Number(jsonobj.MEAN_MOTION) / _constants.xpdotp;
|
||||
// ----------------------------------------------------------------
|
||||
// find sgp4epoch time of element set
|
||||
// remember that sgp4 uses units of days from 0 jan 1950 (sgp4epoch)
|
||||
// and minutes from the epoch (time)
|
||||
// ----------------------------------------------------------------
|
||||
var mdhmsResult = (0, _ext.days2mdhms)(year, epochdays);
|
||||
var mon = mdhmsResult.mon,
|
||||
day = mdhmsResult.day,
|
||||
hr = mdhmsResult.hr,
|
||||
minute = mdhmsResult.minute,
|
||||
sec = mdhmsResult.sec;
|
||||
var jdsatepoch = (0, _ext.jday)(year, mon, day, hr, minute, sec);
|
||||
var satrec = {
|
||||
error: error,
|
||||
satnum: satnum,
|
||||
epochyr: epochyr,
|
||||
epochdays: epochdays,
|
||||
ndot: ndot,
|
||||
nddot: nddot,
|
||||
bstar: bstar,
|
||||
inclo: inclo,
|
||||
nodeo: nodeo,
|
||||
ecco: ecco,
|
||||
argpo: argpo,
|
||||
mo: mo,
|
||||
no: no,
|
||||
jdsatepoch: jdsatepoch
|
||||
};
|
||||
// ---------------- initialize the orbit at sgp4epoch -------------------
|
||||
(0, _sgp4init["default"])(satrec, {
|
||||
opsmode: opsmode,
|
||||
satn: satrec.satnum,
|
||||
epoch: satrec.jdsatepoch - 2433281.5,
|
||||
xbstar: satrec.bstar,
|
||||
xecco: satrec.ecco,
|
||||
xargpo: satrec.argpo,
|
||||
xinclo: satrec.inclo,
|
||||
xmo: satrec.mo,
|
||||
xno: satrec.no,
|
||||
xnodeo: satrec.nodeo
|
||||
});
|
||||
return satrec;
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "gstime", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _gstime["default"];
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "propagate", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _propagate["default"];
|
||||
}
|
||||
});
|
||||
Object.defineProperty(exports, "sgp4", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _sgp["default"];
|
||||
}
|
||||
});
|
||||
var _propagate = _interopRequireDefault(require("./propagation/propagate"));
|
||||
var _sgp = _interopRequireDefault(require("./propagation/sgp4"));
|
||||
var _gstime = _interopRequireDefault(require("./propagation/gstime"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.SatRecError = void 0;
|
||||
var SatRecError;
|
||||
(function (SatRecError) {
|
||||
/**
|
||||
* No error, propagation for the last supplied date is successful
|
||||
*/
|
||||
SatRecError[SatRecError["None"] = 0] = "None";
|
||||
/**
|
||||
* Mean eccentricity is out of range 0 ≤ e < 1
|
||||
*/
|
||||
SatRecError[SatRecError["MeanEccentricityOutOfRange"] = 1] = "MeanEccentricityOutOfRange";
|
||||
/**
|
||||
* Mean motion has fallen below zero.
|
||||
*/
|
||||
SatRecError[SatRecError["MeanMotionBelowZero"] = 2] = "MeanMotionBelowZero";
|
||||
/**
|
||||
* Perturbed eccentricity is out of range 0 ≤ e < 1
|
||||
*/
|
||||
SatRecError[SatRecError["PerturbedEccentricityOutOfRange"] = 3] = "PerturbedEccentricityOutOfRange";
|
||||
/**
|
||||
* Length of the orbit’s semi-latus rectum has fallen below zero.
|
||||
*/
|
||||
SatRecError[SatRecError["SemiLatusRectumBelowZero"] = 4] = "SemiLatusRectumBelowZero";
|
||||
// 5 is not used
|
||||
/**
|
||||
* Orbit has decayed: the computed position is underground.
|
||||
*/
|
||||
SatRecError[SatRecError["Decayed"] = 6] = "Decayed";
|
||||
})(SatRecError || (exports.SatRecError = SatRecError = {}));
|
||||
+244
@@ -0,0 +1,244 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = dpper;
|
||||
var _constants = require("../constants");
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure dpper
|
||||
*
|
||||
* this procedure provides deep space long period periodic contributions
|
||||
* to the mean elements. by design, these periodics are zero at epoch.
|
||||
* this used to be dscom which included initialization, but it's really a
|
||||
* recurring function.
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* e3 -
|
||||
* ee2 -
|
||||
* peo -
|
||||
* pgho -
|
||||
* pho -
|
||||
* pinco -
|
||||
* plo -
|
||||
* se2 , se3 , sgh2, sgh3, sgh4, sh2, sh3, si2, si3, sl2, sl3, sl4 -
|
||||
* t -
|
||||
* xh2, xh3, xi2, xi3, xl2, xl3, xl4 -
|
||||
* zmol -
|
||||
* zmos -
|
||||
* ep - eccentricity 0.0 - 1.0
|
||||
* inclo - inclination - needed for lyddane modification
|
||||
* nodep - right ascension of ascending node
|
||||
* argpp - argument of perigee
|
||||
* mp - mean anomaly
|
||||
*
|
||||
* outputs :
|
||||
* ep - eccentricity 0.0 - 1.0
|
||||
* inclp - inclination
|
||||
* nodep - right ascension of ascending node
|
||||
* argpp - argument of perigee
|
||||
* mp - mean anomaly
|
||||
*
|
||||
* locals :
|
||||
* alfdp -
|
||||
* betdp -
|
||||
* cosip , sinip , cosop , sinop ,
|
||||
* dalf -
|
||||
* dbet -
|
||||
* dls -
|
||||
* f2, f3 -
|
||||
* pe -
|
||||
* pgh -
|
||||
* ph -
|
||||
* pinc -
|
||||
* pl -
|
||||
* sel , ses , sghl , sghs , shl , shs , sil , sinzf , sis ,
|
||||
* sll , sls
|
||||
* xls -
|
||||
* xnoh -
|
||||
* zf -
|
||||
* zm -
|
||||
*
|
||||
* coupling :
|
||||
* none.
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report #3 1980
|
||||
* hoots, norad spacetrack report #6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function dpper(satrec, options) {
|
||||
var e3 = satrec.e3,
|
||||
ee2 = satrec.ee2,
|
||||
peo = satrec.peo,
|
||||
pgho = satrec.pgho,
|
||||
pho = satrec.pho,
|
||||
pinco = satrec.pinco,
|
||||
plo = satrec.plo,
|
||||
se2 = satrec.se2,
|
||||
se3 = satrec.se3,
|
||||
sgh2 = satrec.sgh2,
|
||||
sgh3 = satrec.sgh3,
|
||||
sgh4 = satrec.sgh4,
|
||||
sh2 = satrec.sh2,
|
||||
sh3 = satrec.sh3,
|
||||
si2 = satrec.si2,
|
||||
si3 = satrec.si3,
|
||||
sl2 = satrec.sl2,
|
||||
sl3 = satrec.sl3,
|
||||
sl4 = satrec.sl4,
|
||||
t = satrec.t,
|
||||
xgh2 = satrec.xgh2,
|
||||
xgh3 = satrec.xgh3,
|
||||
xgh4 = satrec.xgh4,
|
||||
xh2 = satrec.xh2,
|
||||
xh3 = satrec.xh3,
|
||||
xi2 = satrec.xi2,
|
||||
xi3 = satrec.xi3,
|
||||
xl2 = satrec.xl2,
|
||||
xl3 = satrec.xl3,
|
||||
xl4 = satrec.xl4,
|
||||
zmol = satrec.zmol,
|
||||
zmos = satrec.zmos;
|
||||
var init = options.init,
|
||||
opsmode = options.opsmode;
|
||||
var ep = options.ep,
|
||||
inclp = options.inclp,
|
||||
nodep = options.nodep,
|
||||
argpp = options.argpp,
|
||||
mp = options.mp;
|
||||
// Copy satellite attributes into local variables for convenience
|
||||
// and symmetry in writing formulae.
|
||||
var alfdp;
|
||||
var betdp;
|
||||
var cosip;
|
||||
var sinip;
|
||||
var cosop;
|
||||
var sinop;
|
||||
var dalf;
|
||||
var dbet;
|
||||
var dls;
|
||||
var f2;
|
||||
var f3;
|
||||
var pe;
|
||||
var pgh;
|
||||
var ph;
|
||||
var pinc;
|
||||
var pl;
|
||||
var sinzf;
|
||||
var xls;
|
||||
var xnoh;
|
||||
var zf;
|
||||
var zm;
|
||||
// ---------------------- constants -----------------------------
|
||||
var zns = 1.19459e-5;
|
||||
var zes = 0.01675;
|
||||
var znl = 1.5835218e-4;
|
||||
var zel = 0.05490;
|
||||
// --------------- calculate time varying periodics -----------
|
||||
zm = zmos + zns * t;
|
||||
// be sure that the initial call has time set to zero
|
||||
if (init === 'y') {
|
||||
zm = zmos;
|
||||
}
|
||||
zf = zm + 2.0 * zes * Math.sin(zm);
|
||||
sinzf = Math.sin(zf);
|
||||
f2 = 0.5 * sinzf * sinzf - 0.25;
|
||||
f3 = -0.5 * sinzf * Math.cos(zf);
|
||||
var ses = se2 * f2 + se3 * f3;
|
||||
var sis = si2 * f2 + si3 * f3;
|
||||
var sls = sl2 * f2 + sl3 * f3 + sl4 * sinzf;
|
||||
var sghs = sgh2 * f2 + sgh3 * f3 + sgh4 * sinzf;
|
||||
var shs = sh2 * f2 + sh3 * f3;
|
||||
zm = zmol + znl * t;
|
||||
if (init === 'y') {
|
||||
zm = zmol;
|
||||
}
|
||||
zf = zm + 2.0 * zel * Math.sin(zm);
|
||||
sinzf = Math.sin(zf);
|
||||
f2 = 0.5 * sinzf * sinzf - 0.25;
|
||||
f3 = -0.5 * sinzf * Math.cos(zf);
|
||||
var sel = ee2 * f2 + e3 * f3;
|
||||
var sil = xi2 * f2 + xi3 * f3;
|
||||
var sll = xl2 * f2 + xl3 * f3 + xl4 * sinzf;
|
||||
var sghl = xgh2 * f2 + xgh3 * f3 + xgh4 * sinzf;
|
||||
var shll = xh2 * f2 + xh3 * f3;
|
||||
pe = ses + sel;
|
||||
pinc = sis + sil;
|
||||
pl = sls + sll;
|
||||
pgh = sghs + sghl;
|
||||
ph = shs + shll;
|
||||
if (init === 'n') {
|
||||
pe -= peo;
|
||||
pinc -= pinco;
|
||||
pl -= plo;
|
||||
pgh -= pgho;
|
||||
ph -= pho;
|
||||
inclp += pinc;
|
||||
ep += pe;
|
||||
sinip = Math.sin(inclp);
|
||||
cosip = Math.cos(inclp);
|
||||
/* ----------------- apply periodics directly ------------ */
|
||||
// sgp4fix for lyddane choice
|
||||
// strn3 used original inclination - this is technically feasible
|
||||
// gsfc used perturbed inclination - also technically feasible
|
||||
// probably best to readjust the 0.2 limit value and limit discontinuity
|
||||
// 0.2 rad = 11.45916 deg
|
||||
// use next line for original strn3 approach and original inclination
|
||||
// if (inclo >= 0.2)
|
||||
// use next line for gsfc version and perturbed inclination
|
||||
if (inclp >= 0.2) {
|
||||
ph /= sinip;
|
||||
pgh -= cosip * ph;
|
||||
argpp += pgh;
|
||||
nodep += ph;
|
||||
mp += pl;
|
||||
} else {
|
||||
// ---- apply periodics with lyddane modification ----
|
||||
sinop = Math.sin(nodep);
|
||||
cosop = Math.cos(nodep);
|
||||
alfdp = sinip * sinop;
|
||||
betdp = sinip * cosop;
|
||||
dalf = ph * cosop + pinc * cosip * sinop;
|
||||
dbet = -ph * sinop + pinc * cosip * cosop;
|
||||
alfdp += dalf;
|
||||
betdp += dbet;
|
||||
nodep %= _constants.twoPi;
|
||||
// sgp4fix for afspc written intrinsic functions
|
||||
// nodep used without a trigonometric function ahead
|
||||
if (nodep < 0.0 && opsmode === 'a') {
|
||||
nodep += _constants.twoPi;
|
||||
}
|
||||
xls = mp + argpp + cosip * nodep;
|
||||
dls = pl + pgh - pinc * nodep * sinip;
|
||||
xls += dls;
|
||||
xnoh = nodep;
|
||||
nodep = Math.atan2(alfdp, betdp);
|
||||
// sgp4fix for afspc written intrinsic functions
|
||||
// nodep used without a trigonometric function ahead
|
||||
if (nodep < 0.0 && opsmode === 'a') {
|
||||
nodep += _constants.twoPi;
|
||||
}
|
||||
if (Math.abs(xnoh - nodep) > _constants.pi) {
|
||||
if (nodep < xnoh) {
|
||||
nodep += _constants.twoPi;
|
||||
} else {
|
||||
nodep -= _constants.twoPi;
|
||||
}
|
||||
}
|
||||
mp += pl;
|
||||
argpp = xls - mp - cosip * nodep;
|
||||
}
|
||||
}
|
||||
return {
|
||||
ep: ep,
|
||||
inclp: inclp,
|
||||
nodep: nodep,
|
||||
argpp: argpp,
|
||||
mp: mp
|
||||
};
|
||||
}
|
||||
+381
@@ -0,0 +1,381 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = dscom;
|
||||
var _constants = require("../constants");
|
||||
/*-----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure dscom
|
||||
*
|
||||
* this procedure provides deep space common items used by both the secular
|
||||
* and periodics subroutines. input is provided as shown. this routine
|
||||
* used to be called dpper, but the functions inside weren't well organized.
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* epoch -
|
||||
* ep - eccentricity
|
||||
* argpp - argument of perigee
|
||||
* tc -
|
||||
* inclp - inclination
|
||||
* nodep - right ascension of ascending node
|
||||
* np - mean motion
|
||||
*
|
||||
* outputs :
|
||||
* sinim , cosim , sinomm , cosomm , snodm , cnodm
|
||||
* day -
|
||||
* e3 -
|
||||
* ee2 -
|
||||
* em - eccentricity
|
||||
* emsq - eccentricity squared
|
||||
* gam -
|
||||
* peo -
|
||||
* pgho -
|
||||
* pho -
|
||||
* pinco -
|
||||
* plo -
|
||||
* rtemsq -
|
||||
* se2, se3 -
|
||||
* sgh2, sgh3, sgh4 -
|
||||
* sh2, sh3, si2, si3, sl2, sl3, sl4 -
|
||||
* s1, s2, s3, s4, s5, s6, s7 -
|
||||
* ss1, ss2, ss3, ss4, ss5, ss6, ss7, sz1, sz2, sz3 -
|
||||
* sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 -
|
||||
* xgh2, xgh3, xgh4, xh2, xh3, xi2, xi3, xl2, xl3, xl4 -
|
||||
* nm - mean motion
|
||||
* z1, z2, z3, z11, z12, z13, z21, z22, z23, z31, z32, z33 -
|
||||
* zmol -
|
||||
* zmos -
|
||||
*
|
||||
* locals :
|
||||
* a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 -
|
||||
* betasq -
|
||||
* cc -
|
||||
* ctem, stem -
|
||||
* x1, x2, x3, x4, x5, x6, x7, x8 -
|
||||
* xnodce -
|
||||
* xnoi -
|
||||
* zcosg , zsing , zcosgl , zsingl , zcosh , zsinh , zcoshl , zsinhl ,
|
||||
* zcosi , zsini , zcosil , zsinil ,
|
||||
* zx -
|
||||
* zy -
|
||||
*
|
||||
* coupling :
|
||||
* none.
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report #3 1980
|
||||
* hoots, norad spacetrack report #6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function dscom(options) {
|
||||
var epoch = options.epoch,
|
||||
ep = options.ep,
|
||||
argpp = options.argpp,
|
||||
tc = options.tc,
|
||||
inclp = options.inclp,
|
||||
nodep = options.nodep,
|
||||
np = options.np;
|
||||
var a1;
|
||||
var a2;
|
||||
var a3;
|
||||
var a4;
|
||||
var a5;
|
||||
var a6;
|
||||
var a7;
|
||||
var a8;
|
||||
var a9;
|
||||
var a10;
|
||||
var cc;
|
||||
var x1;
|
||||
var x2;
|
||||
var x3;
|
||||
var x4;
|
||||
var x5;
|
||||
var x6;
|
||||
var x7;
|
||||
var x8;
|
||||
var zcosg;
|
||||
var zsing;
|
||||
var zcosh;
|
||||
var zsinh;
|
||||
var zcosi;
|
||||
var zsini;
|
||||
var ss1;
|
||||
var ss2;
|
||||
var ss3;
|
||||
var ss4;
|
||||
var ss5;
|
||||
var ss6;
|
||||
var ss7;
|
||||
var sz1;
|
||||
var sz2;
|
||||
var sz3;
|
||||
var sz11;
|
||||
var sz12;
|
||||
var sz13;
|
||||
var sz21;
|
||||
var sz22;
|
||||
var sz23;
|
||||
var sz31;
|
||||
var sz32;
|
||||
var sz33;
|
||||
var s1;
|
||||
var s2;
|
||||
var s3;
|
||||
var s4;
|
||||
var s5;
|
||||
var s6;
|
||||
var s7;
|
||||
var z1;
|
||||
var z2;
|
||||
var z3;
|
||||
var z11;
|
||||
var z12;
|
||||
var z13;
|
||||
var z21;
|
||||
var z22;
|
||||
var z23;
|
||||
var z31;
|
||||
var z32;
|
||||
var z33;
|
||||
// -------------------------- constants -------------------------
|
||||
var zes = 0.01675;
|
||||
var zel = 0.05490;
|
||||
var c1ss = 2.9864797e-6;
|
||||
var c1l = 4.7968065e-7;
|
||||
var zsinis = 0.39785416;
|
||||
var zcosis = 0.91744867;
|
||||
var zcosgs = 0.1945905;
|
||||
var zsings = -0.98088458;
|
||||
// --------------------- local variables ------------------------
|
||||
var nm = np;
|
||||
var em = ep;
|
||||
var snodm = Math.sin(nodep);
|
||||
var cnodm = Math.cos(nodep);
|
||||
var sinomm = Math.sin(argpp);
|
||||
var cosomm = Math.cos(argpp);
|
||||
var sinim = Math.sin(inclp);
|
||||
var cosim = Math.cos(inclp);
|
||||
var emsq = em * em;
|
||||
var betasq = 1.0 - emsq;
|
||||
var rtemsq = Math.sqrt(betasq);
|
||||
// ----------------- initialize lunar solar terms ---------------
|
||||
var peo = 0.0;
|
||||
var pinco = 0.0;
|
||||
var plo = 0.0;
|
||||
var pgho = 0.0;
|
||||
var pho = 0.0;
|
||||
var day = epoch + 18261.5 + tc / 1440.0;
|
||||
var xnodce = (4.5236020 - 9.2422029e-4 * day) % _constants.twoPi;
|
||||
var stem = Math.sin(xnodce);
|
||||
var ctem = Math.cos(xnodce);
|
||||
var zcosil = 0.91375164 - 0.03568096 * ctem;
|
||||
var zsinil = Math.sqrt(1.0 - zcosil * zcosil);
|
||||
var zsinhl = 0.089683511 * stem / zsinil;
|
||||
var zcoshl = Math.sqrt(1.0 - zsinhl * zsinhl);
|
||||
var gam = 5.8351514 + 0.0019443680 * day;
|
||||
var zx = 0.39785416 * stem / zsinil;
|
||||
var zy = zcoshl * ctem + 0.91744867 * zsinhl * stem;
|
||||
zx = Math.atan2(zx, zy);
|
||||
zx += gam - xnodce;
|
||||
var zcosgl = Math.cos(zx);
|
||||
var zsingl = Math.sin(zx);
|
||||
// ------------------------- do solar terms ---------------------
|
||||
zcosg = zcosgs;
|
||||
zsing = zsings;
|
||||
zcosi = zcosis;
|
||||
zsini = zsinis;
|
||||
zcosh = cnodm;
|
||||
zsinh = snodm;
|
||||
cc = c1ss;
|
||||
var xnoi = 1.0 / nm;
|
||||
var lsflg = 0;
|
||||
while (lsflg < 2) {
|
||||
lsflg += 1;
|
||||
a1 = zcosg * zcosh + zsing * zcosi * zsinh;
|
||||
a3 = -zsing * zcosh + zcosg * zcosi * zsinh;
|
||||
a7 = -zcosg * zsinh + zsing * zcosi * zcosh;
|
||||
a8 = zsing * zsini;
|
||||
a9 = zsing * zsinh + zcosg * zcosi * zcosh;
|
||||
a10 = zcosg * zsini;
|
||||
a2 = cosim * a7 + sinim * a8;
|
||||
a4 = cosim * a9 + sinim * a10;
|
||||
a5 = -sinim * a7 + cosim * a8;
|
||||
a6 = -sinim * a9 + cosim * a10;
|
||||
x1 = a1 * cosomm + a2 * sinomm;
|
||||
x2 = a3 * cosomm + a4 * sinomm;
|
||||
x3 = -a1 * sinomm + a2 * cosomm;
|
||||
x4 = -a3 * sinomm + a4 * cosomm;
|
||||
x5 = a5 * sinomm;
|
||||
x6 = a6 * sinomm;
|
||||
x7 = a5 * cosomm;
|
||||
x8 = a6 * cosomm;
|
||||
z31 = 12.0 * x1 * x1 - 3.0 * x3 * x3;
|
||||
z32 = 24.0 * x1 * x2 - 6.0 * x3 * x4;
|
||||
z33 = 12.0 * x2 * x2 - 3.0 * x4 * x4;
|
||||
z1 = 3.0 * (a1 * a1 + a2 * a2) + z31 * emsq;
|
||||
z2 = 6.0 * (a1 * a3 + a2 * a4) + z32 * emsq;
|
||||
z3 = 3.0 * (a3 * a3 + a4 * a4) + z33 * emsq;
|
||||
z11 = -6.0 * a1 * a5 + emsq * (-24.0 * x1 * x7 - 6.0 * x3 * x5);
|
||||
z12 = -6.0 * (a1 * a6 + a3 * a5) + emsq * (-24.0 * (x2 * x7 + x1 * x8) + -6.0 * (x3 * x6 + x4 * x5));
|
||||
z13 = -6.0 * a3 * a6 + emsq * (-24.0 * x2 * x8 - 6.0 * x4 * x6);
|
||||
z21 = 6.0 * a2 * a5 + emsq * (24.0 * x1 * x5 - 6.0 * x3 * x7);
|
||||
z22 = 6.0 * (a4 * a5 + a2 * a6) + emsq * (24.0 * (x2 * x5 + x1 * x6) - 6.0 * (x4 * x7 + x3 * x8));
|
||||
z23 = 6.0 * a4 * a6 + emsq * (24.0 * x2 * x6 - 6.0 * x4 * x8);
|
||||
z1 = z1 + z1 + betasq * z31;
|
||||
z2 = z2 + z2 + betasq * z32;
|
||||
z3 = z3 + z3 + betasq * z33;
|
||||
s3 = cc * xnoi;
|
||||
s2 = -0.5 * s3 / rtemsq;
|
||||
s4 = s3 * rtemsq;
|
||||
s1 = -15.0 * em * s4;
|
||||
s5 = x1 * x3 + x2 * x4;
|
||||
s6 = x2 * x3 + x1 * x4;
|
||||
s7 = x2 * x4 - x1 * x3;
|
||||
// ----------------------- do lunar terms -------------------
|
||||
if (lsflg === 1) {
|
||||
ss1 = s1;
|
||||
ss2 = s2;
|
||||
ss3 = s3;
|
||||
ss4 = s4;
|
||||
ss5 = s5;
|
||||
ss6 = s6;
|
||||
ss7 = s7;
|
||||
sz1 = z1;
|
||||
sz2 = z2;
|
||||
sz3 = z3;
|
||||
sz11 = z11;
|
||||
sz12 = z12;
|
||||
sz13 = z13;
|
||||
sz21 = z21;
|
||||
sz22 = z22;
|
||||
sz23 = z23;
|
||||
sz31 = z31;
|
||||
sz32 = z32;
|
||||
sz33 = z33;
|
||||
zcosg = zcosgl;
|
||||
zsing = zsingl;
|
||||
zcosi = zcosil;
|
||||
zsini = zsinil;
|
||||
zcosh = zcoshl * cnodm + zsinhl * snodm;
|
||||
zsinh = snodm * zcoshl - cnodm * zsinhl;
|
||||
cc = c1l;
|
||||
}
|
||||
}
|
||||
var zmol = (4.7199672 + (0.22997150 * day - gam)) % _constants.twoPi;
|
||||
var zmos = (6.2565837 + 0.017201977 * day) % _constants.twoPi;
|
||||
// ------------------------ do solar terms ----------------------
|
||||
var se2 = 2.0 * ss1 * ss6;
|
||||
var se3 = 2.0 * ss1 * ss7;
|
||||
var si2 = 2.0 * ss2 * sz12;
|
||||
var si3 = 2.0 * ss2 * (sz13 - sz11);
|
||||
var sl2 = -2.0 * ss3 * sz2;
|
||||
var sl3 = -2.0 * ss3 * (sz3 - sz1);
|
||||
var sl4 = -2.0 * ss3 * (-21.0 - 9.0 * emsq) * zes;
|
||||
var sgh2 = 2.0 * ss4 * sz32;
|
||||
var sgh3 = 2.0 * ss4 * (sz33 - sz31);
|
||||
var sgh4 = -18.0 * ss4 * zes;
|
||||
var sh2 = -2.0 * ss2 * sz22;
|
||||
var sh3 = -2.0 * ss2 * (sz23 - sz21);
|
||||
// ------------------------ do lunar terms ----------------------
|
||||
var ee2 = 2.0 * s1 * s6;
|
||||
var e3 = 2.0 * s1 * s7;
|
||||
var xi2 = 2.0 * s2 * z12;
|
||||
var xi3 = 2.0 * s2 * (z13 - z11);
|
||||
var xl2 = -2.0 * s3 * z2;
|
||||
var xl3 = -2.0 * s3 * (z3 - z1);
|
||||
var xl4 = -2.0 * s3 * (-21.0 - 9.0 * emsq) * zel;
|
||||
var xgh2 = 2.0 * s4 * z32;
|
||||
var xgh3 = 2.0 * s4 * (z33 - z31);
|
||||
var xgh4 = -18.0 * s4 * zel;
|
||||
var xh2 = -2.0 * s2 * z22;
|
||||
var xh3 = -2.0 * s2 * (z23 - z21);
|
||||
return {
|
||||
snodm: snodm,
|
||||
cnodm: cnodm,
|
||||
sinim: sinim,
|
||||
cosim: cosim,
|
||||
sinomm: sinomm,
|
||||
cosomm: cosomm,
|
||||
day: day,
|
||||
e3: e3,
|
||||
ee2: ee2,
|
||||
em: em,
|
||||
emsq: emsq,
|
||||
gam: gam,
|
||||
peo: peo,
|
||||
pgho: pgho,
|
||||
pho: pho,
|
||||
pinco: pinco,
|
||||
plo: plo,
|
||||
rtemsq: rtemsq,
|
||||
se2: se2,
|
||||
se3: se3,
|
||||
sgh2: sgh2,
|
||||
sgh3: sgh3,
|
||||
sgh4: sgh4,
|
||||
sh2: sh2,
|
||||
sh3: sh3,
|
||||
si2: si2,
|
||||
si3: si3,
|
||||
sl2: sl2,
|
||||
sl3: sl3,
|
||||
sl4: sl4,
|
||||
s1: s1,
|
||||
s2: s2,
|
||||
s3: s3,
|
||||
s4: s4,
|
||||
s5: s5,
|
||||
s6: s6,
|
||||
s7: s7,
|
||||
ss1: ss1,
|
||||
ss2: ss2,
|
||||
ss3: ss3,
|
||||
ss4: ss4,
|
||||
ss5: ss5,
|
||||
ss6: ss6,
|
||||
ss7: ss7,
|
||||
sz1: sz1,
|
||||
sz2: sz2,
|
||||
sz3: sz3,
|
||||
sz11: sz11,
|
||||
sz12: sz12,
|
||||
sz13: sz13,
|
||||
sz21: sz21,
|
||||
sz22: sz22,
|
||||
sz23: sz23,
|
||||
sz31: sz31,
|
||||
sz32: sz32,
|
||||
sz33: sz33,
|
||||
xgh2: xgh2,
|
||||
xgh3: xgh3,
|
||||
xgh4: xgh4,
|
||||
xh2: xh2,
|
||||
xh3: xh3,
|
||||
xi2: xi2,
|
||||
xi3: xi3,
|
||||
xl2: xl2,
|
||||
xl3: xl3,
|
||||
xl4: xl4,
|
||||
nm: nm,
|
||||
z1: z1,
|
||||
z2: z2,
|
||||
z3: z3,
|
||||
z11: z11,
|
||||
z12: z12,
|
||||
z13: z13,
|
||||
z21: z21,
|
||||
z22: z22,
|
||||
z23: z23,
|
||||
z31: z31,
|
||||
z32: z32,
|
||||
z33: z33,
|
||||
zmol: zmol,
|
||||
zmos: zmos
|
||||
};
|
||||
}
|
||||
+389
@@ -0,0 +1,389 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = dsinit;
|
||||
var _constants = require("../constants");
|
||||
/*-----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure dsinit
|
||||
*
|
||||
* this procedure provides deep space contributions to mean motion dot due
|
||||
* to geopotential resonance with half day and one day orbits.
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* cosim, sinim-
|
||||
* emsq - eccentricity squared
|
||||
* argpo - argument of perigee
|
||||
* s1, s2, s3, s4, s5 -
|
||||
* ss1, ss2, ss3, ss4, ss5 -
|
||||
* sz1, sz3, sz11, sz13, sz21, sz23, sz31, sz33 -
|
||||
* t - time
|
||||
* tc -
|
||||
* gsto - greenwich sidereal time rad
|
||||
* mo - mean anomaly
|
||||
* mdot - mean anomaly dot (rate)
|
||||
* no - mean motion
|
||||
* nodeo - right ascension of ascending node
|
||||
* nodedot - right ascension of ascending node dot (rate)
|
||||
* xpidot -
|
||||
* z1, z3, z11, z13, z21, z23, z31, z33 -
|
||||
* eccm - eccentricity
|
||||
* argpm - argument of perigee
|
||||
* inclm - inclination
|
||||
* mm - mean anomaly
|
||||
* xn - mean motion
|
||||
* nodem - right ascension of ascending node
|
||||
*
|
||||
* outputs :
|
||||
* em - eccentricity
|
||||
* argpm - argument of perigee
|
||||
* inclm - inclination
|
||||
* mm - mean anomaly
|
||||
* nm - mean motion
|
||||
* nodem - right ascension of ascending node
|
||||
* irez - flag for resonance 0-none, 1-one day, 2-half day
|
||||
* atime -
|
||||
* d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433 -
|
||||
* dedt -
|
||||
* didt -
|
||||
* dmdt -
|
||||
* dndt -
|
||||
* dnodt -
|
||||
* domdt -
|
||||
* del1, del2, del3 -
|
||||
* ses , sghl , sghs , sgs , shl , shs , sis , sls
|
||||
* theta -
|
||||
* xfact -
|
||||
* xlamo -
|
||||
* xli -
|
||||
* xni
|
||||
*
|
||||
* locals :
|
||||
* ainv2 -
|
||||
* aonv -
|
||||
* cosisq -
|
||||
* eoc -
|
||||
* f220, f221, f311, f321, f322, f330, f441, f442, f522, f523, f542, f543 -
|
||||
* g200, g201, g211, g300, g310, g322, g410, g422, g520, g521, g532, g533 -
|
||||
* sini2 -
|
||||
* temp -
|
||||
* temp1 -
|
||||
* theta -
|
||||
* xno2 -
|
||||
*
|
||||
* coupling :
|
||||
* getgravconst
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report #3 1980
|
||||
* hoots, norad spacetrack report #6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function dsinit(options) {
|
||||
var cosim = options.cosim,
|
||||
argpo = options.argpo,
|
||||
s1 = options.s1,
|
||||
s2 = options.s2,
|
||||
s3 = options.s3,
|
||||
s4 = options.s4,
|
||||
s5 = options.s5,
|
||||
sinim = options.sinim,
|
||||
ss1 = options.ss1,
|
||||
ss2 = options.ss2,
|
||||
ss3 = options.ss3,
|
||||
ss4 = options.ss4,
|
||||
ss5 = options.ss5,
|
||||
sz1 = options.sz1,
|
||||
sz3 = options.sz3,
|
||||
sz11 = options.sz11,
|
||||
sz13 = options.sz13,
|
||||
sz21 = options.sz21,
|
||||
sz23 = options.sz23,
|
||||
sz31 = options.sz31,
|
||||
sz33 = options.sz33,
|
||||
t = options.t,
|
||||
tc = options.tc,
|
||||
gsto = options.gsto,
|
||||
mo = options.mo,
|
||||
mdot = options.mdot,
|
||||
no = options.no,
|
||||
nodeo = options.nodeo,
|
||||
nodedot = options.nodedot,
|
||||
xpidot = options.xpidot,
|
||||
z1 = options.z1,
|
||||
z3 = options.z3,
|
||||
z11 = options.z11,
|
||||
z13 = options.z13,
|
||||
z21 = options.z21,
|
||||
z23 = options.z23,
|
||||
z31 = options.z31,
|
||||
z33 = options.z33,
|
||||
ecco = options.ecco,
|
||||
eccsq = options.eccsq;
|
||||
var emsq = options.emsq,
|
||||
em = options.em,
|
||||
argpm = options.argpm,
|
||||
inclm = options.inclm,
|
||||
mm = options.mm,
|
||||
nm = options.nm,
|
||||
nodem = options.nodem,
|
||||
irez = options.irez,
|
||||
atime = options.atime,
|
||||
d2201 = options.d2201,
|
||||
d2211 = options.d2211,
|
||||
d3210 = options.d3210,
|
||||
d3222 = options.d3222,
|
||||
d4410 = options.d4410,
|
||||
d4422 = options.d4422,
|
||||
d5220 = options.d5220,
|
||||
d5232 = options.d5232,
|
||||
d5421 = options.d5421,
|
||||
d5433 = options.d5433,
|
||||
dedt = options.dedt,
|
||||
didt = options.didt,
|
||||
dmdt = options.dmdt,
|
||||
dnodt = options.dnodt,
|
||||
domdt = options.domdt,
|
||||
del1 = options.del1,
|
||||
del2 = options.del2,
|
||||
del3 = options.del3,
|
||||
xfact = options.xfact,
|
||||
xlamo = options.xlamo,
|
||||
xli = options.xli,
|
||||
xni = options.xni;
|
||||
var f220;
|
||||
var f221;
|
||||
var f311;
|
||||
var f321;
|
||||
var f322;
|
||||
var f330;
|
||||
var f441;
|
||||
var f442;
|
||||
var f522;
|
||||
var f523;
|
||||
var f542;
|
||||
var f543;
|
||||
var g200;
|
||||
var g201;
|
||||
var g211;
|
||||
var g300;
|
||||
var g310;
|
||||
var g322;
|
||||
var g410;
|
||||
var g422;
|
||||
var g520;
|
||||
var g521;
|
||||
var g532;
|
||||
var g533;
|
||||
var sini2;
|
||||
var temp;
|
||||
var temp1;
|
||||
var xno2;
|
||||
var ainv2;
|
||||
var aonv;
|
||||
var cosisq;
|
||||
var eoc;
|
||||
var q22 = 1.7891679e-6;
|
||||
var q31 = 2.1460748e-6;
|
||||
var q33 = 2.2123015e-7;
|
||||
var root22 = 1.7891679e-6;
|
||||
var root44 = 7.3636953e-9;
|
||||
var root54 = 2.1765803e-9;
|
||||
// eslint-disable-next-line no-loss-of-precision
|
||||
var rptim = 4.37526908801129966e-3; // equates to 7.29211514668855e-5 rad/sec
|
||||
var root32 = 3.7393792e-7;
|
||||
var root52 = 1.1428639e-7;
|
||||
var znl = 1.5835218e-4;
|
||||
var zns = 1.19459e-5;
|
||||
// -------------------- deep space initialization ------------
|
||||
irez = 0;
|
||||
if (nm < 0.0052359877 && nm > 0.0034906585) {
|
||||
irez = 1;
|
||||
}
|
||||
if (nm >= 8.26e-3 && nm <= 9.24e-3 && em >= 0.5) {
|
||||
irez = 2;
|
||||
}
|
||||
// ------------------------ do solar terms -------------------
|
||||
var ses = ss1 * zns * ss5;
|
||||
var sis = ss2 * zns * (sz11 + sz13);
|
||||
var sls = -zns * ss3 * (sz1 + sz3 - 14.0 - 6.0 * emsq);
|
||||
var sghs = ss4 * zns * (sz31 + sz33 - 6.0);
|
||||
var shs = -zns * ss2 * (sz21 + sz23);
|
||||
// sgp4fix for 180 deg incl
|
||||
if (inclm < 5.2359877e-2 || inclm > _constants.pi - 5.2359877e-2) {
|
||||
shs = 0.0;
|
||||
}
|
||||
if (sinim !== 0.0) {
|
||||
shs /= sinim;
|
||||
}
|
||||
var sgs = sghs - cosim * shs;
|
||||
// ------------------------- do lunar terms ------------------
|
||||
dedt = ses + s1 * znl * s5;
|
||||
didt = sis + s2 * znl * (z11 + z13);
|
||||
dmdt = sls - znl * s3 * (z1 + z3 - 14.0 - 6.0 * emsq);
|
||||
var sghl = s4 * znl * (z31 + z33 - 6.0);
|
||||
var shll = -znl * s2 * (z21 + z23);
|
||||
// sgp4fix for 180 deg incl
|
||||
if (inclm < 5.2359877e-2 || inclm > _constants.pi - 5.2359877e-2) {
|
||||
shll = 0.0;
|
||||
}
|
||||
domdt = sgs + sghl;
|
||||
dnodt = shs;
|
||||
if (sinim !== 0.0) {
|
||||
domdt -= cosim / sinim * shll;
|
||||
dnodt += shll / sinim;
|
||||
}
|
||||
// ----------- calculate deep space resonance effects --------
|
||||
var dndt = 0.0;
|
||||
var theta = (gsto + tc * rptim) % _constants.twoPi;
|
||||
em += dedt * t;
|
||||
inclm += didt * t;
|
||||
argpm += domdt * t;
|
||||
nodem += dnodt * t;
|
||||
mm += dmdt * t;
|
||||
// sgp4fix for negative inclinations
|
||||
// the following if statement should be commented out
|
||||
// if (inclm < 0.0)
|
||||
// {
|
||||
// inclm = -inclm;
|
||||
// argpm = argpm - pi;
|
||||
// nodem = nodem + pi;
|
||||
// }
|
||||
// -------------- initialize the resonance terms -------------
|
||||
if (irez !== 0) {
|
||||
aonv = Math.pow(nm / _constants.xke, _constants.x2o3);
|
||||
// ---------- geopotential resonance for 12 hour orbits ------
|
||||
if (irez === 2) {
|
||||
cosisq = cosim * cosim;
|
||||
var emo = em;
|
||||
em = ecco;
|
||||
var emsqo = emsq;
|
||||
emsq = eccsq;
|
||||
eoc = em * emsq;
|
||||
g201 = -0.306 - (em - 0.64) * 0.440;
|
||||
if (em <= 0.65) {
|
||||
g211 = 3.616 - 13.2470 * em + 16.2900 * emsq;
|
||||
g310 = -19.302 + 117.3900 * em - 228.4190 * emsq + 156.5910 * eoc;
|
||||
g322 = -18.9068 + 109.7927 * em - 214.6334 * emsq + 146.5816 * eoc;
|
||||
g410 = -41.122 + 242.6940 * em - 471.0940 * emsq + 313.9530 * eoc;
|
||||
g422 = -146.407 + 841.8800 * em - 1629.014 * emsq + 1083.4350 * eoc;
|
||||
g520 = -532.114 + 3017.977 * em - 5740.032 * emsq + 3708.2760 * eoc;
|
||||
} else {
|
||||
g211 = -72.099 + 331.819 * em - 508.738 * emsq + 266.724 * eoc;
|
||||
g310 = -346.844 + 1582.851 * em - 2415.925 * emsq + 1246.113 * eoc;
|
||||
g322 = -342.585 + 1554.908 * em - 2366.899 * emsq + 1215.972 * eoc;
|
||||
g410 = -1052.797 + 4758.686 * em - 7193.992 * emsq + 3651.957 * eoc;
|
||||
g422 = -3581.690 + 16178.110 * em - 24462.770 * emsq + 12422.520 * eoc;
|
||||
if (em > 0.715) {
|
||||
g520 = -5149.66 + 29936.92 * em - 54087.36 * emsq + 31324.56 * eoc;
|
||||
} else {
|
||||
g520 = 1464.74 - 4664.75 * em + 3763.64 * emsq;
|
||||
}
|
||||
}
|
||||
if (em < 0.7) {
|
||||
g533 = -919.22770 + 4988.6100 * em - 9064.7700 * emsq + 5542.21 * eoc;
|
||||
g521 = -822.71072 + 4568.6173 * em - 8491.4146 * emsq + 5337.524 * eoc;
|
||||
g532 = -853.66600 + 4690.2500 * em - 8624.7700 * emsq + 5341.4 * eoc;
|
||||
} else {
|
||||
g533 = -37995.780 + 161616.52 * em - 229838.20 * emsq + 109377.94 * eoc;
|
||||
g521 = -51752.104 + 218913.95 * em - 309468.16 * emsq + 146349.42 * eoc;
|
||||
g532 = -40023.880 + 170470.89 * em - 242699.48 * emsq + 115605.82 * eoc;
|
||||
}
|
||||
sini2 = sinim * sinim;
|
||||
f220 = 0.75 * (1.0 + 2.0 * cosim + cosisq);
|
||||
f221 = 1.5 * sini2;
|
||||
f321 = 1.875 * sinim * (1.0 - 2.0 * cosim - 3.0 * cosisq);
|
||||
f322 = -1.875 * sinim * (1.0 + 2.0 * cosim - 3.0 * cosisq);
|
||||
f441 = 35.0 * sini2 * f220;
|
||||
f442 = 39.3750 * sini2 * sini2;
|
||||
f522 = 9.84375 * sinim * (sini2 * (1.0 - 2.0 * cosim - 5.0 * cosisq) + 0.33333333 * (-2.0 + 4.0 * cosim + 6.0 * cosisq));
|
||||
f523 = sinim * (4.92187512 * sini2 * (-2.0 - 4.0 * cosim + 10.0 * cosisq) + 6.56250012 * (1.0 + 2.0 * cosim - 3.0 * cosisq));
|
||||
f542 = 29.53125 * sinim * (2.0 - 8.0 * cosim + cosisq * (-12.0 + 8.0 * cosim + 10.0 * cosisq));
|
||||
f543 = 29.53125 * sinim * (-2.0 - 8.0 * cosim + cosisq * (12.0 + 8.0 * cosim - 10.0 * cosisq));
|
||||
xno2 = nm * nm;
|
||||
ainv2 = aonv * aonv;
|
||||
temp1 = 3.0 * xno2 * ainv2;
|
||||
temp = temp1 * root22;
|
||||
d2201 = temp * f220 * g201;
|
||||
d2211 = temp * f221 * g211;
|
||||
temp1 *= aonv;
|
||||
temp = temp1 * root32;
|
||||
d3210 = temp * f321 * g310;
|
||||
d3222 = temp * f322 * g322;
|
||||
temp1 *= aonv;
|
||||
temp = 2.0 * temp1 * root44;
|
||||
d4410 = temp * f441 * g410;
|
||||
d4422 = temp * f442 * g422;
|
||||
temp1 *= aonv;
|
||||
temp = temp1 * root52;
|
||||
d5220 = temp * f522 * g520;
|
||||
d5232 = temp * f523 * g532;
|
||||
temp = 2.0 * temp1 * root54;
|
||||
d5421 = temp * f542 * g521;
|
||||
d5433 = temp * f543 * g533;
|
||||
xlamo = (mo + nodeo + nodeo - (theta + theta)) % _constants.twoPi;
|
||||
xfact = mdot + dmdt + 2.0 * (nodedot + dnodt - rptim) - no;
|
||||
em = emo;
|
||||
emsq = emsqo;
|
||||
}
|
||||
// ---------------- synchronous resonance terms --------------
|
||||
if (irez === 1) {
|
||||
g200 = 1.0 + emsq * (-2.5 + 0.8125 * emsq);
|
||||
g310 = 1.0 + 2.0 * emsq;
|
||||
g300 = 1.0 + emsq * (-6.0 + 6.60937 * emsq);
|
||||
f220 = 0.75 * (1.0 + cosim) * (1.0 + cosim);
|
||||
f311 = 0.9375 * sinim * sinim * (1.0 + 3.0 * cosim) - 0.75 * (1.0 + cosim);
|
||||
f330 = 1.0 + cosim;
|
||||
f330 *= 1.875 * f330 * f330;
|
||||
del1 = 3.0 * nm * nm * aonv * aonv;
|
||||
del2 = 2.0 * del1 * f220 * g200 * q22;
|
||||
del3 = 3.0 * del1 * f330 * g300 * q33 * aonv;
|
||||
del1 = del1 * f311 * g310 * q31 * aonv;
|
||||
xlamo = (mo + nodeo + argpo - theta) % _constants.twoPi;
|
||||
xfact = mdot + xpidot + dmdt + domdt + dnodt - (no + rptim);
|
||||
}
|
||||
// ------------ for sgp4, initialize the integrator ----------
|
||||
xli = xlamo;
|
||||
xni = no;
|
||||
atime = 0.0;
|
||||
nm = no + dndt;
|
||||
}
|
||||
return {
|
||||
em: em,
|
||||
argpm: argpm,
|
||||
inclm: inclm,
|
||||
mm: mm,
|
||||
nm: nm,
|
||||
nodem: nodem,
|
||||
irez: irez,
|
||||
atime: atime,
|
||||
d2201: d2201,
|
||||
d2211: d2211,
|
||||
d3210: d3210,
|
||||
d3222: d3222,
|
||||
d4410: d4410,
|
||||
d4422: d4422,
|
||||
d5220: d5220,
|
||||
d5232: d5232,
|
||||
d5421: d5421,
|
||||
d5433: d5433,
|
||||
dedt: dedt,
|
||||
didt: didt,
|
||||
dmdt: dmdt,
|
||||
dndt: dndt,
|
||||
dnodt: dnodt,
|
||||
domdt: domdt,
|
||||
del1: del1,
|
||||
del2: del2,
|
||||
del3: del3,
|
||||
xfact: xfact,
|
||||
xlamo: xlamo,
|
||||
xli: xli,
|
||||
xni: xni
|
||||
};
|
||||
}
|
||||
+230
@@ -0,0 +1,230 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = dspace;
|
||||
var _constants = require("../constants");
|
||||
/*-----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure dspace
|
||||
*
|
||||
* this procedure provides deep space contributions to mean elements for
|
||||
* perturbing third body. these effects have been averaged over one
|
||||
* revolution of the sun and moon. for earth resonance effects, the
|
||||
* effects have been averaged over no revolutions of the satellite.
|
||||
* (mean motion)
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433 -
|
||||
* dedt -
|
||||
* del1, del2, del3 -
|
||||
* didt -
|
||||
* dmdt -
|
||||
* dnodt -
|
||||
* domdt -
|
||||
* irez - flag for resonance 0-none, 1-one day, 2-half day
|
||||
* argpo - argument of perigee
|
||||
* argpdot - argument of perigee dot (rate)
|
||||
* t - time
|
||||
* tc -
|
||||
* gsto - gst
|
||||
* xfact -
|
||||
* xlamo -
|
||||
* no - mean motion
|
||||
* atime -
|
||||
* em - eccentricity
|
||||
* ft -
|
||||
* argpm - argument of perigee
|
||||
* inclm - inclination
|
||||
* xli -
|
||||
* mm - mean anomaly
|
||||
* xni - mean motion
|
||||
* nodem - right ascension of ascending node
|
||||
*
|
||||
* outputs :
|
||||
* atime -
|
||||
* em - eccentricity
|
||||
* argpm - argument of perigee
|
||||
* inclm - inclination
|
||||
* xli -
|
||||
* mm - mean anomaly
|
||||
* xni -
|
||||
* nodem - right ascension of ascending node
|
||||
* dndt -
|
||||
* nm - mean motion
|
||||
*
|
||||
* locals :
|
||||
* delt -
|
||||
* ft -
|
||||
* theta -
|
||||
* x2li -
|
||||
* x2omi -
|
||||
* xl -
|
||||
* xldot -
|
||||
* xnddt -
|
||||
* xndt -
|
||||
* xomi -
|
||||
*
|
||||
* coupling :
|
||||
* none -
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report #3 1980
|
||||
* hoots, norad spacetrack report #6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function dspace(options) {
|
||||
var irez = options.irez,
|
||||
d2201 = options.d2201,
|
||||
d2211 = options.d2211,
|
||||
d3210 = options.d3210,
|
||||
d3222 = options.d3222,
|
||||
d4410 = options.d4410,
|
||||
d4422 = options.d4422,
|
||||
d5220 = options.d5220,
|
||||
d5232 = options.d5232,
|
||||
d5421 = options.d5421,
|
||||
d5433 = options.d5433,
|
||||
dedt = options.dedt,
|
||||
del1 = options.del1,
|
||||
del2 = options.del2,
|
||||
del3 = options.del3,
|
||||
didt = options.didt,
|
||||
dmdt = options.dmdt,
|
||||
dnodt = options.dnodt,
|
||||
domdt = options.domdt,
|
||||
argpo = options.argpo,
|
||||
argpdot = options.argpdot,
|
||||
t = options.t,
|
||||
tc = options.tc,
|
||||
gsto = options.gsto,
|
||||
xfact = options.xfact,
|
||||
xlamo = options.xlamo,
|
||||
no = options.no;
|
||||
var atime = options.atime,
|
||||
em = options.em,
|
||||
argpm = options.argpm,
|
||||
inclm = options.inclm,
|
||||
xli = options.xli,
|
||||
mm = options.mm,
|
||||
xni = options.xni,
|
||||
nodem = options.nodem,
|
||||
nm = options.nm;
|
||||
var fasx2 = 0.13130908;
|
||||
var fasx4 = 2.8843198;
|
||||
var fasx6 = 0.37448087;
|
||||
var g22 = 5.7686396;
|
||||
var g32 = 0.95240898;
|
||||
var g44 = 1.8014998;
|
||||
var g52 = 1.0508330;
|
||||
var g54 = 4.4108898;
|
||||
// eslint-disable-next-line no-loss-of-precision
|
||||
var rptim = 4.37526908801129966e-3; // equates to 7.29211514668855e-5 rad/sec
|
||||
var stepp = 720.0;
|
||||
var stepn = -720.0;
|
||||
var step2 = 259200.0;
|
||||
var delt;
|
||||
var x2li;
|
||||
var x2omi;
|
||||
var xl;
|
||||
var xldot;
|
||||
var xnddt;
|
||||
var xndt;
|
||||
var xomi;
|
||||
var dndt = 0.0;
|
||||
var ft = 0.0;
|
||||
// ----------- calculate deep space resonance effects -----------
|
||||
var theta = (gsto + tc * rptim) % _constants.twoPi;
|
||||
em += dedt * t;
|
||||
inclm += didt * t;
|
||||
argpm += domdt * t;
|
||||
nodem += dnodt * t;
|
||||
mm += dmdt * t;
|
||||
// sgp4fix for negative inclinations
|
||||
// the following if statement should be commented out
|
||||
// if (inclm < 0.0)
|
||||
// {
|
||||
// inclm = -inclm;
|
||||
// argpm = argpm - pi;
|
||||
// nodem = nodem + pi;
|
||||
// }
|
||||
/* - update resonances : numerical (euler-maclaurin) integration - */
|
||||
/* ------------------------- epoch restart ---------------------- */
|
||||
// sgp4fix for propagator problems
|
||||
// the following integration works for negative time steps and periods
|
||||
// the specific changes are unknown because the original code was so convoluted
|
||||
// sgp4fix take out atime = 0.0 and fix for faster operation
|
||||
if (irez !== 0) {
|
||||
// sgp4fix streamline check
|
||||
if (atime === 0.0 || t * atime <= 0.0 || Math.abs(t) < Math.abs(atime)) {
|
||||
atime = 0.0;
|
||||
xni = no;
|
||||
xli = xlamo;
|
||||
}
|
||||
// sgp4fix move check outside loop
|
||||
if (t > 0.0) {
|
||||
delt = stepp;
|
||||
} else {
|
||||
delt = stepn;
|
||||
}
|
||||
var iretn = 381; // added for do loop
|
||||
while (iretn === 381) {
|
||||
// ------------------- dot terms calculated -------------
|
||||
// ----------- near - synchronous resonance terms -------
|
||||
if (irez !== 2) {
|
||||
xndt = del1 * Math.sin(xli - fasx2) + del2 * Math.sin(2.0 * (xli - fasx4)) + del3 * Math.sin(3.0 * (xli - fasx6));
|
||||
xldot = xni + xfact;
|
||||
xnddt = del1 * Math.cos(xli - fasx2) + 2.0 * del2 * Math.cos(2.0 * (xli - fasx4)) + 3.0 * del3 * Math.cos(3.0 * (xli - fasx6));
|
||||
xnddt *= xldot;
|
||||
} else {
|
||||
// --------- near - half-day resonance terms --------
|
||||
xomi = argpo + argpdot * atime;
|
||||
x2omi = xomi + xomi;
|
||||
x2li = xli + xli;
|
||||
xndt = d2201 * Math.sin(x2omi + xli - g22) + d2211 * Math.sin(xli - g22) + d3210 * Math.sin(xomi + xli - g32) + d3222 * Math.sin(-xomi + xli - g32) + d4410 * Math.sin(x2omi + x2li - g44) + d4422 * Math.sin(x2li - g44) + d5220 * Math.sin(xomi + xli - g52) + d5232 * Math.sin(-xomi + xli - g52) + d5421 * Math.sin(xomi + x2li - g54) + d5433 * Math.sin(-xomi + x2li - g54);
|
||||
xldot = xni + xfact;
|
||||
xnddt = d2201 * Math.cos(x2omi + xli - g22) + d2211 * Math.cos(xli - g22) + d3210 * Math.cos(xomi + xli - g32) + d3222 * Math.cos(-xomi + xli - g32) + d5220 * Math.cos(xomi + xli - g52) + d5232 * Math.cos(-xomi + xli - g52) + 2.0 * (d4410 * Math.cos(x2omi + x2li - g44) + d4422 * Math.cos(x2li - g44) + d5421 * Math.cos(xomi + x2li - g54) + d5433 * Math.cos(-xomi + x2li - g54));
|
||||
xnddt *= xldot;
|
||||
}
|
||||
// ----------------------- integrator -------------------
|
||||
// sgp4fix move end checks to end of routine
|
||||
if (Math.abs(t - atime) >= stepp) {
|
||||
iretn = 381;
|
||||
} else {
|
||||
ft = t - atime;
|
||||
iretn = 0;
|
||||
}
|
||||
if (iretn === 381) {
|
||||
xli += xldot * delt + xndt * step2;
|
||||
xni += xndt * delt + xnddt * step2;
|
||||
atime += delt;
|
||||
}
|
||||
}
|
||||
nm = xni + xndt * ft + xnddt * ft * ft * 0.5;
|
||||
xl = xli + xldot * ft + xndt * ft * ft * 0.5;
|
||||
if (irez !== 1) {
|
||||
mm = xl - 2.0 * nodem + 2.0 * theta;
|
||||
dndt = nm - no;
|
||||
} else {
|
||||
mm = xl - nodem - argpm + theta;
|
||||
dndt = nm - no;
|
||||
}
|
||||
nm = no + dndt;
|
||||
}
|
||||
return {
|
||||
atime: atime,
|
||||
em: em,
|
||||
argpm: argpm,
|
||||
inclm: inclm,
|
||||
xli: xli,
|
||||
mm: mm,
|
||||
xni: xni,
|
||||
nodem: nodem,
|
||||
dndt: dndt,
|
||||
nm: nm
|
||||
};
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = void 0;
|
||||
var _constants = require("../constants");
|
||||
var _ext = require("../ext");
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* function gstime
|
||||
*
|
||||
* this function finds the greenwich sidereal time.
|
||||
*
|
||||
* author : david vallado 719-573-2600 1 mar 2001
|
||||
*
|
||||
* inputs description range / units
|
||||
* jdut1 - julian date in ut1 days from 4713 bc
|
||||
*
|
||||
* outputs :
|
||||
* gstime - greenwich sidereal time 0 to 2pi rad
|
||||
*
|
||||
* locals :
|
||||
* temp - temporary variable for doubles rad
|
||||
* tut1 - julian centuries from the
|
||||
* jan 1, 2000 12 h epoch (ut1)
|
||||
*
|
||||
* coupling :
|
||||
* none
|
||||
*
|
||||
* references :
|
||||
* vallado 2004, 191, eq 3-45
|
||||
* --------------------------------------------------------------------------- */
|
||||
function gstimeInternal(jdut1) {
|
||||
var tut1 = (jdut1 - 2451545.0) / 36525.0;
|
||||
var temp = -6.2e-6 * tut1 * tut1 * tut1 + 0.093104 * tut1 * tut1 + (876600.0 * 3600 + 8640184.812866) * tut1 + 67310.54841; // # sec
|
||||
temp = temp * _constants.deg2rad / 240.0 % _constants.twoPi; // 360/86400 = 1/240, to deg, to rad
|
||||
// ------------------------ check quadrants ---------------------
|
||||
if (temp < 0.0) {
|
||||
temp += _constants.twoPi;
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
function gstime(first, month, day, hour, minute, second, millisecond) {
|
||||
if (first instanceof Date) {
|
||||
return gstimeInternal((0, _ext.jday)(first));
|
||||
} else if (month !== undefined) {
|
||||
return gstimeInternal((0, _ext.jday)(first, month, day, hour, minute, second, millisecond));
|
||||
} else {
|
||||
return gstimeInternal(first);
|
||||
}
|
||||
}
|
||||
var _default = exports["default"] = gstime;
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = initl;
|
||||
var _constants = require("../constants");
|
||||
var _gstime = _interopRequireDefault(require("./gstime"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
/*-----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure initl
|
||||
*
|
||||
* this procedure initializes the sgp4 propagator. all the initialization is
|
||||
* consolidated here instead of having multiple loops inside other routines.
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* ecco - eccentricity 0.0 - 1.0
|
||||
* epoch - epoch time in days from jan 0, 1950. 0 hr
|
||||
* inclo - inclination of satellite
|
||||
* no - mean motion of satellite
|
||||
* satn - satellite number
|
||||
*
|
||||
* outputs :
|
||||
* ainv - 1.0 / a
|
||||
* ao - semi major axis
|
||||
* con41 -
|
||||
* con42 - 1.0 - 5.0 cos(i)
|
||||
* cosio - cosine of inclination
|
||||
* cosio2 - cosio squared
|
||||
* eccsq - eccentricity squared
|
||||
* method - flag for deep space 'd', 'n'
|
||||
* omeosq - 1.0 - ecco * ecco
|
||||
* posq - semi-parameter squared
|
||||
* rp - radius of perigee
|
||||
* rteosq - square root of (1.0 - ecco*ecco)
|
||||
* sinio - sine of inclination
|
||||
* gsto - gst at time of observation rad
|
||||
* no - mean motion of satellite
|
||||
*
|
||||
* locals :
|
||||
* ak -
|
||||
* d1 -
|
||||
* del -
|
||||
* adel -
|
||||
* po -
|
||||
*
|
||||
* coupling :
|
||||
* getgravconst
|
||||
* gstime - find greenwich sidereal time from the julian date
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report #3 1980
|
||||
* hoots, norad spacetrack report #6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function initl(options) {
|
||||
var ecco = options.ecco,
|
||||
epoch = options.epoch,
|
||||
inclo = options.inclo,
|
||||
opsmode = options.opsmode;
|
||||
var no = options.no;
|
||||
// sgp4fix use old way of finding gst
|
||||
// ----------------------- earth constants ---------------------
|
||||
// sgp4fix identify constants and allow alternate values
|
||||
// ------------- calculate auxillary epoch quantities ----------
|
||||
var eccsq = ecco * ecco;
|
||||
var omeosq = 1.0 - eccsq;
|
||||
var rteosq = Math.sqrt(omeosq);
|
||||
var cosio = Math.cos(inclo);
|
||||
var cosio2 = cosio * cosio;
|
||||
// ------------------ un-kozai the mean motion -----------------
|
||||
var ak = Math.pow(_constants.xke / no, _constants.x2o3);
|
||||
var d1 = 0.75 * _constants.j2 * (3.0 * cosio2 - 1.0) / (rteosq * omeosq);
|
||||
var delPrime = d1 / (ak * ak);
|
||||
var adel = ak * (1.0 - delPrime * delPrime - delPrime * (1.0 / 3.0 + 134.0 * delPrime * delPrime / 81.0));
|
||||
delPrime = d1 / (adel * adel);
|
||||
no /= 1.0 + delPrime;
|
||||
var ao = Math.pow(_constants.xke / no, _constants.x2o3);
|
||||
var sinio = Math.sin(inclo);
|
||||
var po = ao * omeosq;
|
||||
var con42 = 1.0 - 5.0 * cosio2;
|
||||
var con41 = -con42 - cosio2 - cosio2;
|
||||
var ainv = 1.0 / ao;
|
||||
var posq = po * po;
|
||||
var rp = ao * (1.0 - ecco);
|
||||
var method = 'n';
|
||||
// sgp4fix modern approach to finding sidereal time
|
||||
var gsto;
|
||||
if (opsmode === 'a') {
|
||||
// sgp4fix use old way of finding gst
|
||||
// count integer number of days from 0 jan 1970
|
||||
var ts70 = epoch - 7305.0;
|
||||
var ds70 = Math.floor(ts70 + 1.0e-8);
|
||||
var tfrac = ts70 - ds70;
|
||||
// find greenwich location at epoch
|
||||
var c1 = 1.72027916940703639e-2; // eslint-disable-line no-loss-of-precision
|
||||
var thgr70 = 1.7321343856509374; // eslint-disable-line no-loss-of-precision
|
||||
var fk5r = 5.07551419432269442e-15; // eslint-disable-line no-loss-of-precision
|
||||
var c1p2p = c1 + _constants.twoPi;
|
||||
gsto = (thgr70 + c1 * ds70 + c1p2p * tfrac + ts70 * ts70 * fk5r) % _constants.twoPi;
|
||||
if (gsto < 0.0) {
|
||||
gsto += _constants.twoPi;
|
||||
}
|
||||
} else {
|
||||
gsto = (0, _gstime["default"])(epoch + 2433281.5);
|
||||
}
|
||||
return {
|
||||
no: no,
|
||||
method: method,
|
||||
ainv: ainv,
|
||||
ao: ao,
|
||||
con41: con41,
|
||||
con42: con42,
|
||||
cosio: cosio,
|
||||
cosio2: cosio2,
|
||||
eccsq: eccsq,
|
||||
omeosq: omeosq,
|
||||
posq: posq,
|
||||
rp: rp,
|
||||
rteosq: rteosq,
|
||||
sinio: sinio,
|
||||
gsto: gsto
|
||||
};
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = propagate;
|
||||
var _constants = require("../constants");
|
||||
var _ext = require("../ext");
|
||||
var _sgp = _interopRequireDefault(require("./sgp4"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
function propagate(satrec) {
|
||||
for (var _len = arguments.length, jdayArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||||
jdayArgs[_key - 1] = arguments[_key];
|
||||
}
|
||||
// Return a position and velocity vector for a given date and time.
|
||||
var j = _ext.jday.apply(void 0, jdayArgs);
|
||||
var m = (j - satrec.jdsatepoch) * _constants.minutesPerDay;
|
||||
return (0, _sgp["default"])(satrec, m);
|
||||
}
|
||||
+399
@@ -0,0 +1,399 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = sgp4;
|
||||
var _constants = require("../constants");
|
||||
var _dpper = _interopRequireDefault(require("./dpper"));
|
||||
var _dspace = _interopRequireDefault(require("./dspace"));
|
||||
var _SatRec = require("./SatRec.js");
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
/*----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure sgp4
|
||||
*
|
||||
* this procedure is the sgp4 prediction model from space command. this is an
|
||||
* updated and combined version of sgp4 and sdp4, which were originally
|
||||
* published separately in spacetrack report //3. this version follows the
|
||||
* methodology from the aiaa paper (2006) describing the history and
|
||||
* development of the code.
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* satrec - initialised structure from sgp4init() call.
|
||||
* tsince - time since epoch (minutes)
|
||||
*
|
||||
* outputs :
|
||||
* r - position vector km
|
||||
* v - velocity km/sec
|
||||
* return code - non-zero on error.
|
||||
* 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er
|
||||
* 2 - mean motion less than 0.0
|
||||
* 3 - pert elements, ecc < 0.0 or ecc > 1.0
|
||||
* 4 - semi-latus rectum < 0.0
|
||||
* 5 - epoch elements are sub-orbital
|
||||
* 6 - satellite has decayed
|
||||
*
|
||||
* locals :
|
||||
* am -
|
||||
* axnl, aynl -
|
||||
* betal -
|
||||
* cosim , sinim , cosomm , sinomm , cnod , snod , cos2u ,
|
||||
* sin2u , coseo1 , sineo1 , cosi , sini , cosip , sinip ,
|
||||
* cosisq , cossu , sinsu , cosu , sinu
|
||||
* delm -
|
||||
* delomg -
|
||||
* dndt -
|
||||
* eccm -
|
||||
* emsq -
|
||||
* ecose -
|
||||
* el2 -
|
||||
* eo1 -
|
||||
* eccp -
|
||||
* esine -
|
||||
* argpm -
|
||||
* argpp -
|
||||
* omgadf -
|
||||
* pl -
|
||||
* r -
|
||||
* rtemsq -
|
||||
* rdotl -
|
||||
* rl -
|
||||
* rvdot -
|
||||
* rvdotl -
|
||||
* su -
|
||||
* t2 , t3 , t4 , tc
|
||||
* tem5, temp , temp1 , temp2 , tempa , tempe , templ
|
||||
* u , ux , uy , uz , vx , vy , vz
|
||||
* inclm - inclination
|
||||
* mm - mean anomaly
|
||||
* nm - mean motion
|
||||
* nodem - right asc of ascending node
|
||||
* xinc -
|
||||
* xincp -
|
||||
* xl -
|
||||
* xlm -
|
||||
* mp -
|
||||
* xmdf -
|
||||
* xmx -
|
||||
* xmy -
|
||||
* nodedf -
|
||||
* xnode -
|
||||
* nodep -
|
||||
* np -
|
||||
*
|
||||
* coupling :
|
||||
* getgravconst-
|
||||
* dpper
|
||||
* dspace
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report //3 1980
|
||||
* hoots, norad spacetrack report //6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function sgp4(satrec, tsince) {
|
||||
var coseo1;
|
||||
var sineo1;
|
||||
var cosip;
|
||||
var sinip;
|
||||
var cosisq;
|
||||
var delm;
|
||||
var delomg;
|
||||
var eo1;
|
||||
var argpm;
|
||||
var argpp;
|
||||
var su;
|
||||
var t3;
|
||||
var t4;
|
||||
var tc;
|
||||
var tem5;
|
||||
var temp;
|
||||
var tempa;
|
||||
var tempe;
|
||||
var templ;
|
||||
var inclm;
|
||||
var mm;
|
||||
var nm;
|
||||
var nodem;
|
||||
var xincp;
|
||||
var xlm;
|
||||
var mp;
|
||||
var nodep;
|
||||
/* ------------------ set mathematical constants --------------- */
|
||||
// sgp4fix divisor for divide by zero check on inclination
|
||||
// the old check used 1.0 + cos(pi-1.0e-9), but then compared it to
|
||||
// 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency
|
||||
var temp4 = 1.5e-12;
|
||||
// --------------------- clear sgp4 error flag -----------------
|
||||
satrec.t = tsince;
|
||||
satrec.error = _SatRec.SatRecError.None;
|
||||
// ------- update for secular gravity and atmospheric drag -----
|
||||
var xmdf = satrec.mo + satrec.mdot * satrec.t;
|
||||
var argpdf = satrec.argpo + satrec.argpdot * satrec.t;
|
||||
var nodedf = satrec.nodeo + satrec.nodedot * satrec.t;
|
||||
argpm = argpdf;
|
||||
mm = xmdf;
|
||||
var t2 = satrec.t * satrec.t;
|
||||
nodem = nodedf + satrec.nodecf * t2;
|
||||
tempa = 1.0 - satrec.cc1 * satrec.t;
|
||||
tempe = satrec.bstar * satrec.cc4 * satrec.t;
|
||||
templ = satrec.t2cof * t2;
|
||||
if (satrec.isimp !== 1) {
|
||||
delomg = satrec.omgcof * satrec.t;
|
||||
// sgp4fix use mutliply for speed instead of pow
|
||||
var delmtemp = 1.0 + satrec.eta * Math.cos(xmdf);
|
||||
delm = satrec.xmcof * (delmtemp * delmtemp * delmtemp - satrec.delmo);
|
||||
temp = delomg + delm;
|
||||
mm = xmdf + temp;
|
||||
argpm = argpdf - temp;
|
||||
t3 = t2 * satrec.t;
|
||||
t4 = t3 * satrec.t;
|
||||
tempa = tempa - satrec.d2 * t2 - satrec.d3 * t3 - satrec.d4 * t4;
|
||||
tempe += satrec.bstar * satrec.cc5 * (Math.sin(mm) - satrec.sinmao);
|
||||
templ = templ + satrec.t3cof * t3 + t4 * (satrec.t4cof + satrec.t * satrec.t5cof);
|
||||
}
|
||||
nm = satrec.no;
|
||||
var em = satrec.ecco;
|
||||
inclm = satrec.inclo;
|
||||
if (satrec.method === 'd') {
|
||||
tc = satrec.t;
|
||||
var dspaceOptions = {
|
||||
irez: satrec.irez,
|
||||
d2201: satrec.d2201,
|
||||
d2211: satrec.d2211,
|
||||
d3210: satrec.d3210,
|
||||
d3222: satrec.d3222,
|
||||
d4410: satrec.d4410,
|
||||
d4422: satrec.d4422,
|
||||
d5220: satrec.d5220,
|
||||
d5232: satrec.d5232,
|
||||
d5421: satrec.d5421,
|
||||
d5433: satrec.d5433,
|
||||
dedt: satrec.dedt,
|
||||
del1: satrec.del1,
|
||||
del2: satrec.del2,
|
||||
del3: satrec.del3,
|
||||
didt: satrec.didt,
|
||||
dmdt: satrec.dmdt,
|
||||
dnodt: satrec.dnodt,
|
||||
domdt: satrec.domdt,
|
||||
argpo: satrec.argpo,
|
||||
argpdot: satrec.argpdot,
|
||||
t: satrec.t,
|
||||
tc: tc,
|
||||
gsto: satrec.gsto,
|
||||
xfact: satrec.xfact,
|
||||
xlamo: satrec.xlamo,
|
||||
no: satrec.no,
|
||||
atime: satrec.atime,
|
||||
em: em,
|
||||
argpm: argpm,
|
||||
inclm: inclm,
|
||||
xli: satrec.xli,
|
||||
mm: mm,
|
||||
xni: satrec.xni,
|
||||
nodem: nodem,
|
||||
nm: nm
|
||||
};
|
||||
var dspaceResult = (0, _dspace["default"])(dspaceOptions);
|
||||
em = dspaceResult.em;
|
||||
argpm = dspaceResult.argpm;
|
||||
inclm = dspaceResult.inclm;
|
||||
mm = dspaceResult.mm;
|
||||
nodem = dspaceResult.nodem;
|
||||
nm = dspaceResult.nm;
|
||||
}
|
||||
if (nm <= 0.0) {
|
||||
// printf("// error nm %f\n", nm);
|
||||
satrec.error = _SatRec.SatRecError.MeanMotionBelowZero;
|
||||
// sgp4fix add return
|
||||
return null;
|
||||
}
|
||||
var am = Math.pow(_constants.xke / nm, _constants.x2o3) * tempa * tempa;
|
||||
nm = _constants.xke / Math.pow(am, 1.5);
|
||||
em -= tempe;
|
||||
// fix tolerance for error recognition
|
||||
// sgp4fix am is fixed from the previous nm check
|
||||
if (em >= 1.0 || em < -0.001) {
|
||||
// || (am < 0.95)
|
||||
// printf("// error em %f\n", em);
|
||||
satrec.error = _SatRec.SatRecError.MeanEccentricityOutOfRange;
|
||||
// sgp4fix to return if there is an error in eccentricity
|
||||
return null;
|
||||
}
|
||||
// sgp4fix fix tolerance to avoid a divide by zero
|
||||
if (em < 1.0e-6) {
|
||||
em = 1.0e-6;
|
||||
}
|
||||
mm += satrec.no * templ;
|
||||
xlm = mm + argpm + nodem;
|
||||
nodem %= _constants.twoPi;
|
||||
argpm %= _constants.twoPi;
|
||||
xlm %= _constants.twoPi;
|
||||
mm = (xlm - argpm - nodem) % _constants.twoPi;
|
||||
var meanElements = {
|
||||
am: am,
|
||||
em: em,
|
||||
im: inclm,
|
||||
Om: nodem,
|
||||
om: argpm,
|
||||
mm: mm,
|
||||
nm: nm
|
||||
};
|
||||
// ----------------- compute extra mean quantities -------------
|
||||
var sinim = Math.sin(inclm);
|
||||
var cosim = Math.cos(inclm);
|
||||
// -------------------- add lunar-solar periodics --------------
|
||||
var ep = em;
|
||||
xincp = inclm;
|
||||
argpp = argpm;
|
||||
nodep = nodem;
|
||||
mp = mm;
|
||||
sinip = sinim;
|
||||
cosip = cosim;
|
||||
if (satrec.method === 'd') {
|
||||
var dpperParameters = {
|
||||
inclo: satrec.inclo,
|
||||
init: 'n',
|
||||
ep: ep,
|
||||
inclp: xincp,
|
||||
nodep: nodep,
|
||||
argpp: argpp,
|
||||
mp: mp,
|
||||
opsmode: satrec.operationmode
|
||||
};
|
||||
var dpperResult = (0, _dpper["default"])(satrec, dpperParameters);
|
||||
ep = dpperResult.ep;
|
||||
nodep = dpperResult.nodep;
|
||||
argpp = dpperResult.argpp;
|
||||
mp = dpperResult.mp;
|
||||
xincp = dpperResult.inclp;
|
||||
if (xincp < 0.0) {
|
||||
xincp = -xincp;
|
||||
nodep += _constants.pi;
|
||||
argpp -= _constants.pi;
|
||||
}
|
||||
if (ep < 0.0 || ep > 1.0) {
|
||||
// printf("// error ep %f\n", ep);
|
||||
satrec.error = _SatRec.SatRecError.PerturbedEccentricityOutOfRange;
|
||||
// sgp4fix add return
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// -------------------- long period periodics ------------------
|
||||
if (satrec.method === 'd') {
|
||||
sinip = Math.sin(xincp);
|
||||
cosip = Math.cos(xincp);
|
||||
satrec.aycof = -0.5 * _constants.j3oj2 * sinip;
|
||||
// sgp4fix for divide by zero for xincp = 180 deg
|
||||
if (Math.abs(cosip + 1.0) > 1.5e-12) {
|
||||
satrec.xlcof = -0.25 * _constants.j3oj2 * sinip * (3.0 + 5.0 * cosip) / (1.0 + cosip);
|
||||
} else {
|
||||
satrec.xlcof = -0.25 * _constants.j3oj2 * sinip * (3.0 + 5.0 * cosip) / temp4;
|
||||
}
|
||||
}
|
||||
var axnl = ep * Math.cos(argpp);
|
||||
temp = 1.0 / (am * (1.0 - ep * ep));
|
||||
var aynl = ep * Math.sin(argpp) + temp * satrec.aycof;
|
||||
var xl = mp + argpp + nodep + temp * satrec.xlcof * axnl;
|
||||
// --------------------- solve kepler's equation ---------------
|
||||
var u = (xl - nodep) % _constants.twoPi;
|
||||
eo1 = u;
|
||||
tem5 = 9999.9;
|
||||
var ktr = 1;
|
||||
// sgp4fix for kepler iteration
|
||||
// the following iteration needs better limits on corrections
|
||||
while (Math.abs(tem5) >= 1.0e-12 && ktr <= 10) {
|
||||
sineo1 = Math.sin(eo1);
|
||||
coseo1 = Math.cos(eo1);
|
||||
tem5 = 1.0 - coseo1 * axnl - sineo1 * aynl;
|
||||
tem5 = (u - aynl * coseo1 + axnl * sineo1 - eo1) / tem5;
|
||||
if (Math.abs(tem5) >= 0.95) {
|
||||
if (tem5 > 0.0) {
|
||||
tem5 = 0.95;
|
||||
} else {
|
||||
tem5 = -0.95;
|
||||
}
|
||||
}
|
||||
eo1 += tem5;
|
||||
ktr += 1;
|
||||
}
|
||||
// ------------- short period preliminary quantities -----------
|
||||
var ecose = axnl * coseo1 + aynl * sineo1;
|
||||
var esine = axnl * sineo1 - aynl * coseo1;
|
||||
var el2 = axnl * axnl + aynl * aynl;
|
||||
var pl = am * (1.0 - el2);
|
||||
if (pl < 0.0) {
|
||||
// printf("// error pl %f\n", pl);
|
||||
satrec.error = _SatRec.SatRecError.SemiLatusRectumBelowZero;
|
||||
// sgp4fix add return
|
||||
return null;
|
||||
}
|
||||
var rl = am * (1.0 - ecose);
|
||||
var rdotl = Math.sqrt(am) * esine / rl;
|
||||
var rvdotl = Math.sqrt(pl) / rl;
|
||||
var betal = Math.sqrt(1.0 - el2);
|
||||
temp = esine / (1.0 + betal);
|
||||
var sinu = am / rl * (sineo1 - aynl - axnl * temp);
|
||||
var cosu = am / rl * (coseo1 - axnl + aynl * temp);
|
||||
su = Math.atan2(sinu, cosu);
|
||||
var sin2u = (cosu + cosu) * sinu;
|
||||
var cos2u = 1.0 - 2.0 * sinu * sinu;
|
||||
temp = 1.0 / pl;
|
||||
var temp1 = 0.5 * _constants.j2 * temp;
|
||||
var temp2 = temp1 * temp;
|
||||
// -------------- update for short period periodics ------------
|
||||
if (satrec.method === 'd') {
|
||||
cosisq = cosip * cosip;
|
||||
satrec.con41 = 3.0 * cosisq - 1.0;
|
||||
satrec.x1mth2 = 1.0 - cosisq;
|
||||
satrec.x7thm1 = 7.0 * cosisq - 1.0;
|
||||
}
|
||||
var mrt = rl * (1.0 - 1.5 * temp2 * betal * satrec.con41) + 0.5 * temp1 * satrec.x1mth2 * cos2u;
|
||||
// sgp4fix for decaying satellites
|
||||
if (mrt < 1.0) {
|
||||
// printf("// decay condition %11.6f \n",mrt);
|
||||
satrec.error = _SatRec.SatRecError.Decayed;
|
||||
return null;
|
||||
}
|
||||
su -= 0.25 * temp2 * satrec.x7thm1 * sin2u;
|
||||
var xnode = nodep + 1.5 * temp2 * cosip * sin2u;
|
||||
var xinc = xincp + 1.5 * temp2 * cosip * sinip * cos2u;
|
||||
var mvt = rdotl - nm * temp1 * satrec.x1mth2 * sin2u / _constants.xke;
|
||||
var rvdot = rvdotl + nm * temp1 * (satrec.x1mth2 * cos2u + 1.5 * satrec.con41) / _constants.xke;
|
||||
// --------------------- orientation vectors -------------------
|
||||
var sinsu = Math.sin(su);
|
||||
var cossu = Math.cos(su);
|
||||
var snod = Math.sin(xnode);
|
||||
var cnod = Math.cos(xnode);
|
||||
var sini = Math.sin(xinc);
|
||||
var cosi = Math.cos(xinc);
|
||||
var xmx = -snod * cosi;
|
||||
var xmy = cnod * cosi;
|
||||
var ux = xmx * sinsu + cnod * cossu;
|
||||
var uy = xmy * sinsu + snod * cossu;
|
||||
var uz = sini * sinsu;
|
||||
var vx = xmx * cossu - cnod * sinsu;
|
||||
var vy = xmy * cossu - snod * sinsu;
|
||||
var vz = sini * cossu;
|
||||
// --------- position and velocity (in km and km/sec) ----------
|
||||
var r = {
|
||||
x: mrt * ux * _constants.earthRadius,
|
||||
y: mrt * uy * _constants.earthRadius,
|
||||
z: mrt * uz * _constants.earthRadius
|
||||
};
|
||||
var v = {
|
||||
x: (mvt * ux + rvdot * vx) * _constants.vkmpersec,
|
||||
y: (mvt * uy + rvdot * vy) * _constants.vkmpersec,
|
||||
z: (mvt * uz + rvdot * vz) * _constants.vkmpersec
|
||||
};
|
||||
return {
|
||||
position: r,
|
||||
velocity: v,
|
||||
meanElements: meanElements
|
||||
};
|
||||
}
|
||||
+617
@@ -0,0 +1,617 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports["default"] = sgp4init;
|
||||
var _constants = require("../constants");
|
||||
var _dpper = _interopRequireDefault(require("./dpper"));
|
||||
var _dscom = _interopRequireDefault(require("./dscom"));
|
||||
var _dsinit = _interopRequireDefault(require("./dsinit"));
|
||||
var _initl = _interopRequireDefault(require("./initl"));
|
||||
var _sgp = _interopRequireDefault(require("./sgp4"));
|
||||
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
||||
/*-----------------------------------------------------------------------------
|
||||
*
|
||||
* procedure sgp4init
|
||||
*
|
||||
* this procedure initializes variables for sgp4.
|
||||
*
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
* author : david vallado 719-573-2600 28 jun 2005
|
||||
*
|
||||
* inputs :
|
||||
* opsmode - mode of operation afspc or improved 'a', 'i'
|
||||
* satn - satellite number
|
||||
* bstar - sgp4 type drag coefficient kg/m2er
|
||||
* ecco - eccentricity
|
||||
* epoch - epoch time in days from jan 0, 1950. 0 hr
|
||||
* argpo - argument of perigee (output if ds)
|
||||
* inclo - inclination
|
||||
* mo - mean anomaly (output if ds)
|
||||
* no - mean motion
|
||||
* nodeo - right ascension of ascending node
|
||||
*
|
||||
* outputs :
|
||||
* rec - common values for subsequent calls
|
||||
* return code - non-zero on error.
|
||||
* 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er
|
||||
* 2 - mean motion less than 0.0
|
||||
* 3 - pert elements, ecc < 0.0 or ecc > 1.0
|
||||
* 4 - semi-latus rectum < 0.0
|
||||
* 5 - epoch elements are sub-orbital
|
||||
* 6 - satellite has decayed
|
||||
*
|
||||
* locals :
|
||||
* cnodm , snodm , cosim , sinim , cosomm , sinomm
|
||||
* cc1sq , cc2 , cc3
|
||||
* coef , coef1
|
||||
* cosio4 -
|
||||
* day -
|
||||
* dndt -
|
||||
* em - eccentricity
|
||||
* emsq - eccentricity squared
|
||||
* eeta -
|
||||
* etasq -
|
||||
* gam -
|
||||
* argpm - argument of perigee
|
||||
* nodem -
|
||||
* inclm - inclination
|
||||
* mm - mean anomaly
|
||||
* nm - mean motion
|
||||
* perige - perigee
|
||||
* pinvsq -
|
||||
* psisq -
|
||||
* qzms24 -
|
||||
* rtemsq -
|
||||
* s1, s2, s3, s4, s5, s6, s7 -
|
||||
* sfour -
|
||||
* ss1, ss2, ss3, ss4, ss5, ss6, ss7 -
|
||||
* sz1, sz2, sz3
|
||||
* sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 -
|
||||
* tc -
|
||||
* temp -
|
||||
* temp1, temp2, temp3 -
|
||||
* tsi -
|
||||
* xpidot -
|
||||
* xhdot1 -
|
||||
* z1, z2, z3 -
|
||||
* z11, z12, z13, z21, z22, z23, z31, z32, z33 -
|
||||
*
|
||||
* coupling :
|
||||
* getgravconst-
|
||||
* initl -
|
||||
* dscom -
|
||||
* dpper -
|
||||
* dsinit -
|
||||
* sgp4 -
|
||||
*
|
||||
* references :
|
||||
* hoots, roehrich, norad spacetrack report #3 1980
|
||||
* hoots, norad spacetrack report #6 1986
|
||||
* hoots, schumacher and glover 2004
|
||||
* vallado, crawford, hujsak, kelso 2006
|
||||
----------------------------------------------------------------------------*/
|
||||
function sgp4init(satrecInit, options) {
|
||||
var opsmode = options.opsmode,
|
||||
satn = options.satn,
|
||||
epoch = options.epoch,
|
||||
xbstar = options.xbstar,
|
||||
xecco = options.xecco,
|
||||
xargpo = options.xargpo,
|
||||
xinclo = options.xinclo,
|
||||
xmo = options.xmo,
|
||||
xno = options.xno,
|
||||
xnodeo = options.xnodeo;
|
||||
var cosim;
|
||||
var sinim;
|
||||
var cc1sq;
|
||||
var cc2;
|
||||
var cc3;
|
||||
var coef;
|
||||
var coef1;
|
||||
var cosio4;
|
||||
var em;
|
||||
var emsq;
|
||||
var eeta;
|
||||
var etasq;
|
||||
var argpm;
|
||||
var nodem;
|
||||
var inclm;
|
||||
var mm;
|
||||
var nm;
|
||||
var perige;
|
||||
var pinvsq;
|
||||
var psisq;
|
||||
var qzms24;
|
||||
var s1;
|
||||
var s2;
|
||||
var s3;
|
||||
var s4;
|
||||
var s5;
|
||||
var sfour;
|
||||
var ss1;
|
||||
var ss2;
|
||||
var ss3;
|
||||
var ss4;
|
||||
var ss5;
|
||||
var sz1;
|
||||
var sz3;
|
||||
var sz11;
|
||||
var sz13;
|
||||
var sz21;
|
||||
var sz23;
|
||||
var sz31;
|
||||
var sz33;
|
||||
var tc;
|
||||
var temp;
|
||||
var temp1;
|
||||
var temp2;
|
||||
var temp3;
|
||||
var tsi;
|
||||
var xpidot;
|
||||
var xhdot1;
|
||||
var z1;
|
||||
var z3;
|
||||
var z11;
|
||||
var z13;
|
||||
var z21;
|
||||
var z23;
|
||||
var z31;
|
||||
var z33;
|
||||
/* ------------------------ initialization --------------------- */
|
||||
// sgp4fix divisor for divide by zero check on inclination
|
||||
// the old check used 1.0 + Math.cos(pi-1.0e-9), but then compared it to
|
||||
// 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency
|
||||
var temp4 = 1.5e-12;
|
||||
var satrec = satrecInit;
|
||||
// ----------- set all near earth variables to zero ------------
|
||||
satrec.isimp = 0;
|
||||
satrec.method = 'n';
|
||||
satrec.aycof = 0.0;
|
||||
satrec.con41 = 0.0;
|
||||
satrec.cc1 = 0.0;
|
||||
satrec.cc4 = 0.0;
|
||||
satrec.cc5 = 0.0;
|
||||
satrec.d2 = 0.0;
|
||||
satrec.d3 = 0.0;
|
||||
satrec.d4 = 0.0;
|
||||
satrec.delmo = 0.0;
|
||||
satrec.eta = 0.0;
|
||||
satrec.argpdot = 0.0;
|
||||
satrec.omgcof = 0.0;
|
||||
satrec.sinmao = 0.0;
|
||||
satrec.t = 0.0;
|
||||
satrec.t2cof = 0.0;
|
||||
satrec.t3cof = 0.0;
|
||||
satrec.t4cof = 0.0;
|
||||
satrec.t5cof = 0.0;
|
||||
satrec.x1mth2 = 0.0;
|
||||
satrec.x7thm1 = 0.0;
|
||||
satrec.mdot = 0.0;
|
||||
satrec.nodedot = 0.0;
|
||||
satrec.xlcof = 0.0;
|
||||
satrec.xmcof = 0.0;
|
||||
satrec.nodecf = 0.0;
|
||||
// ----------- set all deep space variables to zero ------------
|
||||
satrec.irez = 0;
|
||||
satrec.d2201 = 0.0;
|
||||
satrec.d2211 = 0.0;
|
||||
satrec.d3210 = 0.0;
|
||||
satrec.d3222 = 0.0;
|
||||
satrec.d4410 = 0.0;
|
||||
satrec.d4422 = 0.0;
|
||||
satrec.d5220 = 0.0;
|
||||
satrec.d5232 = 0.0;
|
||||
satrec.d5421 = 0.0;
|
||||
satrec.d5433 = 0.0;
|
||||
satrec.dedt = 0.0;
|
||||
satrec.del1 = 0.0;
|
||||
satrec.del2 = 0.0;
|
||||
satrec.del3 = 0.0;
|
||||
satrec.didt = 0.0;
|
||||
satrec.dmdt = 0.0;
|
||||
satrec.dnodt = 0.0;
|
||||
satrec.domdt = 0.0;
|
||||
satrec.e3 = 0.0;
|
||||
satrec.ee2 = 0.0;
|
||||
satrec.peo = 0.0;
|
||||
satrec.pgho = 0.0;
|
||||
satrec.pho = 0.0;
|
||||
satrec.pinco = 0.0;
|
||||
satrec.plo = 0.0;
|
||||
satrec.se2 = 0.0;
|
||||
satrec.se3 = 0.0;
|
||||
satrec.sgh2 = 0.0;
|
||||
satrec.sgh3 = 0.0;
|
||||
satrec.sgh4 = 0.0;
|
||||
satrec.sh2 = 0.0;
|
||||
satrec.sh3 = 0.0;
|
||||
satrec.si2 = 0.0;
|
||||
satrec.si3 = 0.0;
|
||||
satrec.sl2 = 0.0;
|
||||
satrec.sl3 = 0.0;
|
||||
satrec.sl4 = 0.0;
|
||||
satrec.gsto = 0.0;
|
||||
satrec.xfact = 0.0;
|
||||
satrec.xgh2 = 0.0;
|
||||
satrec.xgh3 = 0.0;
|
||||
satrec.xgh4 = 0.0;
|
||||
satrec.xh2 = 0.0;
|
||||
satrec.xh3 = 0.0;
|
||||
satrec.xi2 = 0.0;
|
||||
satrec.xi3 = 0.0;
|
||||
satrec.xl2 = 0.0;
|
||||
satrec.xl3 = 0.0;
|
||||
satrec.xl4 = 0.0;
|
||||
satrec.xlamo = 0.0;
|
||||
satrec.zmol = 0.0;
|
||||
satrec.zmos = 0.0;
|
||||
satrec.atime = 0.0;
|
||||
satrec.xli = 0.0;
|
||||
satrec.xni = 0.0;
|
||||
// sgp4fix - note the following variables are also passed directly via satrec.
|
||||
// it is possible to streamline the sgp4init call by deleting the "x"
|
||||
// variables, but the user would need to set the satrec.* values first. we
|
||||
// include the additional assignments in case twoline2rv is not used.
|
||||
satrec.bstar = xbstar;
|
||||
satrec.ecco = xecco;
|
||||
satrec.argpo = xargpo;
|
||||
satrec.inclo = xinclo;
|
||||
satrec.mo = xmo;
|
||||
satrec.no = xno;
|
||||
satrec.nodeo = xnodeo;
|
||||
// sgp4fix add opsmode
|
||||
satrec.operationmode = opsmode;
|
||||
// ------------------------ earth constants -----------------------
|
||||
// sgp4fix identify constants and allow alternate values
|
||||
var ss = 78.0 / _constants.earthRadius + 1.0;
|
||||
// sgp4fix use multiply for speed instead of pow
|
||||
var qzms2ttemp = (120.0 - 78.0) / _constants.earthRadius;
|
||||
var qzms2t = qzms2ttemp * qzms2ttemp * qzms2ttemp * qzms2ttemp;
|
||||
satrec.init = 'y';
|
||||
satrec.t = 0.0;
|
||||
var initlOptions = {
|
||||
satn: satn,
|
||||
ecco: satrec.ecco,
|
||||
epoch: epoch,
|
||||
inclo: satrec.inclo,
|
||||
no: satrec.no,
|
||||
method: satrec.method,
|
||||
opsmode: satrec.operationmode
|
||||
};
|
||||
var initlResult = (0, _initl["default"])(initlOptions);
|
||||
var ao = initlResult.ao,
|
||||
con42 = initlResult.con42,
|
||||
cosio = initlResult.cosio,
|
||||
cosio2 = initlResult.cosio2,
|
||||
eccsq = initlResult.eccsq,
|
||||
omeosq = initlResult.omeosq,
|
||||
posq = initlResult.posq,
|
||||
rp = initlResult.rp,
|
||||
rteosq = initlResult.rteosq,
|
||||
sinio = initlResult.sinio;
|
||||
satrec.no = initlResult.no;
|
||||
satrec.con41 = initlResult.con41;
|
||||
satrec.gsto = initlResult.gsto;
|
||||
satrec.a = Math.pow(satrec.no * _constants.tumin, -2.0 / 3.0);
|
||||
satrec.alta = satrec.a * (1.0 + satrec.ecco) - 1.0;
|
||||
satrec.altp = satrec.a * (1.0 - satrec.ecco) - 1.0;
|
||||
satrec.error = 0;
|
||||
// sgp4fix remove this check as it is unnecessary
|
||||
// the mrt check in sgp4 handles decaying satellite cases even if the starting
|
||||
// condition is below the surface of te earth
|
||||
// if (rp < 1.0)
|
||||
// {
|
||||
// printf("// *** satn%d epoch elts sub-orbital ***\n", satn);
|
||||
// satrec.error = 5;
|
||||
// }
|
||||
if (omeosq >= 0.0 || satrec.no >= 0.0) {
|
||||
satrec.isimp = 0;
|
||||
if (rp < 220.0 / _constants.earthRadius + 1.0) {
|
||||
satrec.isimp = 1;
|
||||
}
|
||||
sfour = ss;
|
||||
qzms24 = qzms2t;
|
||||
perige = (rp - 1.0) * _constants.earthRadius;
|
||||
// - for perigees below 156 km, s and qoms2t are altered -
|
||||
if (perige < 156.0) {
|
||||
sfour = perige - 78.0;
|
||||
if (perige < 98.0) {
|
||||
sfour = 20.0;
|
||||
}
|
||||
// sgp4fix use multiply for speed instead of pow
|
||||
var qzms24temp = (120.0 - sfour) / _constants.earthRadius;
|
||||
qzms24 = qzms24temp * qzms24temp * qzms24temp * qzms24temp;
|
||||
sfour = sfour / _constants.earthRadius + 1.0;
|
||||
}
|
||||
pinvsq = 1.0 / posq;
|
||||
tsi = 1.0 / (ao - sfour);
|
||||
satrec.eta = ao * satrec.ecco * tsi;
|
||||
etasq = satrec.eta * satrec.eta;
|
||||
eeta = satrec.ecco * satrec.eta;
|
||||
psisq = Math.abs(1.0 - etasq);
|
||||
coef = qzms24 * Math.pow(tsi, 4.0);
|
||||
coef1 = coef / Math.pow(psisq, 3.5);
|
||||
cc2 = coef1 * satrec.no * (ao * (1.0 + 1.5 * etasq + eeta * (4.0 + etasq)) + 0.375 * _constants.j2 * tsi / psisq * satrec.con41 * (8.0 + 3.0 * etasq * (8.0 + etasq)));
|
||||
satrec.cc1 = satrec.bstar * cc2;
|
||||
cc3 = 0.0;
|
||||
if (satrec.ecco > 1.0e-4) {
|
||||
cc3 = -2.0 * coef * tsi * _constants.j3oj2 * satrec.no * sinio / satrec.ecco;
|
||||
}
|
||||
satrec.x1mth2 = 1.0 - cosio2;
|
||||
satrec.cc4 = 2.0 * satrec.no * coef1 * ao * omeosq * (satrec.eta * (2.0 + 0.5 * etasq) + satrec.ecco * (0.5 + 2.0 * etasq) - _constants.j2 * tsi / (ao * psisq) * (-3.0 * satrec.con41 * (1.0 - 2.0 * eeta + etasq * (1.5 - 0.5 * eeta)) + 0.75 * satrec.x1mth2 * (2.0 * etasq - eeta * (1.0 + etasq)) * Math.cos(2.0 * satrec.argpo)));
|
||||
satrec.cc5 = 2.0 * coef1 * ao * omeosq * (1.0 + 2.75 * (etasq + eeta) + eeta * etasq);
|
||||
cosio4 = cosio2 * cosio2;
|
||||
temp1 = 1.5 * _constants.j2 * pinvsq * satrec.no;
|
||||
temp2 = 0.5 * temp1 * _constants.j2 * pinvsq;
|
||||
temp3 = -0.46875 * _constants.j4 * pinvsq * pinvsq * satrec.no;
|
||||
satrec.mdot = satrec.no + 0.5 * temp1 * rteosq * satrec.con41 + 0.0625 * temp2 * rteosq * (13.0 - 78.0 * cosio2 + 137.0 * cosio4);
|
||||
satrec.argpdot = -0.5 * temp1 * con42 + 0.0625 * temp2 * (7.0 - 114.0 * cosio2 + 395.0 * cosio4) + temp3 * (3.0 - 36.0 * cosio2 + 49.0 * cosio4);
|
||||
xhdot1 = -temp1 * cosio;
|
||||
satrec.nodedot = xhdot1 + (0.5 * temp2 * (4.0 - 19.0 * cosio2) + 2.0 * temp3 * (3.0 - 7.0 * cosio2)) * cosio;
|
||||
xpidot = satrec.argpdot + satrec.nodedot;
|
||||
satrec.omgcof = satrec.bstar * cc3 * Math.cos(satrec.argpo);
|
||||
satrec.xmcof = 0.0;
|
||||
if (satrec.ecco > 1.0e-4) {
|
||||
satrec.xmcof = -_constants.x2o3 * coef * satrec.bstar / eeta;
|
||||
}
|
||||
satrec.nodecf = 3.5 * omeosq * xhdot1 * satrec.cc1;
|
||||
satrec.t2cof = 1.5 * satrec.cc1;
|
||||
// sgp4fix for divide by zero with xinco = 180 deg
|
||||
if (Math.abs(cosio + 1.0) > 1.5e-12) {
|
||||
satrec.xlcof = -0.25 * _constants.j3oj2 * sinio * (3.0 + 5.0 * cosio) / (1.0 + cosio);
|
||||
} else {
|
||||
satrec.xlcof = -0.25 * _constants.j3oj2 * sinio * (3.0 + 5.0 * cosio) / temp4;
|
||||
}
|
||||
satrec.aycof = -0.5 * _constants.j3oj2 * sinio;
|
||||
// sgp4fix use multiply for speed instead of pow
|
||||
var delmotemp = 1.0 + satrec.eta * Math.cos(satrec.mo);
|
||||
satrec.delmo = delmotemp * delmotemp * delmotemp;
|
||||
satrec.sinmao = Math.sin(satrec.mo);
|
||||
satrec.x7thm1 = 7.0 * cosio2 - 1.0;
|
||||
// --------------- deep space initialization -------------
|
||||
if (2 * _constants.pi / satrec.no >= 225.0) {
|
||||
satrec.method = 'd';
|
||||
satrec.isimp = 1;
|
||||
tc = 0.0;
|
||||
inclm = satrec.inclo;
|
||||
var dscomOptions = {
|
||||
epoch: epoch,
|
||||
ep: satrec.ecco,
|
||||
argpp: satrec.argpo,
|
||||
tc: tc,
|
||||
inclp: satrec.inclo,
|
||||
nodep: satrec.nodeo,
|
||||
np: satrec.no,
|
||||
e3: satrec.e3,
|
||||
ee2: satrec.ee2,
|
||||
peo: satrec.peo,
|
||||
pgho: satrec.pgho,
|
||||
pho: satrec.pho,
|
||||
pinco: satrec.pinco,
|
||||
plo: satrec.plo,
|
||||
se2: satrec.se2,
|
||||
se3: satrec.se3,
|
||||
sgh2: satrec.sgh2,
|
||||
sgh3: satrec.sgh3,
|
||||
sgh4: satrec.sgh4,
|
||||
sh2: satrec.sh2,
|
||||
sh3: satrec.sh3,
|
||||
si2: satrec.si2,
|
||||
si3: satrec.si3,
|
||||
sl2: satrec.sl2,
|
||||
sl3: satrec.sl3,
|
||||
sl4: satrec.sl4,
|
||||
xgh2: satrec.xgh2,
|
||||
xgh3: satrec.xgh3,
|
||||
xgh4: satrec.xgh4,
|
||||
xh2: satrec.xh2,
|
||||
xh3: satrec.xh3,
|
||||
xi2: satrec.xi2,
|
||||
xi3: satrec.xi3,
|
||||
xl2: satrec.xl2,
|
||||
xl3: satrec.xl3,
|
||||
xl4: satrec.xl4,
|
||||
zmol: satrec.zmol,
|
||||
zmos: satrec.zmos
|
||||
};
|
||||
var dscomResult = (0, _dscom["default"])(dscomOptions);
|
||||
satrec.e3 = dscomResult.e3;
|
||||
satrec.ee2 = dscomResult.ee2;
|
||||
satrec.peo = dscomResult.peo;
|
||||
satrec.pgho = dscomResult.pgho;
|
||||
satrec.pho = dscomResult.pho;
|
||||
satrec.pinco = dscomResult.pinco;
|
||||
satrec.plo = dscomResult.plo;
|
||||
satrec.se2 = dscomResult.se2;
|
||||
satrec.se3 = dscomResult.se3;
|
||||
satrec.sgh2 = dscomResult.sgh2;
|
||||
satrec.sgh3 = dscomResult.sgh3;
|
||||
satrec.sgh4 = dscomResult.sgh4;
|
||||
satrec.sh2 = dscomResult.sh2;
|
||||
satrec.sh3 = dscomResult.sh3;
|
||||
satrec.si2 = dscomResult.si2;
|
||||
satrec.si3 = dscomResult.si3;
|
||||
satrec.sl2 = dscomResult.sl2;
|
||||
satrec.sl3 = dscomResult.sl3;
|
||||
satrec.sl4 = dscomResult.sl4;
|
||||
sinim = dscomResult.sinim;
|
||||
cosim = dscomResult.cosim;
|
||||
em = dscomResult.em;
|
||||
emsq = dscomResult.emsq;
|
||||
s1 = dscomResult.s1;
|
||||
s2 = dscomResult.s2;
|
||||
s3 = dscomResult.s3;
|
||||
s4 = dscomResult.s4;
|
||||
s5 = dscomResult.s5;
|
||||
ss1 = dscomResult.ss1;
|
||||
ss2 = dscomResult.ss2;
|
||||
ss3 = dscomResult.ss3;
|
||||
ss4 = dscomResult.ss4;
|
||||
ss5 = dscomResult.ss5;
|
||||
sz1 = dscomResult.sz1;
|
||||
sz3 = dscomResult.sz3;
|
||||
sz11 = dscomResult.sz11;
|
||||
sz13 = dscomResult.sz13;
|
||||
sz21 = dscomResult.sz21;
|
||||
sz23 = dscomResult.sz23;
|
||||
sz31 = dscomResult.sz31;
|
||||
sz33 = dscomResult.sz33;
|
||||
satrec.xgh2 = dscomResult.xgh2;
|
||||
satrec.xgh3 = dscomResult.xgh3;
|
||||
satrec.xgh4 = dscomResult.xgh4;
|
||||
satrec.xh2 = dscomResult.xh2;
|
||||
satrec.xh3 = dscomResult.xh3;
|
||||
satrec.xi2 = dscomResult.xi2;
|
||||
satrec.xi3 = dscomResult.xi3;
|
||||
satrec.xl2 = dscomResult.xl2;
|
||||
satrec.xl3 = dscomResult.xl3;
|
||||
satrec.xl4 = dscomResult.xl4;
|
||||
satrec.zmol = dscomResult.zmol;
|
||||
satrec.zmos = dscomResult.zmos;
|
||||
nm = dscomResult.nm;
|
||||
z1 = dscomResult.z1;
|
||||
z3 = dscomResult.z3;
|
||||
z11 = dscomResult.z11;
|
||||
z13 = dscomResult.z13;
|
||||
z21 = dscomResult.z21;
|
||||
z23 = dscomResult.z23;
|
||||
z31 = dscomResult.z31;
|
||||
z33 = dscomResult.z33;
|
||||
var dpperOptions = {
|
||||
inclo: inclm,
|
||||
init: satrec.init,
|
||||
ep: satrec.ecco,
|
||||
inclp: satrec.inclo,
|
||||
nodep: satrec.nodeo,
|
||||
argpp: satrec.argpo,
|
||||
mp: satrec.mo,
|
||||
opsmode: satrec.operationmode
|
||||
};
|
||||
var dpperResult = (0, _dpper["default"])(satrec, dpperOptions);
|
||||
satrec.ecco = dpperResult.ep;
|
||||
satrec.inclo = dpperResult.inclp;
|
||||
satrec.nodeo = dpperResult.nodep;
|
||||
satrec.argpo = dpperResult.argpp;
|
||||
satrec.mo = dpperResult.mp;
|
||||
argpm = 0.0;
|
||||
nodem = 0.0;
|
||||
mm = 0.0;
|
||||
var dsinitOptions = {
|
||||
cosim: cosim,
|
||||
emsq: emsq,
|
||||
argpo: satrec.argpo,
|
||||
s1: s1,
|
||||
s2: s2,
|
||||
s3: s3,
|
||||
s4: s4,
|
||||
s5: s5,
|
||||
sinim: sinim,
|
||||
ss1: ss1,
|
||||
ss2: ss2,
|
||||
ss3: ss3,
|
||||
ss4: ss4,
|
||||
ss5: ss5,
|
||||
sz1: sz1,
|
||||
sz3: sz3,
|
||||
sz11: sz11,
|
||||
sz13: sz13,
|
||||
sz21: sz21,
|
||||
sz23: sz23,
|
||||
sz31: sz31,
|
||||
sz33: sz33,
|
||||
t: satrec.t,
|
||||
tc: tc,
|
||||
gsto: satrec.gsto,
|
||||
mo: satrec.mo,
|
||||
mdot: satrec.mdot,
|
||||
no: satrec.no,
|
||||
nodeo: satrec.nodeo,
|
||||
nodedot: satrec.nodedot,
|
||||
xpidot: xpidot,
|
||||
z1: z1,
|
||||
z3: z3,
|
||||
z11: z11,
|
||||
z13: z13,
|
||||
z21: z21,
|
||||
z23: z23,
|
||||
z31: z31,
|
||||
z33: z33,
|
||||
ecco: satrec.ecco,
|
||||
eccsq: eccsq,
|
||||
em: em,
|
||||
argpm: argpm,
|
||||
inclm: inclm,
|
||||
mm: mm,
|
||||
nm: nm,
|
||||
nodem: nodem,
|
||||
irez: satrec.irez,
|
||||
atime: satrec.atime,
|
||||
d2201: satrec.d2201,
|
||||
d2211: satrec.d2211,
|
||||
d3210: satrec.d3210,
|
||||
d3222: satrec.d3222,
|
||||
d4410: satrec.d4410,
|
||||
d4422: satrec.d4422,
|
||||
d5220: satrec.d5220,
|
||||
d5232: satrec.d5232,
|
||||
d5421: satrec.d5421,
|
||||
d5433: satrec.d5433,
|
||||
dedt: satrec.dedt,
|
||||
didt: satrec.didt,
|
||||
dmdt: satrec.dmdt,
|
||||
dnodt: satrec.dnodt,
|
||||
domdt: satrec.domdt,
|
||||
del1: satrec.del1,
|
||||
del2: satrec.del2,
|
||||
del3: satrec.del3,
|
||||
xfact: satrec.xfact,
|
||||
xlamo: satrec.xlamo,
|
||||
xli: satrec.xli,
|
||||
xni: satrec.xni
|
||||
};
|
||||
var dsinitResult = (0, _dsinit["default"])(dsinitOptions);
|
||||
satrec.irez = dsinitResult.irez;
|
||||
satrec.atime = dsinitResult.atime;
|
||||
satrec.d2201 = dsinitResult.d2201;
|
||||
satrec.d2211 = dsinitResult.d2211;
|
||||
satrec.d3210 = dsinitResult.d3210;
|
||||
satrec.d3222 = dsinitResult.d3222;
|
||||
satrec.d4410 = dsinitResult.d4410;
|
||||
satrec.d4422 = dsinitResult.d4422;
|
||||
satrec.d5220 = dsinitResult.d5220;
|
||||
satrec.d5232 = dsinitResult.d5232;
|
||||
satrec.d5421 = dsinitResult.d5421;
|
||||
satrec.d5433 = dsinitResult.d5433;
|
||||
satrec.dedt = dsinitResult.dedt;
|
||||
satrec.didt = dsinitResult.didt;
|
||||
satrec.dmdt = dsinitResult.dmdt;
|
||||
satrec.dnodt = dsinitResult.dnodt;
|
||||
satrec.domdt = dsinitResult.domdt;
|
||||
satrec.del1 = dsinitResult.del1;
|
||||
satrec.del2 = dsinitResult.del2;
|
||||
satrec.del3 = dsinitResult.del3;
|
||||
satrec.xfact = dsinitResult.xfact;
|
||||
satrec.xlamo = dsinitResult.xlamo;
|
||||
satrec.xli = dsinitResult.xli;
|
||||
satrec.xni = dsinitResult.xni;
|
||||
}
|
||||
// ----------- set variables if not deep space -----------
|
||||
if (satrec.isimp !== 1) {
|
||||
cc1sq = satrec.cc1 * satrec.cc1;
|
||||
satrec.d2 = 4.0 * ao * tsi * cc1sq;
|
||||
temp = satrec.d2 * tsi * satrec.cc1 / 3.0;
|
||||
satrec.d3 = (17.0 * ao + sfour) * temp;
|
||||
satrec.d4 = 0.5 * temp * ao * tsi * (221.0 * ao + 31.0 * sfour) * satrec.cc1;
|
||||
satrec.t3cof = satrec.d2 + 2.0 * cc1sq;
|
||||
satrec.t4cof = 0.25 * (3.0 * satrec.d3 + satrec.cc1 * (12.0 * satrec.d2 + 10.0 * cc1sq));
|
||||
satrec.t5cof = 0.2 * (3.0 * satrec.d4 + 12.0 * satrec.cc1 * satrec.d3 + 6.0 * satrec.d2 * satrec.d2 + 15.0 * cc1sq * (2.0 * satrec.d2 + cc1sq));
|
||||
}
|
||||
/* finally propogate to zero epoch to initialize all others. */
|
||||
// sgp4fix take out check to let satellites process until they are actually below earth surface
|
||||
// if(satrec.error == 0)
|
||||
}
|
||||
(0, _sgp["default"])(satrec, 0);
|
||||
satrec.init = 'n';
|
||||
}
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.sunPos = sunPos;
|
||||
var _constants = require("./constants");
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
/* Line by Line MATLAB-to-Javascript conversion of "sun.mat" from Vallado package */
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
/* -----------------------------------------------------------------------------
|
||||
*
|
||||
* function sunPos
|
||||
*
|
||||
* this function calculates the geocentric equatorial position vector
|
||||
* the sun given the julian date. this is the low precision formula and
|
||||
* is valid for years from 1950 to 2050. accuaracy of apparent coordinates
|
||||
* is 0.01 degrees. notice many of the calculations are performed in
|
||||
* degrees, and are not changed until later. this is due to the fact that
|
||||
* the almanac uses degrees exclusively in their formulations.
|
||||
*
|
||||
* author : david vallado 719-573-2600 1 mar 2001
|
||||
*
|
||||
* inputs description range / units
|
||||
* jd - julian date days from 4713 bc
|
||||
*
|
||||
* outputs :
|
||||
* rsun - ijk position vector of the sun au
|
||||
* rtasc - right ascension rad
|
||||
* decl - declination rad
|
||||
*
|
||||
* coupling :
|
||||
* -
|
||||
*
|
||||
* references :
|
||||
* VALLADO, DAVID A. (2022) ‘Computer software in MATLAB’, in Fundamentals of astrodynamics and applications. 5th edn.
|
||||
* Computer software in MATLAB: http://celestrak.org/software/vallado-sw.php
|
||||
* --------------------------------------------------------------------------- */
|
||||
function sunPos(jday) {
|
||||
// ------------------------- implementation -----------------
|
||||
// ------------------- initialize values --------------------
|
||||
var tut1 = (jday - 2451545) / 36525;
|
||||
var meanlong = (280.460 + 36000.77 * tut1) % 360; //deg
|
||||
var ttdb = tut1; // is this declaration required instead of replacing `ttdb` with `tut1`
|
||||
var meananomaly = (357.5277233 + 35999.05034 * ttdb * _constants.deg2rad) % _constants.twoPi; //rad
|
||||
if (meananomaly < 0) {
|
||||
meananomaly += _constants.twoPi;
|
||||
}
|
||||
var eclplong_raw = (meanlong + 1.914666471 * Math.sin(meananomaly) + 0.019994643 * Math.sin(2.0 * meananomaly)) % 360.0 * _constants.deg2rad; //rad
|
||||
var obliquity = (23.439291 - 0.0130042 * ttdb) * _constants.deg2rad; //rad
|
||||
// --------- find magnitude of sun vector, and it's components ------
|
||||
var magr = 1.000140612 - 0.016708617 * Math.cos(meananomaly) - 0.000139589 * Math.cos(2.0 * meananomaly); // in au's
|
||||
var rsun = [magr * Math.cos(eclplong_raw), magr * Math.cos(obliquity) * Math.sin(eclplong_raw), magr * Math.sin(obliquity) * Math.sin(eclplong_raw)];
|
||||
var rtasc_raw = Math.atan(Math.cos(obliquity) * Math.tan(eclplong_raw));
|
||||
// --- check that rtasc is in the same quadrant as eclplong_raw ----
|
||||
var eclplong = eclplong_raw;
|
||||
if (eclplong < 0.0) {
|
||||
eclplong += _constants.twoPi; // make sure it's in 0 to 2pi range
|
||||
}
|
||||
var rtasc = rtasc_raw;
|
||||
if (Math.abs(eclplong_raw - rtasc) > _constants.pi * 0.5) {
|
||||
rtasc += 0.5 * _constants.pi * Math.round((eclplong_raw - rtasc_raw) / (0.5 * _constants.pi));
|
||||
}
|
||||
var decl = Math.asin(Math.sin(obliquity) * Math.sin(eclplong_raw));
|
||||
return {
|
||||
rsun: rsun,
|
||||
rtasc: rtasc,
|
||||
decl: decl
|
||||
};
|
||||
}
|
||||
/* Original MATLAB code for Sun position from Vallado package (sun.mat) */
|
||||
/*
|
||||
function [rsun,rtasc,decl] = sun ( jd );
|
||||
|
||||
twopi = 2.0*pi;
|
||||
deg2rad = pi/180.0;
|
||||
show = 'n';
|
||||
|
||||
% ------------------------- implementation -----------------
|
||||
% ------------------- initialize values --------------------
|
||||
tut1= ( jd - 2451545.0 )/ 36525.0;
|
||||
|
||||
if show == 'y'
|
||||
fprintf(1,'tut1 %14.9f \n',tut1);
|
||||
end
|
||||
|
||||
meanlong= 280.460 + 36000.77*tut1;
|
||||
meanlong= rem( meanlong,360.0 ); %deg
|
||||
|
||||
ttdb= tut1;
|
||||
meananomaly= 357.5277233 + 35999.05034 *ttdb;
|
||||
meananomaly= rem( meananomaly*deg2rad,twopi ); %rad
|
||||
if ( meananomaly < 0.0 )
|
||||
meananomaly= twopi + meananomaly;
|
||||
end
|
||||
|
||||
eclplong_raw= meanlong + 1.914666471 *sin(meananomaly) ...
|
||||
+ 0.019994643 *sin(2.0 *meananomaly); %deg
|
||||
eclplong_raw= rem( eclplong_raw,360.0 ); %deg
|
||||
|
||||
obliquity= 23.439291 - 0.0130042 *ttdb; %deg
|
||||
|
||||
eclplong_raw = eclplong_raw *deg2rad;
|
||||
obliquity= obliquity *deg2rad;
|
||||
|
||||
% --------- find magnitude of sun vector, ) components ------
|
||||
magr= 1.000140612 - 0.016708617 *cos( meananomaly ) ...
|
||||
- 0.000139589 *cos( 2.0 *meananomaly ); % in au's
|
||||
|
||||
rsun(1)= magr*cos( eclplong_raw );
|
||||
rsun(2)= magr*cos(obliquity)*sin(eclplong_raw);
|
||||
rsun(3)= magr*sin(obliquity)*sin(eclplong_raw);
|
||||
|
||||
if show == 'y'
|
||||
fprintf(1,'meanlon %11.6f meanan %11.6f eclplon %11.6f obli %11.6f \n', ...
|
||||
meanlong,meananomaly/deg2rad,eclplong_raw/deg2rad,obliquity/deg2rad);
|
||||
fprintf(1,'rs %11.9f %11.9f %11.9f \n',rsun);
|
||||
fprintf(1,'magr %14.7f \n',magr);
|
||||
end
|
||||
|
||||
rtasc= atan( cos(obliquity)*tan(eclplong_raw) );
|
||||
|
||||
% --- check that rtasc is in the same quadrant as eclplong_raw ----
|
||||
if ( eclplong_raw < 0.0 )
|
||||
eclplong_raw= eclplong_raw + twopi; % make sure it's in 0 to 2pi range
|
||||
end
|
||||
if ( abs( eclplong_raw-rtasc ) > pi*0.5 )
|
||||
rtasc= rtasc + 0.5 *pi*round( (eclplong_raw-rtasc)/(0.5 *pi));
|
||||
end
|
||||
decl = asin( sin(obliquity)*sin(eclplong_raw) );
|
||||
*/
|
||||
+167
@@ -0,0 +1,167 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.degreesLat = degreesLat;
|
||||
exports.degreesLong = degreesLong;
|
||||
exports.degreesToRadians = degreesToRadians;
|
||||
exports.ecfToEci = ecfToEci;
|
||||
exports.ecfToLookAngles = ecfToLookAngles;
|
||||
exports.eciToEcf = eciToEcf;
|
||||
exports.eciToGeodetic = eciToGeodetic;
|
||||
exports.geodeticToEcf = geodeticToEcf;
|
||||
exports.radiansLat = radiansLat;
|
||||
exports.radiansLong = radiansLong;
|
||||
exports.radiansToDegrees = radiansToDegrees;
|
||||
var _constants = require("./constants");
|
||||
function radiansToDegrees(radians) {
|
||||
return radians * _constants.rad2deg;
|
||||
}
|
||||
function degreesToRadians(degrees) {
|
||||
return degrees * _constants.deg2rad;
|
||||
}
|
||||
function degreesLat(radians) {
|
||||
if (radians < -_constants.pi / 2 || radians > _constants.pi / 2) {
|
||||
throw new RangeError('Latitude radians must be in range [-pi/2; pi/2].');
|
||||
}
|
||||
return radiansToDegrees(radians);
|
||||
}
|
||||
function degreesLong(radians) {
|
||||
if (radians < -_constants.pi || radians > _constants.pi) {
|
||||
throw new RangeError('Longitude radians must be in range [-pi; pi].');
|
||||
}
|
||||
return radiansToDegrees(radians);
|
||||
}
|
||||
function radiansLat(degrees) {
|
||||
if (degrees < -90 || degrees > 90) {
|
||||
throw new RangeError('Latitude degrees must be in range [-90; 90].');
|
||||
}
|
||||
return degreesToRadians(degrees);
|
||||
}
|
||||
function radiansLong(degrees) {
|
||||
if (degrees < -180 || degrees > 180) {
|
||||
throw new RangeError('Longitude degrees must be in range [-180; 180].');
|
||||
}
|
||||
return degreesToRadians(degrees);
|
||||
}
|
||||
function geodeticToEcf(_ref) {
|
||||
var longitude = _ref.longitude,
|
||||
latitude = _ref.latitude,
|
||||
height = _ref.height;
|
||||
var a = 6378.137;
|
||||
var b = 6356.7523142;
|
||||
var f = (a - b) / a;
|
||||
var e2 = 2 * f - f * f;
|
||||
var normal = a / Math.sqrt(1 - e2 * (Math.sin(latitude) * Math.sin(latitude)));
|
||||
var x = (normal + height) * Math.cos(latitude) * Math.cos(longitude);
|
||||
var y = (normal + height) * Math.cos(latitude) * Math.sin(longitude);
|
||||
var z = (normal * (1 - e2) + height) * Math.sin(latitude);
|
||||
return {
|
||||
x: x,
|
||||
y: y,
|
||||
z: z
|
||||
};
|
||||
}
|
||||
function eciToGeodetic(eci, gmst) {
|
||||
// http://www.celestrak.com/columns/v02n03/
|
||||
var a = 6378.137;
|
||||
var b = 6356.7523142;
|
||||
var R = Math.sqrt(eci.x * eci.x + eci.y * eci.y);
|
||||
var f = (a - b) / a;
|
||||
var e2 = 2 * f - f * f;
|
||||
var longitude = Math.atan2(eci.y, eci.x) - gmst;
|
||||
while (longitude < -_constants.pi) {
|
||||
longitude += _constants.twoPi;
|
||||
}
|
||||
while (longitude > _constants.pi) {
|
||||
longitude -= _constants.twoPi;
|
||||
}
|
||||
var kmax = 20;
|
||||
var k = 0;
|
||||
var latitude = Math.atan2(eci.z, Math.sqrt(eci.x * eci.x + eci.y * eci.y));
|
||||
var C;
|
||||
while (k++ < kmax) {
|
||||
C = 1 / Math.sqrt(1 - e2 * (Math.sin(latitude) * Math.sin(latitude)));
|
||||
latitude = Math.atan2(eci.z + a * C * e2 * Math.sin(latitude), R);
|
||||
}
|
||||
var height = R / Math.cos(latitude) - a * C;
|
||||
return {
|
||||
longitude: longitude,
|
||||
latitude: latitude,
|
||||
height: height
|
||||
};
|
||||
}
|
||||
function ecfToEci(ecf, gmst) {
|
||||
// ccar.colorado.edu/ASEN5070/handouts/coordsys.doc
|
||||
//
|
||||
// [X] [C -S 0][X]
|
||||
// [Y] = [S C 0][Y]
|
||||
// [Z]eci [0 0 1][Z]ecf
|
||||
//
|
||||
var X = ecf.x * Math.cos(gmst) - ecf.y * Math.sin(gmst);
|
||||
var Y = ecf.x * Math.sin(gmst) + ecf.y * Math.cos(gmst);
|
||||
var Z = ecf.z;
|
||||
return {
|
||||
x: X,
|
||||
y: Y,
|
||||
z: Z
|
||||
};
|
||||
}
|
||||
function eciToEcf(eci, gmst) {
|
||||
// ccar.colorado.edu/ASEN5070/handouts/coordsys.doc
|
||||
//
|
||||
// [X] [C -S 0][X]
|
||||
// [Y] = [S C 0][Y]
|
||||
// [Z]eci [0 0 1][Z]ecf
|
||||
//
|
||||
//
|
||||
// Inverse:
|
||||
// [X] [C S 0][X]
|
||||
// [Y] = [-S C 0][Y]
|
||||
// [Z]ecf [0 0 1][Z]eci
|
||||
var x = eci.x * Math.cos(gmst) + eci.y * Math.sin(gmst);
|
||||
var y = eci.x * -Math.sin(gmst) + eci.y * Math.cos(gmst);
|
||||
var z = eci.z;
|
||||
return {
|
||||
x: x,
|
||||
y: y,
|
||||
z: z
|
||||
};
|
||||
}
|
||||
function topocentric(observerGeodetic, satelliteEcf) {
|
||||
// http://www.celestrak.com/columns/v02n02/
|
||||
// TS Kelso's method, except I'm using ECF frame
|
||||
// and he uses ECI.
|
||||
var longitude = observerGeodetic.longitude,
|
||||
latitude = observerGeodetic.latitude;
|
||||
var observerEcf = geodeticToEcf(observerGeodetic);
|
||||
var rx = satelliteEcf.x - observerEcf.x;
|
||||
var ry = satelliteEcf.y - observerEcf.y;
|
||||
var rz = satelliteEcf.z - observerEcf.z;
|
||||
var topS = Math.sin(latitude) * Math.cos(longitude) * rx + Math.sin(latitude) * Math.sin(longitude) * ry - Math.cos(latitude) * rz;
|
||||
var topE = -Math.sin(longitude) * rx + Math.cos(longitude) * ry;
|
||||
var topZ = Math.cos(latitude) * Math.cos(longitude) * rx + Math.cos(latitude) * Math.sin(longitude) * ry + Math.sin(latitude) * rz;
|
||||
return {
|
||||
topS: topS,
|
||||
topE: topE,
|
||||
topZ: topZ
|
||||
};
|
||||
}
|
||||
function topocentricToLookAngles(tc) {
|
||||
var topS = tc.topS,
|
||||
topE = tc.topE,
|
||||
topZ = tc.topZ;
|
||||
var rangeSat = Math.sqrt(topS * topS + topE * topE + topZ * topZ);
|
||||
var El = Math.asin(topZ / rangeSat);
|
||||
var Az = Math.atan2(-topE, topS) + _constants.pi;
|
||||
return {
|
||||
azimuth: Az,
|
||||
elevation: El,
|
||||
rangeSat: rangeSat // Range in km
|
||||
};
|
||||
}
|
||||
function ecfToLookAngles(observerGeodetic, satelliteEcf) {
|
||||
var topocentricCoords = topocentric(observerGeodetic, satelliteEcf);
|
||||
return topocentricToLookAngles(topocentricCoords);
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"name": "satellite.js",
|
||||
"version": "6.0.2",
|
||||
"description": "SGP4/SDP4 calculation library",
|
||||
"main": "lib/index.js",
|
||||
"jsnext:main": "dist/satellite.es.js",
|
||||
"types": "types/index.d.ts",
|
||||
"module": "dist/satellite.es.js",
|
||||
"scripts": {
|
||||
"build": "rimraf lib dist compiled types && tsc && npm run transpile && npm run dist",
|
||||
"transpile": "babel compiled --out-dir lib --ignore indexUmd.js",
|
||||
"dist": "npm run dist:es && npm run dist:umd:dev && npm run dist:umd:prod",
|
||||
"dist:es": "rollup --bundleConfigAsCjs --config rollup.config.es.js",
|
||||
"dist:umd": "rollup --bundleConfigAsCjs --config rollup.config.js",
|
||||
"dist:umd:dev": "cross-env NODE_ENV=development npm run dist:umd",
|
||||
"dist:umd:prod": "cross-env NODE_ENV=production npm run dist:umd",
|
||||
"watch:es": "node --require @babel/register rollup.watch.es.js",
|
||||
"copy": "copyfiles -u 1 'dist/**/*' sgp4_verification/lib/sgp4",
|
||||
"lint": "eslint src",
|
||||
"lint:test": "eslint test",
|
||||
"test": "jest",
|
||||
"test:coverage": "jest --coverage",
|
||||
"raise": "raise-version"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/shashwatak/satellite-js"
|
||||
},
|
||||
"keywords": [
|
||||
"sgp4",
|
||||
"sdp4",
|
||||
"satellite",
|
||||
"TLE",
|
||||
"two-line elements",
|
||||
"OMM",
|
||||
"sgp4prop"
|
||||
],
|
||||
"author": "Shashwat Kandadai <shashwatak@gmail.com> (https://github.com/shashwatak)",
|
||||
"contributors": [
|
||||
"Dmitriy Pushkov <ezze@ezze.org> (http://www.ezze.org)"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bugs": {
|
||||
"url": "https://github.com/shashwatak/satellite-js/issues"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.20.7",
|
||||
"@babel/core": "^7.20.12",
|
||||
"@babel/plugin-proposal-class-properties": "^7.18.6",
|
||||
"@babel/plugin-proposal-json-strings": "^7.18.6",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/plugin-syntax-import-meta": "^7.10.4",
|
||||
"@babel/preset-env": "^7.20.2",
|
||||
"@babel/register": "^7.18.9",
|
||||
"@eslint/js": "^9.22.0",
|
||||
"@rollup/plugin-babel": "^6.0.3",
|
||||
"@rollup/plugin-terser": "^0.2.1",
|
||||
"chokidar": "^3.5.3",
|
||||
"copyfiles": "^2.4.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"eslint": "^9.22.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"glob": "^8.0.3",
|
||||
"jest": "^29.7.0",
|
||||
"prepend-file": "^2.0.1",
|
||||
"raise-version": "^0.5.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"rollup": "^3.9.1",
|
||||
"typescript": "^5.8.2",
|
||||
"typescript-eslint": "^8.26.1"
|
||||
},
|
||||
"jest": {
|
||||
"testPathIgnorePatterns": [
|
||||
"node_modules",
|
||||
"test/propagation/sgp4Catalog.test.js"
|
||||
]
|
||||
},
|
||||
"homepage": "https://github.com/shashwatak/satellite-js",
|
||||
"directories": {
|
||||
"lib": "lib",
|
||||
"test": "test"
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+27
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES6",
|
||||
"strict": true,
|
||||
"allowUnusedLabels": false,
|
||||
"allowUnreachableCode": false,
|
||||
"exactOptionalPropertyTypes": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noImplicitOverride": true,
|
||||
"noImplicitReturns": true,
|
||||
"noPropertyAccessFromIndexSignature": true,
|
||||
"noUncheckedIndexedAccess": true,
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"isolatedModules": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"declaration": true,
|
||||
"declarationDir": "./types",
|
||||
"outDir": "./compiled",
|
||||
},
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"display": "Strictest (minus esModuleInterop)",
|
||||
"include": [
|
||||
"src/**.ts",
|
||||
],
|
||||
}
|
||||
+215
@@ -0,0 +1,215 @@
|
||||
/**
|
||||
* Type alias documents units are kilometer (km)
|
||||
*/
|
||||
export type Kilometer = number;
|
||||
/**
|
||||
* Type alias documents units are kilometer per second (km/s)
|
||||
*/
|
||||
export type KilometerPerSecond = number;
|
||||
/**
|
||||
* Type alias documents units are radians
|
||||
*/
|
||||
export type Radians = number;
|
||||
/**
|
||||
* Type alias documents units are degrees
|
||||
*/
|
||||
export type Degrees = number;
|
||||
/**
|
||||
* Type alias documents units for mean motion are radians per minute
|
||||
*/
|
||||
export type RadiansPerMinute = number;
|
||||
/**
|
||||
* Type alias documents units for semi-major axis (earth radii)
|
||||
*/
|
||||
export type EarthRadii = number;
|
||||
/**
|
||||
* Coordinate frame Earth Centered Inertial (ECI)
|
||||
* https://en.wikipedia.org/wiki/Earth-centered_inertial
|
||||
*/
|
||||
export interface EciVec3<T> {
|
||||
x: T;
|
||||
y: T;
|
||||
z: T;
|
||||
}
|
||||
/**
|
||||
* Coordinate frame Earth Centered Fixed (ECF)
|
||||
* https://en.wikipedia.org/wiki/ECEF
|
||||
*/
|
||||
export interface EcfVec3<T> {
|
||||
x: T;
|
||||
y: T;
|
||||
z: T;
|
||||
}
|
||||
/**
|
||||
* A set of "singly averaged mean elements" that describe shape of the
|
||||
* satellite’s orbit at the propagation date. They are averaged
|
||||
* with respect to the mean anomaly and include the effects of secular
|
||||
* gravity, atmospheric drag, and - in Deep Space mode - of those
|
||||
* pertubations from the Sun and Moon that SGP4 averages over an entire
|
||||
* revolution of each of those bodies. They omit both the shorter-term
|
||||
* and longer-term periodic pertubations from the Sun and Moon that
|
||||
* SGP4 applies right before computing each position.
|
||||
*/
|
||||
export interface MeanElements {
|
||||
/**
|
||||
* Average semi-major axis (earth radii).
|
||||
*/
|
||||
am: EarthRadii;
|
||||
/**
|
||||
* Average eccentricity.
|
||||
*/
|
||||
em: number;
|
||||
/**
|
||||
* Average inclination (radians).
|
||||
*/
|
||||
im: Radians;
|
||||
/**
|
||||
* Average right ascension of ascending node (radians).
|
||||
*/
|
||||
Om: Radians;
|
||||
/**
|
||||
* Average argument of perigee (radians).
|
||||
*/
|
||||
om: Radians;
|
||||
/**
|
||||
* Average mean anomaly (radians).
|
||||
*/
|
||||
mm: Radians;
|
||||
/**
|
||||
* Average mean motion (radians/minute).
|
||||
*/
|
||||
nm: RadiansPerMinute;
|
||||
}
|
||||
/**
|
||||
* The position_velocity result is a key-value pair of ECI coordinates.
|
||||
* These are the base results from which all other coordinates are derived.
|
||||
* If there is an error the position and velocity will be false.
|
||||
* The meanElements are the averaged elements of the orbit at the
|
||||
* moment of propagation.
|
||||
*/
|
||||
export interface PositionAndVelocity {
|
||||
position: EciVec3<Kilometer>;
|
||||
velocity: EciVec3<KilometerPerSecond>;
|
||||
meanElements: MeanElements;
|
||||
}
|
||||
/**
|
||||
* https://en.wikipedia.org/wiki/Geographic_coordinate_system#Latitude_and_longitude
|
||||
*/
|
||||
export interface GeodeticLocation {
|
||||
longitude: Radians;
|
||||
latitude: Radians;
|
||||
height: Kilometer;
|
||||
}
|
||||
/**
|
||||
* You will need GMST for some of the coordinate transforms.
|
||||
* GMST - Greenwich Mean Sidereal Time
|
||||
* http://en.wikipedia.org/wiki/Sidereal_time#Definition
|
||||
*/
|
||||
export type GMSTime = number;
|
||||
/**
|
||||
* https://en.wikipedia.org/wiki/Azimuth
|
||||
*/
|
||||
export interface LookAngles {
|
||||
azimuth: Radians;
|
||||
elevation: Radians;
|
||||
rangeSat: Kilometer;
|
||||
}
|
||||
type StartsWith<T extends string> = `${T}${string}`;
|
||||
/**
|
||||
* This is the base interface for the OMM JSON object as specified in Orbit Data Messages
|
||||
* recommended standard, version 3.0.
|
||||
*
|
||||
* Note that this is not a 1:1 mapping. Only the fields that are necessary to propagate
|
||||
* a satellite orbit are made required. For example, CCSDS_OMM_VERS is required by the spec,
|
||||
* but is not present in Celestrak OMM output, and is not required to propagate the satellite,
|
||||
* so it is made optional here.
|
||||
*
|
||||
* Numeric fields may be represented as strings or numbers in the original json, depending on
|
||||
* the source. This is because the spec doesn't specify the type, and different sources use
|
||||
* different types: at the time of writing, Celestrak uses numbers, while SpaceTrack uses strings.
|
||||
*/
|
||||
export interface OMMJsonObjectV3 {
|
||||
/**
|
||||
* The version is restricted in TypeScript to only among the ones this library supports.
|
||||
* Versions are incremented on breaking changes, so it is adviced you validate this field.
|
||||
*
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional
|
||||
* and assume version 3.0 if not present.
|
||||
*/
|
||||
CCSDS_OMM_VERS?: StartsWith<'3.'>;
|
||||
COMMENT?: string;
|
||||
CLASSIFICATION?: string;
|
||||
OBJECT_NAME: string;
|
||||
/**
|
||||
* Recommended, but not required, to be an International spacecraft designator.
|
||||
*/
|
||||
OBJECT_ID: string;
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional.
|
||||
* If present, it is restricted to only the value this library supports.
|
||||
*/
|
||||
CENTER_NAME?: 'EARTH';
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional.
|
||||
* If present, it is restricted to only 'TEME' as it is the only value that can come with
|
||||
* SGP ephemeris type.
|
||||
*/
|
||||
REF_FRAME?: 'TEME';
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional
|
||||
*/
|
||||
REF_FRAME_EPOCH?: string;
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional
|
||||
*/
|
||||
TIME_SYSTEM?: 'UTC';
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional
|
||||
*/
|
||||
MEAN_ELEMENT_THEORY?: 'SGP4';
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional
|
||||
*/
|
||||
CREATION_DATE?: string;
|
||||
/**
|
||||
* NOTE: This is required field in OMM spec, but Celestrak omits it, so we make it optional
|
||||
*/
|
||||
ORIGINATOR?: string;
|
||||
/**
|
||||
* ISO datetime
|
||||
*/
|
||||
EPOCH: string;
|
||||
MEAN_MOTION: string | number;
|
||||
ECCENTRICITY: string | number;
|
||||
/**
|
||||
* Degrees
|
||||
*/
|
||||
INCLINATION: number | string;
|
||||
RA_OF_ASC_NODE: number | string;
|
||||
/**
|
||||
* Degrees
|
||||
*/
|
||||
ARG_OF_PERICENTER: number | string;
|
||||
/**
|
||||
* Degrees
|
||||
*/
|
||||
MEAN_ANOMALY: number | string;
|
||||
/**
|
||||
* The only value supported by this library
|
||||
*/
|
||||
EPHEMERIS_TYPE?: 0 | "0";
|
||||
CLASSIFICATION_TYPE?: "U" | "C";
|
||||
NORAD_CAT_ID: string | number;
|
||||
ELEMENT_SET_NO: string | number;
|
||||
REV_AT_EPOCH?: string | number;
|
||||
BSTAR: string | number;
|
||||
MEAN_MOTION_DOT: string | number;
|
||||
MEAN_MOTION_DDOT: string | number;
|
||||
/**
|
||||
* This handles additional metadata, such as OBJECT_TYPE, COUNTRY_CODE etc
|
||||
*/
|
||||
[key: string]: unknown;
|
||||
}
|
||||
export type OMMJsonObject = OMMJsonObjectV3;
|
||||
export type SupportedOMMVersion = NonNullable<OMMJsonObject['CCSDS_OMM_VERS']>;
|
||||
export {};
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
export declare const pi: number;
|
||||
export declare const twoPi: number;
|
||||
export declare const deg2rad: number;
|
||||
export declare const rad2deg: number;
|
||||
export declare const minutesPerDay = 1440;
|
||||
export declare const mu = 398600.8;
|
||||
export declare const earthRadius = 6378.135;
|
||||
export declare const xke: number;
|
||||
export declare const vkmpersec: number;
|
||||
export declare const tumin: number;
|
||||
export declare const j2 = 0.001082616;
|
||||
export declare const j3 = -0.00000253881;
|
||||
export declare const j4 = -0.00000165597;
|
||||
export declare const j3oj2: number;
|
||||
export declare const x2o3: number;
|
||||
export declare const xpdotp: number;
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
import { EcfVec3, Kilometer, KilometerPerSecond } from './common-types.js';
|
||||
/**
|
||||
* Negative range rate means the satellite is moving towards the observer and
|
||||
* its frequency is shifted higher because 1 minus a negative range rate is
|
||||
* positive. If the range rate is positive, the satellite is moving away from
|
||||
* the observer and its frequency is shifted lower.
|
||||
*/
|
||||
export default function dopplerFactor(observerCoordsEcf: EcfVec3<Kilometer>, positionEcf: EcfVec3<Kilometer>, velocityEcf: EcfVec3<KilometerPerSecond>): number;
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
export type JDay = number;
|
||||
export declare function days2mdhms(year: number, days: number): {
|
||||
mon: number;
|
||||
day: number;
|
||||
hr: number;
|
||||
minute: number;
|
||||
sec: number;
|
||||
};
|
||||
export declare function jday(year: Date): JDay;
|
||||
export declare function jday(year: number, mon: number, day: number, hr: number, minute: number, sec: number, msec?: number): JDay;
|
||||
export declare function invjday(jd: JDay, asArray: true): [year: number, mon: number, day: number, hr: number, minute: number, sec: number];
|
||||
export declare function invjday(jd: JDay, asArray?: false): Date;
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
export * as constants from './constants';
|
||||
export { jday, invjday } from './ext';
|
||||
export { twoline2satrec, json2satrec } from './io';
|
||||
export { propagate, sgp4, gstime } from './propagation';
|
||||
export { default as dopplerFactor } from './dopplerFactor';
|
||||
export { radiansToDegrees, degreesToRadians, degreesLat, degreesLong, radiansLat, radiansLong, geodeticToEcf, eciToGeodetic, eciToEcf, ecfToEci, ecfToLookAngles, } from './transforms';
|
||||
export { sunPos } from './sun';
|
||||
export { type SatRec, SatRecError } from './propagation/SatRec.js';
|
||||
export * from './common-types.js';
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import * as constants from './constants';
|
||||
import { jday, invjday } from './ext';
|
||||
import { twoline2satrec, json2satrec } from './io';
|
||||
import { propagate, sgp4, gstime } from './propagation';
|
||||
import { SatRecError } from './propagation/SatRec.js';
|
||||
import dopplerFactor from './dopplerFactor';
|
||||
import { radiansToDegrees, degreesToRadians, degreesLat, degreesLong, radiansLat, radiansLong, geodeticToEcf, eciToGeodetic, eciToEcf, ecfToEci, ecfToLookAngles } from './transforms';
|
||||
import { sunPos } from './sun';
|
||||
declare const _default: {
|
||||
SatRecError: typeof SatRecError;
|
||||
constants: typeof constants;
|
||||
propagate: typeof propagate;
|
||||
sgp4: typeof sgp4;
|
||||
twoline2satrec: typeof twoline2satrec;
|
||||
json2satrec: typeof json2satrec;
|
||||
gstime: typeof gstime;
|
||||
jday: typeof jday;
|
||||
invjday: typeof invjday;
|
||||
dopplerFactor: typeof dopplerFactor;
|
||||
radiansToDegrees: typeof radiansToDegrees;
|
||||
degreesToRadians: typeof degreesToRadians;
|
||||
degreesLat: typeof degreesLat;
|
||||
degreesLong: typeof degreesLong;
|
||||
radiansLat: typeof radiansLat;
|
||||
radiansLong: typeof radiansLong;
|
||||
geodeticToEcf: typeof geodeticToEcf;
|
||||
eciToGeodetic: typeof eciToGeodetic;
|
||||
eciToEcf: typeof eciToEcf;
|
||||
ecfToEci: typeof ecfToEci;
|
||||
ecfToLookAngles: typeof ecfToLookAngles;
|
||||
sunPos: typeof sunPos;
|
||||
};
|
||||
export default _default;
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
import { OMMJsonObject } from './common-types.js';
|
||||
/**
|
||||
* Return a Satellite imported from two lines of TLE data.
|
||||
*
|
||||
* Provide the two TLE lines as strings `tleLine1` and `tleLine2`,
|
||||
* and select which standard set of gravitational constants you want
|
||||
* by providing `gravity_constants`:
|
||||
*
|
||||
* `sgp4.propagation.wgs72` - Standard WGS 72 model
|
||||
* `sgp4.propagation.wgs84` - More recent WGS 84 model
|
||||
* `sgp4.propagation.wgs72old` - Legacy support for old SGP4 behavior
|
||||
*
|
||||
* Normally, computations are made using letious recent improvements
|
||||
* to the algorithm. If you want to turn some of these off and go
|
||||
* back into "afspc" mode, then set `afspc_mode` to `True`.
|
||||
*/
|
||||
export declare function twoline2satrec(longstr1: string, longstr2: string): import("./propagation/SatRec.js").SatRec;
|
||||
export declare function json2satrec(jsonobj: OMMJsonObject, opsmode?: 'a' | 'i'): import("./propagation/SatRec.js").SatRec;
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
export { default as propagate } from './propagation/propagate';
|
||||
export { default as sgp4 } from './propagation/sgp4';
|
||||
export { default as gstime } from './propagation/gstime';
|
||||
+196
@@ -0,0 +1,196 @@
|
||||
export declare enum SatRecError {
|
||||
/**
|
||||
* No error, propagation for the last supplied date is successful
|
||||
*/
|
||||
None = 0,
|
||||
/**
|
||||
* Mean eccentricity is out of range 0 ≤ e < 1
|
||||
*/
|
||||
MeanEccentricityOutOfRange = 1,
|
||||
/**
|
||||
* Mean motion has fallen below zero.
|
||||
*/
|
||||
MeanMotionBelowZero = 2,
|
||||
/**
|
||||
* Perturbed eccentricity is out of range 0 ≤ e < 1
|
||||
*/
|
||||
PerturbedEccentricityOutOfRange = 3,
|
||||
/**
|
||||
* Length of the orbit’s semi-latus rectum has fallen below zero.
|
||||
*/
|
||||
SemiLatusRectumBelowZero = 4,
|
||||
/**
|
||||
* Orbit has decayed: the computed position is underground.
|
||||
*/
|
||||
Decayed = 6
|
||||
}
|
||||
/**
|
||||
* A structure that contains all the information needed to propagate a satellite's orbit using the SGP4 model.
|
||||
*
|
||||
* Mostly you can consider it opaque as you only need to pass it to `propagate` function.
|
||||
* All properties should be considered read-only as they're used and set by SGP4 model internally.
|
||||
*
|
||||
* This interface is a direct translation of C++ struct `elsetrec` from the source code by David Vallado;
|
||||
* all changes to the original struct are documented.
|
||||
*/
|
||||
export interface SatRec {
|
||||
/**
|
||||
* Stringified satellite number, usually from NORAD catalog
|
||||
*/
|
||||
satnum: string;
|
||||
/**
|
||||
* Full four-digit year of this element set's epoch moment
|
||||
*/
|
||||
epochyr: number;
|
||||
epochtynumrev: number;
|
||||
/**
|
||||
* Error code produced by the most recent SGP4 propagation you performed with this element set.
|
||||
*/
|
||||
error: SatRecError;
|
||||
/**
|
||||
* A single character that directs SGP4 to either operate in its modern 'i' improved mode or
|
||||
* in its legacy 'a' AFSPC mode.
|
||||
*/
|
||||
operationmode: 'a' | 'i';
|
||||
init: 'y' | 'n';
|
||||
/**
|
||||
* A single character, chosen automatically when the orbital elements were loaded, that
|
||||
* indicates whether SGP4 has chosen to use its built-in 'n' Near Earth or 'd' Deep Space
|
||||
* mode for this satellite.
|
||||
*/
|
||||
method: 'n' | 'd';
|
||||
isimp: number;
|
||||
aycof: number;
|
||||
con41: number;
|
||||
cc1: number;
|
||||
cc4: number;
|
||||
cc5: number;
|
||||
d2: number;
|
||||
d3: number;
|
||||
d4: number;
|
||||
delmo: number;
|
||||
eta: number;
|
||||
argpdot: number;
|
||||
omgcof: number;
|
||||
sinmao: number;
|
||||
/**
|
||||
* The time you gave when you most recently asked SGP4 to compute this satellite’s position,
|
||||
* measured in minutes before (negative) or after (positive) the satellite’s epoch.
|
||||
*/
|
||||
t: number;
|
||||
t2cof: number;
|
||||
t3cof: number;
|
||||
t4cof: number;
|
||||
t5cof: number;
|
||||
x1mth2: number;
|
||||
x7thm1: number;
|
||||
mdot: number;
|
||||
nodedot: number;
|
||||
xlcof: number;
|
||||
xmcof: number;
|
||||
nodecf: number;
|
||||
irez: number;
|
||||
d2201: number;
|
||||
d2211: number;
|
||||
d3210: number;
|
||||
d3222: number;
|
||||
d4410: number;
|
||||
d4422: number;
|
||||
d5220: number;
|
||||
d5232: number;
|
||||
d5421: number;
|
||||
d5433: number;
|
||||
dedt: number;
|
||||
del1: number;
|
||||
del2: number;
|
||||
del3: number;
|
||||
didt: number;
|
||||
dmdt: number;
|
||||
dnodt: number;
|
||||
domdt: number;
|
||||
e3: number;
|
||||
ee2: number;
|
||||
peo: number;
|
||||
pgho: number;
|
||||
pho: number;
|
||||
pinco: number;
|
||||
plo: number;
|
||||
se2: number;
|
||||
se3: number;
|
||||
sgh2: number;
|
||||
sgh3: number;
|
||||
sgh4: number;
|
||||
sh2: number;
|
||||
sh3: number;
|
||||
si2: number;
|
||||
si3: number;
|
||||
sl2: number;
|
||||
sl3: number;
|
||||
sl4: number;
|
||||
gsto: number;
|
||||
xfact: number;
|
||||
xgh2: number;
|
||||
xgh3: number;
|
||||
xgh4: number;
|
||||
xh2: number;
|
||||
xh3: number;
|
||||
xi2: number;
|
||||
xi3: number;
|
||||
xl2: number;
|
||||
xl3: number;
|
||||
xl4: number;
|
||||
xlamo: number;
|
||||
zmol: number;
|
||||
zmos: number;
|
||||
atime: number;
|
||||
xli: number;
|
||||
xni: number;
|
||||
a: number;
|
||||
altp: number;
|
||||
alta: number;
|
||||
/**
|
||||
* Fractional days into the year of the epoch moment in UTC.
|
||||
*/
|
||||
epochdays: number;
|
||||
/**
|
||||
* Julian date of the epoch (computed from epochyr and epochdays).
|
||||
*/
|
||||
jdsatepoch: number;
|
||||
/**
|
||||
* Second time derivative of the mean motion (ignored by SGP4).
|
||||
*/
|
||||
nddot: number;
|
||||
/**
|
||||
* First time derivative of the mean motion (ignored by SGP4).
|
||||
*/
|
||||
ndot: number;
|
||||
/**
|
||||
* Ballistic drag coefficient B* in inverse earth radii.
|
||||
*/
|
||||
bstar: number;
|
||||
/**
|
||||
* Inclination in radians.
|
||||
*/
|
||||
inclo: number;
|
||||
/**
|
||||
* Right ascension of ascending node in radians.
|
||||
*/
|
||||
nodeo: number;
|
||||
/**
|
||||
* Eccentricity.
|
||||
*/
|
||||
ecco: number;
|
||||
/**
|
||||
* Argument of perigee in radians.
|
||||
*/
|
||||
argpo: number;
|
||||
/**
|
||||
* Mean anomaly in radians.
|
||||
*/
|
||||
mo: number;
|
||||
/**
|
||||
* Mean motion in radians per minute.
|
||||
*/
|
||||
no: number;
|
||||
}
|
||||
export type SatRecInit = Pick<SatRec, "error" | "satnum" | "epochyr" | "epochdays" | "ndot" | "nddot" | "bstar" | "inclo" | "nodeo" | "ecco" | "argpo" | "mo" | "no" | "jdsatepoch">;
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
import { SatRec } from './SatRec.js';
|
||||
interface DpperOptions {
|
||||
init: 'y' | 'n';
|
||||
opsmode: 'a' | 'i';
|
||||
ep: number;
|
||||
inclp: number;
|
||||
nodep: number;
|
||||
argpp: number;
|
||||
mp: number;
|
||||
}
|
||||
export default function dpper(satrec: SatRec, options: DpperOptions): {
|
||||
ep: number;
|
||||
inclp: number;
|
||||
nodep: number;
|
||||
argpp: number;
|
||||
mp: number;
|
||||
};
|
||||
export {};
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
interface DscomOptions {
|
||||
epoch: number;
|
||||
ep: number;
|
||||
argpp: number;
|
||||
tc: number;
|
||||
inclp: number;
|
||||
nodep: number;
|
||||
np: number;
|
||||
}
|
||||
export default function dscom(options: DscomOptions): {
|
||||
snodm: number;
|
||||
cnodm: number;
|
||||
sinim: number;
|
||||
cosim: number;
|
||||
sinomm: number;
|
||||
cosomm: number;
|
||||
day: number;
|
||||
e3: number;
|
||||
ee2: number;
|
||||
em: number;
|
||||
emsq: number;
|
||||
gam: number;
|
||||
peo: number;
|
||||
pgho: number;
|
||||
pho: number;
|
||||
pinco: number;
|
||||
plo: number;
|
||||
rtemsq: number;
|
||||
se2: number;
|
||||
se3: number;
|
||||
sgh2: number;
|
||||
sgh3: number;
|
||||
sgh4: number;
|
||||
sh2: number;
|
||||
sh3: number;
|
||||
si2: number;
|
||||
si3: number;
|
||||
sl2: number;
|
||||
sl3: number;
|
||||
sl4: number;
|
||||
s1: number | undefined;
|
||||
s2: number | undefined;
|
||||
s3: number | undefined;
|
||||
s4: number | undefined;
|
||||
s5: number | undefined;
|
||||
s6: number | undefined;
|
||||
s7: number | undefined;
|
||||
ss1: number | undefined;
|
||||
ss2: number | undefined;
|
||||
ss3: number | undefined;
|
||||
ss4: number | undefined;
|
||||
ss5: number | undefined;
|
||||
ss6: number | undefined;
|
||||
ss7: number | undefined;
|
||||
sz1: number | undefined;
|
||||
sz2: number | undefined;
|
||||
sz3: number | undefined;
|
||||
sz11: number | undefined;
|
||||
sz12: number | undefined;
|
||||
sz13: number | undefined;
|
||||
sz21: number | undefined;
|
||||
sz22: number | undefined;
|
||||
sz23: number | undefined;
|
||||
sz31: number | undefined;
|
||||
sz32: number | undefined;
|
||||
sz33: number | undefined;
|
||||
xgh2: number;
|
||||
xgh3: number;
|
||||
xgh4: number;
|
||||
xh2: number;
|
||||
xh3: number;
|
||||
xi2: number;
|
||||
xi3: number;
|
||||
xl2: number;
|
||||
xl3: number;
|
||||
xl4: number;
|
||||
nm: number;
|
||||
z1: number | undefined;
|
||||
z2: number | undefined;
|
||||
z3: number | undefined;
|
||||
z11: number | undefined;
|
||||
z12: number | undefined;
|
||||
z13: number | undefined;
|
||||
z21: number | undefined;
|
||||
z22: number | undefined;
|
||||
z23: number | undefined;
|
||||
z31: number | undefined;
|
||||
z32: number | undefined;
|
||||
z33: number | undefined;
|
||||
zmol: number;
|
||||
zmos: number;
|
||||
};
|
||||
export {};
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
interface DsinitOptions {
|
||||
cosim: number;
|
||||
emsq: number;
|
||||
argpo: number;
|
||||
s1: number;
|
||||
s2: number;
|
||||
s3: number;
|
||||
s4: number;
|
||||
s5: number;
|
||||
sinim: number;
|
||||
ss1: number;
|
||||
ss2: number;
|
||||
ss3: number;
|
||||
ss4: number;
|
||||
ss5: number;
|
||||
sz1: number;
|
||||
sz3: number;
|
||||
sz11: number;
|
||||
sz13: number;
|
||||
sz21: number;
|
||||
sz23: number;
|
||||
sz31: number;
|
||||
sz33: number;
|
||||
t: number;
|
||||
tc: number;
|
||||
gsto: number;
|
||||
mo: number;
|
||||
mdot: number;
|
||||
no: number;
|
||||
nodeo: number;
|
||||
nodedot: number;
|
||||
xpidot: number;
|
||||
z1: number;
|
||||
z3: number;
|
||||
z11: number;
|
||||
z13: number;
|
||||
z21: number;
|
||||
z23: number;
|
||||
z31: number;
|
||||
z33: number;
|
||||
ecco: number;
|
||||
eccsq: number;
|
||||
em: number;
|
||||
argpm: number;
|
||||
inclm: number;
|
||||
mm: number;
|
||||
nm: number;
|
||||
nodem: number;
|
||||
irez: number;
|
||||
atime: number;
|
||||
d2201: number;
|
||||
d2211: number;
|
||||
d3210: number;
|
||||
d3222: number;
|
||||
d4410: number;
|
||||
d4422: number;
|
||||
d5220: number;
|
||||
d5232: number;
|
||||
d5421: number;
|
||||
d5433: number;
|
||||
dedt: number;
|
||||
didt: number;
|
||||
dmdt: number;
|
||||
dnodt: number;
|
||||
domdt: number;
|
||||
del1: number;
|
||||
del2: number;
|
||||
del3: number;
|
||||
xfact: number;
|
||||
xlamo: number;
|
||||
xli: number;
|
||||
xni: number;
|
||||
}
|
||||
export default function dsinit(options: DsinitOptions): {
|
||||
em: number;
|
||||
argpm: number;
|
||||
inclm: number;
|
||||
mm: number;
|
||||
nm: number;
|
||||
nodem: number;
|
||||
irez: number;
|
||||
atime: number;
|
||||
d2201: number;
|
||||
d2211: number;
|
||||
d3210: number;
|
||||
d3222: number;
|
||||
d4410: number;
|
||||
d4422: number;
|
||||
d5220: number;
|
||||
d5232: number;
|
||||
d5421: number;
|
||||
d5433: number;
|
||||
dedt: number;
|
||||
didt: number;
|
||||
dmdt: number;
|
||||
dndt: number;
|
||||
dnodt: number;
|
||||
domdt: number;
|
||||
del1: number;
|
||||
del2: number;
|
||||
del3: number;
|
||||
xfact: number;
|
||||
xlamo: number;
|
||||
xli: number;
|
||||
xni: number;
|
||||
};
|
||||
export {};
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
interface DspaceOptions {
|
||||
irez: number;
|
||||
d2201: number;
|
||||
d2211: number;
|
||||
d3210: number;
|
||||
d3222: number;
|
||||
d4410: number;
|
||||
d4422: number;
|
||||
d5220: number;
|
||||
d5232: number;
|
||||
d5421: number;
|
||||
d5433: number;
|
||||
dedt: number;
|
||||
del1: number;
|
||||
del2: number;
|
||||
del3: number;
|
||||
didt: number;
|
||||
dmdt: number;
|
||||
dnodt: number;
|
||||
domdt: number;
|
||||
argpo: number;
|
||||
argpdot: number;
|
||||
t: number;
|
||||
tc: number;
|
||||
gsto: number;
|
||||
xfact: number;
|
||||
xlamo: number;
|
||||
no: number;
|
||||
atime: number;
|
||||
em: number;
|
||||
argpm: number;
|
||||
inclm: number;
|
||||
xli: number;
|
||||
mm: number;
|
||||
xni: number;
|
||||
nodem: number;
|
||||
nm: number;
|
||||
}
|
||||
export default function dspace(options: DspaceOptions): {
|
||||
atime: number;
|
||||
em: number;
|
||||
argpm: number;
|
||||
inclm: number;
|
||||
xli: number;
|
||||
mm: number;
|
||||
xni: number;
|
||||
nodem: number;
|
||||
dndt: number;
|
||||
nm: number;
|
||||
};
|
||||
export {};
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
import { GMSTime } from '../common-types.js';
|
||||
declare function gstime(jd: number): GMSTime;
|
||||
declare function gstime(date: Date): GMSTime;
|
||||
declare function gstime(year: number, month: number, day: number, hour: number, minute: number, second: number, millisecond?: number): GMSTime;
|
||||
export default gstime;
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
interface InitlOptions {
|
||||
opsmode: 'a' | 'i';
|
||||
ecco: number;
|
||||
epoch: number;
|
||||
inclo: number;
|
||||
no: number;
|
||||
}
|
||||
export default function initl(options: InitlOptions): {
|
||||
no: number;
|
||||
method: string;
|
||||
ainv: number;
|
||||
ao: number;
|
||||
con41: number;
|
||||
con42: number;
|
||||
cosio: number;
|
||||
cosio2: number;
|
||||
eccsq: number;
|
||||
omeosq: number;
|
||||
posq: number;
|
||||
rp: number;
|
||||
rteosq: number;
|
||||
sinio: number;
|
||||
gsto: number;
|
||||
};
|
||||
export {};
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
import { PositionAndVelocity } from '../common-types.js';
|
||||
import { SatRec } from './SatRec.js';
|
||||
export declare function propagate(satrec: SatRec, date: Date): PositionAndVelocity;
|
||||
export declare function propagate(satrec: SatRec, year: number, month: number, day: number, hour: number, minute: number, second: number, ms?: number): PositionAndVelocity;
|
||||
export default function propagate(satrec: SatRec, ...jdayArgs: [Date] | [number, number, number, number, number, number, (number | undefined)?]): PositionAndVelocity | null;
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
import { PositionAndVelocity } from '../common-types.js';
|
||||
import { SatRec } from './SatRec.js';
|
||||
export default function sgp4(satrec: SatRec, tsince: number): PositionAndVelocity | null;
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
import { SatRec, SatRecInit } from './SatRec.js';
|
||||
export interface Sgp4InitOptions {
|
||||
opsmode: 'a' | 'i';
|
||||
satn: string;
|
||||
epoch: number;
|
||||
xbstar: number;
|
||||
xecco: number;
|
||||
xargpo: number;
|
||||
xinclo: number;
|
||||
xmo: number;
|
||||
xno: number;
|
||||
xnodeo: number;
|
||||
}
|
||||
export default function sgp4init(satrecInit: SatRecInit, options: Sgp4InitOptions): asserts satrecInit is SatRec;
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
import { JDay } from './ext.js';
|
||||
export declare function sunPos(jday: JDay): {
|
||||
rsun: number[];
|
||||
rtasc: number;
|
||||
decl: number;
|
||||
};
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
import { Degrees, EcfVec3, EciVec3, GeodeticLocation, GMSTime, Kilometer, LookAngles, Radians } from './common-types.js';
|
||||
export declare function radiansToDegrees(radians: Radians): Degrees;
|
||||
export declare function degreesToRadians(degrees: Degrees): Radians;
|
||||
export declare function degreesLat(radians: Radians): Degrees;
|
||||
export declare function degreesLong(radians: Radians): Degrees;
|
||||
export declare function radiansLat(degrees: Degrees): Radians;
|
||||
export declare function radiansLong(degrees: Degrees): Radians;
|
||||
export declare function geodeticToEcf({ longitude, latitude, height, }: GeodeticLocation): EcfVec3<Kilometer>;
|
||||
export declare function eciToGeodetic(eci: EciVec3<Kilometer>, gmst: GMSTime): GeodeticLocation;
|
||||
export declare function ecfToEci(ecf: EcfVec3<number>, gmst: GMSTime): EciVec3<number>;
|
||||
export declare function eciToEcf(eci: EciVec3<number>, gmst: GMSTime): EcfVec3<number>;
|
||||
export declare function ecfToLookAngles(observerGeodetic: GeodeticLocation, satelliteEcf: EcfVec3<Kilometer>): LookAngles;
|
||||
Reference in New Issue
Block a user