satkit 0.16.0__tar.gz → 0.16.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {satkit-0.16.0 → satkit-0.16.2}/Cargo.toml +1 -5
- {satkit-0.16.0/python/satkit.egg-info → satkit-0.16.2}/PKG-INFO +6 -6
- {satkit-0.16.0 → satkit-0.16.2}/README.md +5 -5
- {satkit-0.16.0 → satkit-0.16.2}/pyproject.toml +1 -1
- {satkit-0.16.0 → satkit-0.16.2}/python/Cargo.toml +1 -2
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/__init__.pyi +1 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/frametransform.pyi +48 -12
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/satkit.pyi +29 -41
- {satkit-0.16.0 → satkit-0.16.2/python/satkit.egg-info}/PKG-INFO +6 -6
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/SOURCES.txt +1 -1
- {satkit-0.16.0 → satkit-0.16.2}/python/src/lib.rs +6 -2
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyframetransform.rs +117 -24
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pylambert.rs +4 -2
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pysgp4.rs +1 -1
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pytle.rs +12 -15
- satkit-0.16.2/python/src/pytlefitstatus.rs +50 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/earth_orientation_params.rs +4 -4
- {satkit-0.16.0 → satkit-0.16.2}/src/frametransform/mod.rs +95 -13
- {satkit-0.16.0 → satkit-0.16.2}/src/lib.rs +21 -8
- {satkit-0.16.0 → satkit-0.16.2}/src/solar_cycle_forecast.rs +5 -5
- {satkit-0.16.0 → satkit-0.16.2}/src/time/instantparse.rs +28 -18
- satkit-0.16.2/src/tle/fitting.rs +535 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/tle/mod.rs +2 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/utils/update_data.rs +27 -21
- satkit-0.16.0/python/src/pympsuccess.rs +0 -57
- satkit-0.16.0/src/tle/fitting.rs +0 -346
- {satkit-0.16.0 → satkit-0.16.2}/LICENSE +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/MANIFEST.in +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/build.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/__init__.py +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/density.pyi +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/jplephem.pyi +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/moon.pyi +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/planets.pyi +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/py.typed +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/sun.pyi +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit/utils.pyi +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/dependency_links.txt +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/requires.txt +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/satkit.egg-info/top_level.txt +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/mod_utils.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyconsts.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pydensity.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyduration.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyframes.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pygravity.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyinstant.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyitrfcoord.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyjplephem.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pykepler.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pylpephem_moon.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pylpephem_planets.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pylpephem_sun.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pynrlmsise.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyomm.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pypropagate.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pypropresult.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pypropsettings.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyquaternion.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pysatproperties.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pysatstate.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pysolarsystem.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pythrust.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyukf.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/python/src/pyutils.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/setup.cfg +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/consts.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/earthgravity.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/frames.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/frametransform/ierstable.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/frametransform/qcirs2gcrs.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/itrfcoord.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/jplephem.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/kepler.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/lambert.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/moon.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/planets.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/lpephem/sun.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/mathtypes.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/nrlmsise.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/omm/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/omm/xml.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/drag.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/ode/gauss_jackson.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/ode/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/point_gravity.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/precomputed.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/propagator.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/satproperties.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/satstate.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/settings.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/orbitprop/thrust.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dpper.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dscom.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dsinit.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/dspace.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/getgravconst.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/initl.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/satrec.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/sgp4_impl.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/sgp4_lowlevel.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/sgp4/sgp4init.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/solarsystem.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/spaceweather.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/chrono.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/duration.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/instant.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/instant_err.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/instant_ops.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/tests.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/timelike.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/timescale.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/time/weekday.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/utils/datadir.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/utils/download.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/utils/mod.rs +0 -0
- {satkit-0.16.0 → satkit-0.16.2}/src/utils/test.rs +0 -0
|
@@ -3,7 +3,7 @@ members = [".", "python"]
|
|
|
3
3
|
|
|
4
4
|
[package]
|
|
5
5
|
name = "satkit"
|
|
6
|
-
version = "0.16.
|
|
6
|
+
version = "0.16.2"
|
|
7
7
|
edition = "2021"
|
|
8
8
|
description = "Satellite Toolkit"
|
|
9
9
|
readme = "README.md"
|
|
@@ -26,15 +26,11 @@ numeris = { version = "0.5.7", features = ["serde", "estimate", "ode"] }
|
|
|
26
26
|
num-traits = "0.2.19"
|
|
27
27
|
thiserror = "2.0"
|
|
28
28
|
ureq = "3.1.2"
|
|
29
|
-
json = "0.12.4"
|
|
30
29
|
process_path = "0.1.4"
|
|
31
30
|
serde = { version = "1.0", features = ["derive"] }
|
|
32
31
|
serde_json = "1.0"
|
|
33
32
|
quick-xml = { version = "0.38", features = ["serialize"], optional = true }
|
|
34
|
-
serde-pickle = "1.2.0"
|
|
35
|
-
itertools = "0.14.0"
|
|
36
33
|
anyhow = "1"
|
|
37
|
-
rmpfit = "0.3.0"
|
|
38
34
|
chrono = { version = "0.4", optional = true }
|
|
39
35
|
|
|
40
36
|
[build-dependencies]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: satkit
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.2
|
|
4
4
|
Summary: Satellite Orbital Dynamics Toolkit
|
|
5
5
|
Author-email: Steven Michael <ssmichael@gmail.com>
|
|
6
6
|
Maintainer-email: Steven Michael <ssmichael@gmail.com>
|
|
@@ -43,7 +43,7 @@ Satkit is a high-performance orbital mechanics library written in Rust with comp
|
|
|
43
43
|
**[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**
|
|
44
44
|
|
|
45
45
|
> [!NOTE]
|
|
46
|
-
> **Version 0.
|
|
46
|
+
> **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.
|
|
47
47
|
|
|
48
48
|
## Installation
|
|
49
49
|
|
|
@@ -133,7 +133,7 @@ let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
|
|
|
133
133
|
|
|
134
134
|
### Coordinate Frames
|
|
135
135
|
|
|
136
|
-
Full IAU
|
|
136
|
+
Full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:
|
|
137
137
|
|
|
138
138
|
| Frame | Description |
|
|
139
139
|
|-------|-------------|
|
|
@@ -154,7 +154,7 @@ Plus ENU, NED, and geodesic distance (Vincenty) utilities.
|
|
|
154
154
|
|
|
155
155
|
### Orbit Maneuvers
|
|
156
156
|
|
|
157
|
-
- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (
|
|
157
|
+
- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
|
|
158
158
|
- **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model
|
|
159
159
|
- **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation
|
|
160
160
|
|
|
@@ -180,7 +180,7 @@ Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with ful
|
|
|
180
180
|
SatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:
|
|
181
181
|
|
|
182
182
|
```toml
|
|
183
|
-
numeris = { version = "0.5.
|
|
183
|
+
numeris = { version = "0.5.7", features = ["nalgebra"] }
|
|
184
184
|
```
|
|
185
185
|
|
|
186
186
|
### Cargo Features
|
|
@@ -207,7 +207,7 @@ The library is validated against:
|
|
|
207
207
|
- **ICGEM** reference values for gravity field calculations
|
|
208
208
|
- **GPS SP3** precise ephemerides for multi-day numerical propagation
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.
|
|
211
211
|
|
|
212
212
|
### Running Tests Locally
|
|
213
213
|
|
|
@@ -19,7 +19,7 @@ Satkit is a high-performance orbital mechanics library written in Rust with comp
|
|
|
19
19
|
**[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**
|
|
20
20
|
|
|
21
21
|
> [!NOTE]
|
|
22
|
-
> **Version 0.
|
|
22
|
+
> **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.
|
|
23
23
|
|
|
24
24
|
## Installation
|
|
25
25
|
|
|
@@ -109,7 +109,7 @@ let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
|
|
|
109
109
|
|
|
110
110
|
### Coordinate Frames
|
|
111
111
|
|
|
112
|
-
Full IAU
|
|
112
|
+
Full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:
|
|
113
113
|
|
|
114
114
|
| Frame | Description |
|
|
115
115
|
|-------|-------------|
|
|
@@ -130,7 +130,7 @@ Plus ENU, NED, and geodesic distance (Vincenty) utilities.
|
|
|
130
130
|
|
|
131
131
|
### Orbit Maneuvers
|
|
132
132
|
|
|
133
|
-
- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (
|
|
133
|
+
- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
|
|
134
134
|
- **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model
|
|
135
135
|
- **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation
|
|
136
136
|
|
|
@@ -156,7 +156,7 @@ Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with ful
|
|
|
156
156
|
SatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:
|
|
157
157
|
|
|
158
158
|
```toml
|
|
159
|
-
numeris = { version = "0.5.
|
|
159
|
+
numeris = { version = "0.5.7", features = ["nalgebra"] }
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
### Cargo Features
|
|
@@ -183,7 +183,7 @@ The library is validated against:
|
|
|
183
183
|
- **ICGEM** reference values for gravity field calculations
|
|
184
184
|
- **GPS SP3** precise ephemerides for multi-day numerical propagation
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.
|
|
187
187
|
|
|
188
188
|
### Running Tests Locally
|
|
189
189
|
|
|
@@ -9,7 +9,7 @@ requires-python = ">= 3.10"
|
|
|
9
9
|
authors = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
|
|
10
10
|
maintainers = [{ name = "Steven Michael", email = "ssmichael@gmail.com" }]
|
|
11
11
|
readme = "README.md"
|
|
12
|
-
version = "0.16.
|
|
12
|
+
version = "0.16.2"
|
|
13
13
|
license = "MIT"
|
|
14
14
|
description = "Satellite Orbital Dynamics Toolkit"
|
|
15
15
|
keywords = [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "satkit-python"
|
|
3
|
-
version = "0.16.
|
|
3
|
+
version = "0.16.2"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
publish = false
|
|
6
6
|
|
|
@@ -16,7 +16,6 @@ numeris = { version = "0.5.6", features = ["serde", "estimate"] }
|
|
|
16
16
|
anyhow = "1"
|
|
17
17
|
serde = { version = "1.0", features = ["derive"] }
|
|
18
18
|
serde-pickle = "1.2.0"
|
|
19
|
-
rmpfit = "0.3.0"
|
|
20
19
|
process_path = "0.1.4"
|
|
21
20
|
|
|
22
21
|
[build-dependencies]
|
|
@@ -491,7 +491,7 @@ def qgcrf2itrf(
|
|
|
491
491
|
"""Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
|
|
492
492
|
|
|
493
493
|
Notes:
|
|
494
|
-
- Uses full
|
|
494
|
+
- Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
|
|
495
495
|
- See IERS Technical Note 36, Chapter 5
|
|
496
496
|
- Does not include solid tides, ocean tides
|
|
497
497
|
- Very computationally expensive
|
|
@@ -529,7 +529,7 @@ def qgcrf2itrf(
|
|
|
529
529
|
"""Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
|
|
530
530
|
|
|
531
531
|
Notes:
|
|
532
|
-
- Uses full
|
|
532
|
+
- Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
|
|
533
533
|
- See IERS Technical Note 36, Chapter 5
|
|
534
534
|
- Does not include solid tides, ocean tides
|
|
535
535
|
- Very computationally expensive
|
|
@@ -552,7 +552,7 @@ def qgcrf2itrf(*args, **kwargs):
|
|
|
552
552
|
"""Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
|
|
553
553
|
|
|
554
554
|
Notes:
|
|
555
|
-
- Uses full
|
|
555
|
+
- Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
|
|
556
556
|
- See IERS Technical Note 36, Chapter 5
|
|
557
557
|
- Does not include solid tides, ocean tides
|
|
558
558
|
- Very computationally expensive
|
|
@@ -590,7 +590,7 @@ def qitrf2gcrf(
|
|
|
590
590
|
"""Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
|
|
591
591
|
|
|
592
592
|
Notes:
|
|
593
|
-
- Uses full
|
|
593
|
+
- Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
|
|
594
594
|
- See IERS Technical Note 36, Chapter 5
|
|
595
595
|
- Does not include solid tides, ocean tides
|
|
596
596
|
- Very computationally expensive
|
|
@@ -621,7 +621,7 @@ def qitrf2gcrf(
|
|
|
621
621
|
"""Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
|
|
622
622
|
|
|
623
623
|
Notes:
|
|
624
|
-
- Uses full
|
|
624
|
+
- Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
|
|
625
625
|
- See IERS Technical Note 36, Chapter 5
|
|
626
626
|
- Does not include solid tides, ocean tides
|
|
627
627
|
- Very computationally expensive
|
|
@@ -644,7 +644,7 @@ def qitrf2gcrf(*args, **kwargs):
|
|
|
644
644
|
"""Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
|
|
645
645
|
|
|
646
646
|
Notes:
|
|
647
|
-
- Uses full
|
|
647
|
+
- Uses full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation)
|
|
648
648
|
- See IERS Technical Note 36, Chapter 5
|
|
649
649
|
- Does not include solid tides, ocean tides
|
|
650
650
|
- Very computationally expensive
|
|
@@ -873,16 +873,21 @@ def to_gcrf(
|
|
|
873
873
|
def itrf_to_gcrf_state(
|
|
874
874
|
pos_itrf: npt.ArrayLike,
|
|
875
875
|
vel_itrf: npt.ArrayLike,
|
|
876
|
-
time: time,
|
|
876
|
+
time: time | list[time] | npt.NDArray,
|
|
877
877
|
) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
|
|
878
878
|
"""Transform a satellite state (position + velocity) from ITRF to GCRF.
|
|
879
879
|
|
|
880
|
+
Accepts either a single state (``pos``/``vel`` are length-3 vectors and
|
|
881
|
+
``time`` is a single ``satkit.time``) or a batch of ``N`` states
|
|
882
|
+
(``pos``/``vel`` are shape ``(N, 3)`` arrays and ``time`` is a length-``N``
|
|
883
|
+
array/list of times). The output shape matches the input.
|
|
884
|
+
|
|
880
885
|
Unlike the raw :func:`qitrf2gcrf` quaternion, this function correctly
|
|
881
886
|
handles the Earth-rotation contribution to velocity. A point at rest
|
|
882
887
|
on Earth's surface has zero velocity in ITRF but ~465 m/s in GCRF at
|
|
883
888
|
the equator, and this function accounts for that term.
|
|
884
889
|
|
|
885
|
-
The
|
|
890
|
+
The IERS 2010 ITRF → GCRF reduction decomposes into three stages:
|
|
886
891
|
polar motion (ITRF → TIRS), Earth rotation about the CIO polar axis
|
|
887
892
|
(TIRS → CIRS), and precession-nutation (CIRS → GCRF). The
|
|
888
893
|
Earth-rotation sweep term ``omega_earth x r`` is computed in
|
|
@@ -897,9 +902,9 @@ def itrf_to_gcrf_state(
|
|
|
897
902
|
1. Rotate ``pos_itrf`` and ``vel_itrf`` into TIRS via polar motion.
|
|
898
903
|
2. Add ``omega_earth x r_tirs`` to the velocity in TIRS, where
|
|
899
904
|
``omega_earth = (0, 0, OMEGA_EARTH)`` exactly.
|
|
900
|
-
3. Rotate TIRS → CIRS → GCRF via the full
|
|
905
|
+
3. Rotate TIRS → CIRS → GCRF via the full IERS 2010 chain.
|
|
901
906
|
|
|
902
|
-
Uses the full
|
|
907
|
+
Uses the full IERS 2010 reduction (polar motion + Earth rotation +
|
|
903
908
|
precession-nutation with dX/dY corrections from Earth orientation
|
|
904
909
|
parameters).
|
|
905
910
|
|
|
@@ -932,7 +937,7 @@ def itrf_to_gcrf_state(
|
|
|
932
937
|
def gcrf_to_itrf_state(
|
|
933
938
|
pos_gcrf: npt.ArrayLike,
|
|
934
939
|
vel_gcrf: npt.ArrayLike,
|
|
935
|
-
time: time,
|
|
940
|
+
time: time | list[time] | npt.NDArray,
|
|
936
941
|
) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
|
|
937
942
|
"""Transform a satellite state (position + velocity) from GCRF to ITRF.
|
|
938
943
|
|
|
@@ -941,7 +946,12 @@ def gcrf_to_itrf_state(
|
|
|
941
946
|
term **in TIRS** (where Earth's rotation axis is exactly along +z),
|
|
942
947
|
then applies inverse polar motion to reach ITRF. A geostationary
|
|
943
948
|
satellite (whose GCRF velocity is pure orbital motion) produces
|
|
944
|
-
zero velocity in ITRF. Uses the full
|
|
949
|
+
zero velocity in ITRF. Uses the full IERS 2010 reduction.
|
|
950
|
+
|
|
951
|
+
Accepts either a single state or a batch of ``N`` states: when
|
|
952
|
+
``pos``/``vel`` are shape ``(N, 3)`` arrays, ``time`` must be a
|
|
953
|
+
length-``N`` array/list of times, and the returned arrays have
|
|
954
|
+
shape ``(N, 3)``.
|
|
945
955
|
|
|
946
956
|
Args:
|
|
947
957
|
pos_gcrf: 3-element position vector in GCRF [m]
|
|
@@ -954,6 +964,32 @@ def gcrf_to_itrf_state(
|
|
|
954
964
|
"""
|
|
955
965
|
...
|
|
956
966
|
|
|
967
|
+
def itrf_to_gcrf_state_approx(
|
|
968
|
+
pos_itrf: npt.ArrayLike,
|
|
969
|
+
vel_itrf: npt.ArrayLike,
|
|
970
|
+
time: time | list[time] | npt.NDArray,
|
|
971
|
+
) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
|
|
972
|
+
"""Approximate ITRF → GCRF state transform using the IAU-76/FK5
|
|
973
|
+
reduction (accurate to ~1 arcsec on position).
|
|
974
|
+
|
|
975
|
+
Faster alternative to :func:`itrf_to_gcrf_state` when the full IERS
|
|
976
|
+
2010 precision is not required. Neglects polar motion, so the
|
|
977
|
+
Earth-rotation sweep ``omega_earth x r`` is evaluated in ITRF directly.
|
|
978
|
+
Accepts scalar or batched inputs like :func:`itrf_to_gcrf_state`.
|
|
979
|
+
"""
|
|
980
|
+
...
|
|
981
|
+
|
|
982
|
+
def gcrf_to_itrf_state_approx(
|
|
983
|
+
pos_gcrf: npt.ArrayLike,
|
|
984
|
+
vel_gcrf: npt.ArrayLike,
|
|
985
|
+
time: time | list[time] | npt.NDArray,
|
|
986
|
+
) -> tuple[npt.NDArray[np.float64], npt.NDArray[np.float64]]:
|
|
987
|
+
"""Approximate GCRF → ITRF state transform using the IAU-76/FK5
|
|
988
|
+
reduction. Inverse of :func:`itrf_to_gcrf_state_approx`; accurate to
|
|
989
|
+
~1 arcsec on position. Accepts scalar or batched inputs.
|
|
990
|
+
"""
|
|
991
|
+
...
|
|
992
|
+
|
|
957
993
|
def from_gcrf(
|
|
958
994
|
frame: frame,
|
|
959
995
|
pos: npt.ArrayLike,
|
|
@@ -295,14 +295,15 @@ class TLE:
|
|
|
295
295
|
Input GCRF states are rotated into TEME frame used by SGP4.
|
|
296
296
|
First and second derivatives of mean motion are ignored, as they are not used by SGP4.
|
|
297
297
|
|
|
298
|
-
Non-linear Levenberg-Marquardt optimization
|
|
299
|
-
|
|
300
|
-
mean
|
|
298
|
+
Non-linear Levenberg-Marquardt optimization is performed to fit
|
|
299
|
+
inclination, eccentricity, RAAN, argument of perigee, mean anomaly,
|
|
300
|
+
mean motion, and drag (bstar) to the provided states. The solver
|
|
301
|
+
is built on top of the ``numeris`` linear algebra crate.
|
|
301
302
|
|
|
302
303
|
The results dictionary includes the following keys:
|
|
303
|
-
``
|
|
304
|
-
``
|
|
305
|
-
``
|
|
304
|
+
``status`` (a :class:`tlefitstatus`), ``converged`` (bool),
|
|
305
|
+
``orig_norm``, ``best_norm``, ``grad_norm``, ``n_iter``,
|
|
306
|
+
``n_res_evals``.
|
|
306
307
|
|
|
307
308
|
Example:
|
|
308
309
|
```python
|
|
@@ -314,7 +315,7 @@ class TLE:
|
|
|
314
315
|
epoch = satkit.time(2024, 1, 1)
|
|
315
316
|
|
|
316
317
|
tle, results = satkit.TLE.fit_from_states(states, times, epoch)
|
|
317
|
-
if results["
|
|
318
|
+
if results["converged"]:
|
|
318
319
|
print("Fit successful")
|
|
319
320
|
```
|
|
320
321
|
"""
|
|
@@ -605,51 +606,38 @@ class weekday:
|
|
|
605
606
|
Saturday: ClassVar[weekday]
|
|
606
607
|
"""Saturday"""
|
|
607
608
|
|
|
608
|
-
class
|
|
609
|
+
class tlefitstatus:
|
|
609
610
|
"""
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
For details see: <https://docs.rs/rmpfit/latest/rmpfit/>
|
|
611
|
+
Termination status of the TLE non-linear least-squares fit performed by
|
|
612
|
+
:meth:`TLE.fit_from_states`.
|
|
613
613
|
|
|
614
614
|
Values:
|
|
615
615
|
|
|
616
|
-
-
|
|
617
|
-
-
|
|
618
|
-
-
|
|
619
|
-
-
|
|
620
|
-
-
|
|
621
|
-
- `MaxIter`: Maximum iterations reached
|
|
622
|
-
- `Ftol`: ftol is too small; no further improvement
|
|
623
|
-
- `Xtol`: xtol is too small; no further improvement
|
|
624
|
-
- `Gtol`: gtol is too small; no further improvement
|
|
616
|
+
- ``GradientConverged``: converged on gradient norm tolerance
|
|
617
|
+
- ``StepConverged``: converged on relative step size tolerance
|
|
618
|
+
- ``CostConverged``: converged on relative cost change tolerance
|
|
619
|
+
- ``MaxIterations``: maximum number of iterations reached
|
|
620
|
+
- ``DampingSaturated``: Levenberg-Marquardt damping parameter saturated
|
|
625
621
|
"""
|
|
626
622
|
|
|
627
|
-
|
|
628
|
-
"""
|
|
629
|
-
|
|
630
|
-
Chi: ClassVar[mpsuccess]
|
|
631
|
-
"""Convergence in chi-square value"""
|
|
632
|
-
|
|
633
|
-
Par: ClassVar[mpsuccess]
|
|
634
|
-
"""Convergence in parameter value"""
|
|
623
|
+
GradientConverged: ClassVar[tlefitstatus]
|
|
624
|
+
"""Converged on gradient norm tolerance"""
|
|
635
625
|
|
|
636
|
-
|
|
637
|
-
"""
|
|
626
|
+
StepConverged: ClassVar[tlefitstatus]
|
|
627
|
+
"""Converged on relative step size tolerance"""
|
|
638
628
|
|
|
639
|
-
|
|
640
|
-
"""
|
|
629
|
+
CostConverged: ClassVar[tlefitstatus]
|
|
630
|
+
"""Converged on relative cost change tolerance"""
|
|
641
631
|
|
|
642
|
-
|
|
643
|
-
"""Maximum iterations reached"""
|
|
632
|
+
MaxIterations: ClassVar[tlefitstatus]
|
|
633
|
+
"""Maximum number of iterations reached"""
|
|
644
634
|
|
|
645
|
-
|
|
646
|
-
"""
|
|
635
|
+
DampingSaturated: ClassVar[tlefitstatus]
|
|
636
|
+
"""Levenberg-Marquardt damping parameter saturated"""
|
|
647
637
|
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
Gtol: ClassVar[mpsuccess]
|
|
652
|
-
"""gtol is too small; no further improvement"""
|
|
638
|
+
def converged(self) -> bool:
|
|
639
|
+
"""True if the fit converged successfully."""
|
|
640
|
+
...
|
|
653
641
|
|
|
654
642
|
class timescale:
|
|
655
643
|
"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: satkit
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.2
|
|
4
4
|
Summary: Satellite Orbital Dynamics Toolkit
|
|
5
5
|
Author-email: Steven Michael <ssmichael@gmail.com>
|
|
6
6
|
Maintainer-email: Steven Michael <ssmichael@gmail.com>
|
|
@@ -43,7 +43,7 @@ Satkit is a high-performance orbital mechanics library written in Rust with comp
|
|
|
43
43
|
**[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**
|
|
44
44
|
|
|
45
45
|
> [!NOTE]
|
|
46
|
-
> **Version 0.
|
|
46
|
+
> **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.
|
|
47
47
|
|
|
48
48
|
## Installation
|
|
49
49
|
|
|
@@ -133,7 +133,7 @@ let (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, &time)?;
|
|
|
133
133
|
|
|
134
134
|
### Coordinate Frames
|
|
135
135
|
|
|
136
|
-
Full IAU
|
|
136
|
+
Full IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:
|
|
137
137
|
|
|
138
138
|
| Frame | Description |
|
|
139
139
|
|-------|-------------|
|
|
@@ -154,7 +154,7 @@ Plus ENU, NED, and geodesic distance (Vincenty) utilities.
|
|
|
154
154
|
|
|
155
155
|
### Orbit Maneuvers
|
|
156
156
|
|
|
157
|
-
- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (
|
|
157
|
+
- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.
|
|
158
158
|
- **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model
|
|
159
159
|
- **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation
|
|
160
160
|
|
|
@@ -180,7 +180,7 @@ Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with ful
|
|
|
180
180
|
SatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:
|
|
181
181
|
|
|
182
182
|
```toml
|
|
183
|
-
numeris = { version = "0.5.
|
|
183
|
+
numeris = { version = "0.5.7", features = ["nalgebra"] }
|
|
184
184
|
```
|
|
185
185
|
|
|
186
186
|
### Cargo Features
|
|
@@ -207,7 +207,7 @@ The library is validated against:
|
|
|
207
207
|
- **ICGEM** reference values for gravity field calculations
|
|
208
208
|
- **GPS SP3** precise ephemerides for multi-day numerical propagation
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.
|
|
211
211
|
|
|
212
212
|
### Running Tests Locally
|
|
213
213
|
|
|
@@ -37,7 +37,6 @@ python/src/pylambert.rs
|
|
|
37
37
|
python/src/pylpephem_moon.rs
|
|
38
38
|
python/src/pylpephem_planets.rs
|
|
39
39
|
python/src/pylpephem_sun.rs
|
|
40
|
-
python/src/pympsuccess.rs
|
|
41
40
|
python/src/pynrlmsise.rs
|
|
42
41
|
python/src/pyomm.rs
|
|
43
42
|
python/src/pypropagate.rs
|
|
@@ -50,6 +49,7 @@ python/src/pysgp4.rs
|
|
|
50
49
|
python/src/pysolarsystem.rs
|
|
51
50
|
python/src/pythrust.rs
|
|
52
51
|
python/src/pytle.rs
|
|
52
|
+
python/src/pytlefitstatus.rs
|
|
53
53
|
python/src/pyukf.rs
|
|
54
54
|
python/src/pyutils.rs
|
|
55
55
|
src/consts.rs
|
|
@@ -15,7 +15,7 @@ mod pykepler;
|
|
|
15
15
|
mod pylpephem_moon;
|
|
16
16
|
mod pylpephem_planets;
|
|
17
17
|
mod pylpephem_sun;
|
|
18
|
-
mod
|
|
18
|
+
mod pytlefitstatus;
|
|
19
19
|
mod pynrlmsise;
|
|
20
20
|
mod pypropresult;
|
|
21
21
|
mod pyquaternion;
|
|
@@ -134,6 +134,10 @@ fn frametransform(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
|
134
134
|
.unwrap();
|
|
135
135
|
m.add_function(wrap_pyfunction!(pyft::gcrf_to_itrf_state, m)?)
|
|
136
136
|
.unwrap();
|
|
137
|
+
m.add_function(wrap_pyfunction!(pyft::itrf_to_gcrf_state_approx, m)?)
|
|
138
|
+
.unwrap();
|
|
139
|
+
m.add_function(wrap_pyfunction!(pyft::gcrf_to_itrf_state_approx, m)?)
|
|
140
|
+
.unwrap();
|
|
137
141
|
m.add_function(wrap_pyfunction!(pyft::qmod2gcrf, m)?)
|
|
138
142
|
.unwrap();
|
|
139
143
|
m.add_function(wrap_pyfunction!(pyft::qtod2mod_approx, m)?)
|
|
@@ -168,7 +172,7 @@ pub fn satkit(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
|
168
172
|
m.add_class::<pyconsts::Consts>()?;
|
|
169
173
|
m.add_class::<SolarSystem>()?;
|
|
170
174
|
m.add_class::<pytle::PyTLE>()?;
|
|
171
|
-
m.add_class::<
|
|
175
|
+
m.add_class::<pytlefitstatus::PyTleFitStatus>()?;
|
|
172
176
|
|
|
173
177
|
m.add_class::<PyGeodet>()?;
|
|
174
178
|
m.add_class::<PyITRFCoord>()?;
|