nrl-tracker 0.22.5__py3-none-any.whl → 1.8.0__py3-none-any.whl
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.
- {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/METADATA +57 -10
- {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/RECORD +86 -69
- pytcl/__init__.py +4 -3
- pytcl/assignment_algorithms/__init__.py +28 -0
- pytcl/assignment_algorithms/dijkstra_min_cost.py +184 -0
- pytcl/assignment_algorithms/gating.py +10 -10
- pytcl/assignment_algorithms/jpda.py +40 -40
- pytcl/assignment_algorithms/nd_assignment.py +379 -0
- pytcl/assignment_algorithms/network_flow.py +464 -0
- pytcl/assignment_algorithms/network_simplex.py +167 -0
- pytcl/assignment_algorithms/three_dimensional/assignment.py +3 -3
- pytcl/astronomical/__init__.py +104 -3
- pytcl/astronomical/ephemerides.py +14 -11
- pytcl/astronomical/reference_frames.py +865 -56
- pytcl/astronomical/relativity.py +6 -5
- pytcl/astronomical/sgp4.py +710 -0
- pytcl/astronomical/special_orbits.py +532 -0
- pytcl/astronomical/tle.py +558 -0
- pytcl/atmosphere/__init__.py +43 -1
- pytcl/atmosphere/ionosphere.py +512 -0
- pytcl/atmosphere/nrlmsise00.py +809 -0
- pytcl/clustering/dbscan.py +2 -2
- pytcl/clustering/gaussian_mixture.py +3 -3
- pytcl/clustering/hierarchical.py +15 -15
- pytcl/clustering/kmeans.py +4 -4
- pytcl/containers/__init__.py +24 -0
- pytcl/containers/base.py +219 -0
- pytcl/containers/cluster_set.py +12 -2
- pytcl/containers/covertree.py +26 -29
- pytcl/containers/kd_tree.py +94 -29
- pytcl/containers/rtree.py +200 -1
- pytcl/containers/vptree.py +21 -28
- pytcl/coordinate_systems/conversions/geodetic.py +272 -5
- pytcl/coordinate_systems/jacobians/jacobians.py +2 -2
- pytcl/coordinate_systems/projections/__init__.py +1 -1
- pytcl/coordinate_systems/projections/projections.py +2 -2
- pytcl/coordinate_systems/rotations/rotations.py +10 -6
- pytcl/core/__init__.py +18 -0
- pytcl/core/validation.py +333 -2
- pytcl/dynamic_estimation/__init__.py +26 -0
- pytcl/dynamic_estimation/gaussian_sum_filter.py +434 -0
- pytcl/dynamic_estimation/imm.py +14 -14
- pytcl/dynamic_estimation/kalman/__init__.py +30 -0
- pytcl/dynamic_estimation/kalman/constrained.py +382 -0
- pytcl/dynamic_estimation/kalman/extended.py +8 -8
- pytcl/dynamic_estimation/kalman/h_infinity.py +613 -0
- pytcl/dynamic_estimation/kalman/square_root.py +60 -573
- pytcl/dynamic_estimation/kalman/sr_ukf.py +302 -0
- pytcl/dynamic_estimation/kalman/ud_filter.py +410 -0
- pytcl/dynamic_estimation/kalman/unscented.py +8 -6
- pytcl/dynamic_estimation/particle_filters/bootstrap.py +15 -15
- pytcl/dynamic_estimation/rbpf.py +589 -0
- pytcl/gravity/egm.py +13 -0
- pytcl/gravity/spherical_harmonics.py +98 -37
- pytcl/gravity/tides.py +6 -6
- pytcl/logging_config.py +328 -0
- pytcl/magnetism/__init__.py +7 -0
- pytcl/magnetism/emm.py +10 -3
- pytcl/magnetism/wmm.py +260 -23
- pytcl/mathematical_functions/combinatorics/combinatorics.py +5 -5
- pytcl/mathematical_functions/geometry/geometry.py +5 -5
- pytcl/mathematical_functions/numerical_integration/quadrature.py +6 -6
- pytcl/mathematical_functions/signal_processing/detection.py +24 -24
- pytcl/mathematical_functions/signal_processing/filters.py +14 -14
- pytcl/mathematical_functions/signal_processing/matched_filter.py +12 -12
- pytcl/mathematical_functions/special_functions/bessel.py +15 -3
- pytcl/mathematical_functions/special_functions/debye.py +136 -26
- pytcl/mathematical_functions/special_functions/error_functions.py +3 -1
- pytcl/mathematical_functions/special_functions/gamma_functions.py +4 -4
- pytcl/mathematical_functions/special_functions/hypergeometric.py +81 -15
- pytcl/mathematical_functions/transforms/fourier.py +8 -8
- pytcl/mathematical_functions/transforms/stft.py +12 -12
- pytcl/mathematical_functions/transforms/wavelets.py +9 -9
- pytcl/navigation/geodesy.py +246 -160
- pytcl/navigation/great_circle.py +101 -19
- pytcl/plotting/coordinates.py +7 -7
- pytcl/plotting/tracks.py +2 -2
- pytcl/static_estimation/maximum_likelihood.py +16 -14
- pytcl/static_estimation/robust.py +5 -5
- pytcl/terrain/loaders.py +5 -5
- pytcl/trackers/hypothesis.py +1 -1
- pytcl/trackers/mht.py +9 -9
- pytcl/trackers/multi_target.py +1 -1
- {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/LICENSE +0 -0
- {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/WHEEL +0 -0
- {nrl_tracker-0.22.5.dist-info → nrl_tracker-1.8.0.dist-info}/top_level.txt +0 -0
pytcl/astronomical/__init__.py
CHANGED
|
@@ -77,30 +77,46 @@ from pytcl.astronomical.orbital_mechanics import (
|
|
|
77
77
|
vis_viva,
|
|
78
78
|
)
|
|
79
79
|
from pytcl.astronomical.reference_frames import (
|
|
80
|
-
earth_rotation_angle, # Time utilities; Precession; Nutation
|
|
80
|
+
earth_rotation_angle, # Time utilities; Precession; Nutation
|
|
81
81
|
)
|
|
82
|
+
from pytcl.astronomical.reference_frames import ecef_to_eci # Time utilities
|
|
82
83
|
from pytcl.astronomical.reference_frames import (
|
|
83
|
-
ecef_to_eci,
|
|
84
84
|
eci_to_ecef,
|
|
85
85
|
ecliptic_to_equatorial,
|
|
86
86
|
equation_of_equinoxes,
|
|
87
87
|
equatorial_to_ecliptic,
|
|
88
88
|
gast_iau82,
|
|
89
89
|
gcrf_to_itrf,
|
|
90
|
+
gcrf_to_mod,
|
|
91
|
+
gcrf_to_teme,
|
|
92
|
+
gcrf_to_tod,
|
|
90
93
|
gmst_iau82,
|
|
91
94
|
itrf_to_gcrf,
|
|
95
|
+
itrf_to_teme,
|
|
96
|
+
itrf_to_teme_with_velocity,
|
|
97
|
+
itrf_to_tod,
|
|
92
98
|
julian_centuries_j2000,
|
|
93
99
|
mean_obliquity_iau80,
|
|
100
|
+
mod_to_gcrf,
|
|
101
|
+
mod_to_tod,
|
|
94
102
|
nutation_angles_iau80,
|
|
95
103
|
nutation_matrix,
|
|
104
|
+
pef_to_teme,
|
|
96
105
|
polar_motion_matrix,
|
|
97
106
|
precession_angles_iau76,
|
|
98
107
|
precession_matrix_iau76,
|
|
99
108
|
sidereal_rotation_matrix,
|
|
109
|
+
teme_to_gcrf,
|
|
110
|
+
teme_to_itrf,
|
|
111
|
+
teme_to_itrf_with_velocity,
|
|
112
|
+
teme_to_pef,
|
|
113
|
+
tod_to_gcrf,
|
|
114
|
+
tod_to_itrf,
|
|
115
|
+
tod_to_mod,
|
|
100
116
|
true_obliquity,
|
|
101
117
|
)
|
|
102
118
|
from pytcl.astronomical.relativity import (
|
|
103
|
-
C_LIGHT, # Physical constants; Schwarzschild metric; Time dilation
|
|
119
|
+
C_LIGHT, # Physical constants; Schwarzschild metric; Time dilation
|
|
104
120
|
)
|
|
105
121
|
from pytcl.astronomical.relativity import (
|
|
106
122
|
G_GRAV,
|
|
@@ -114,6 +130,30 @@ from pytcl.astronomical.relativity import (
|
|
|
114
130
|
schwarzschild_radius,
|
|
115
131
|
shapiro_delay,
|
|
116
132
|
)
|
|
133
|
+
from pytcl.astronomical.sgp4 import (
|
|
134
|
+
SGP4Satellite,
|
|
135
|
+
SGP4State,
|
|
136
|
+
sgp4_propagate,
|
|
137
|
+
sgp4_propagate_batch,
|
|
138
|
+
)
|
|
139
|
+
from pytcl.astronomical.special_orbits import (
|
|
140
|
+
OrbitType,
|
|
141
|
+
classify_orbit,
|
|
142
|
+
eccentricity_vector,
|
|
143
|
+
escape_velocity_at_radius,
|
|
144
|
+
hyperbolic_anomaly_to_true_anomaly,
|
|
145
|
+
hyperbolic_asymptote_angle,
|
|
146
|
+
hyperbolic_deflection_angle,
|
|
147
|
+
hyperbolic_excess_velocity,
|
|
148
|
+
mean_to_parabolic_anomaly,
|
|
149
|
+
mean_to_true_anomaly_parabolic,
|
|
150
|
+
parabolic_anomaly_to_true_anomaly,
|
|
151
|
+
radius_parabolic,
|
|
152
|
+
semi_major_axis_from_energy,
|
|
153
|
+
true_anomaly_to_hyperbolic_anomaly,
|
|
154
|
+
true_anomaly_to_parabolic_anomaly,
|
|
155
|
+
velocity_parabolic,
|
|
156
|
+
)
|
|
117
157
|
from pytcl.astronomical.time_systems import (
|
|
118
158
|
JD_GPS_EPOCH, # Julian dates; Time scales; Unix time; GPS week; Sidereal time; Leap seconds; Constants
|
|
119
159
|
)
|
|
@@ -145,6 +185,17 @@ from pytcl.astronomical.time_systems import (
|
|
|
145
185
|
utc_to_tai,
|
|
146
186
|
utc_to_tt,
|
|
147
187
|
)
|
|
188
|
+
from pytcl.astronomical.tle import (
|
|
189
|
+
TLE,
|
|
190
|
+
format_tle,
|
|
191
|
+
is_deep_space,
|
|
192
|
+
orbital_period_from_tle,
|
|
193
|
+
parse_tle,
|
|
194
|
+
parse_tle_3line,
|
|
195
|
+
semi_major_axis_from_mean_motion,
|
|
196
|
+
tle_epoch_to_datetime,
|
|
197
|
+
tle_epoch_to_jd,
|
|
198
|
+
)
|
|
148
199
|
|
|
149
200
|
__all__ = [
|
|
150
201
|
# Time systems - Julian dates
|
|
@@ -251,6 +302,39 @@ __all__ = [
|
|
|
251
302
|
# Reference frames - Ecliptic/equatorial
|
|
252
303
|
"ecliptic_to_equatorial",
|
|
253
304
|
"equatorial_to_ecliptic",
|
|
305
|
+
# Reference frames - TEME (for SGP4/SDP4)
|
|
306
|
+
"teme_to_pef",
|
|
307
|
+
"pef_to_teme",
|
|
308
|
+
"teme_to_itrf",
|
|
309
|
+
"itrf_to_teme",
|
|
310
|
+
"teme_to_gcrf",
|
|
311
|
+
"gcrf_to_teme",
|
|
312
|
+
"teme_to_itrf_with_velocity",
|
|
313
|
+
"itrf_to_teme_with_velocity",
|
|
314
|
+
# Reference frames - TOD/MOD (legacy conventions)
|
|
315
|
+
"gcrf_to_mod",
|
|
316
|
+
"mod_to_gcrf",
|
|
317
|
+
"gcrf_to_tod",
|
|
318
|
+
"tod_to_gcrf",
|
|
319
|
+
"mod_to_tod",
|
|
320
|
+
"tod_to_mod",
|
|
321
|
+
"tod_to_itrf",
|
|
322
|
+
"itrf_to_tod",
|
|
323
|
+
# TLE parsing
|
|
324
|
+
"TLE",
|
|
325
|
+
"parse_tle",
|
|
326
|
+
"parse_tle_3line",
|
|
327
|
+
"tle_epoch_to_jd",
|
|
328
|
+
"tle_epoch_to_datetime",
|
|
329
|
+
"format_tle",
|
|
330
|
+
"is_deep_space",
|
|
331
|
+
"semi_major_axis_from_mean_motion",
|
|
332
|
+
"orbital_period_from_tle",
|
|
333
|
+
# SGP4/SDP4 propagation
|
|
334
|
+
"SGP4State",
|
|
335
|
+
"SGP4Satellite",
|
|
336
|
+
"sgp4_propagate",
|
|
337
|
+
"sgp4_propagate_batch",
|
|
254
338
|
# Ephemerides - Classes
|
|
255
339
|
"DEEphemeris",
|
|
256
340
|
# Ephemerides - Functions
|
|
@@ -271,4 +355,21 @@ __all__ = [
|
|
|
271
355
|
"geodetic_precession",
|
|
272
356
|
"lense_thirring_precession",
|
|
273
357
|
"relativistic_range_correction",
|
|
358
|
+
# Special orbits - Parabolic and hyperbolic
|
|
359
|
+
"OrbitType",
|
|
360
|
+
"classify_orbit",
|
|
361
|
+
"mean_to_parabolic_anomaly",
|
|
362
|
+
"parabolic_anomaly_to_true_anomaly",
|
|
363
|
+
"true_anomaly_to_parabolic_anomaly",
|
|
364
|
+
"mean_to_true_anomaly_parabolic",
|
|
365
|
+
"radius_parabolic",
|
|
366
|
+
"velocity_parabolic",
|
|
367
|
+
"hyperbolic_anomaly_to_true_anomaly",
|
|
368
|
+
"true_anomaly_to_hyperbolic_anomaly",
|
|
369
|
+
"escape_velocity_at_radius",
|
|
370
|
+
"hyperbolic_excess_velocity",
|
|
371
|
+
"semi_major_axis_from_energy",
|
|
372
|
+
"hyperbolic_asymptote_angle",
|
|
373
|
+
"hyperbolic_deflection_angle",
|
|
374
|
+
"eccentricity_vector",
|
|
274
375
|
]
|
|
@@ -49,9 +49,10 @@ References
|
|
|
49
49
|
|
|
50
50
|
"""
|
|
51
51
|
|
|
52
|
-
from typing import Literal, Optional, Tuple
|
|
52
|
+
from typing import Any, Literal, Optional, Tuple
|
|
53
53
|
|
|
54
54
|
import numpy as np
|
|
55
|
+
from numpy.typing import NDArray
|
|
55
56
|
|
|
56
57
|
# Constants for unit conversion
|
|
57
58
|
AU_PER_KM = 1.0 / 149597870.7 # 1 AU in km
|
|
@@ -152,10 +153,10 @@ class DEEphemeris:
|
|
|
152
153
|
self.version = version
|
|
153
154
|
self._jplephem = jplephem
|
|
154
155
|
self._kernel: Optional[object] = None
|
|
155
|
-
self._cache: dict = {}
|
|
156
|
+
self._cache: dict[str, Any] = {}
|
|
156
157
|
|
|
157
158
|
@property
|
|
158
|
-
def kernel(self):
|
|
159
|
+
def kernel(self) -> Optional[object]:
|
|
159
160
|
"""Lazy-load ephemeris kernel on first access.
|
|
160
161
|
|
|
161
162
|
Note: This requires jplephem to be installed and the kernel file
|
|
@@ -204,7 +205,7 @@ class DEEphemeris:
|
|
|
204
205
|
|
|
205
206
|
def sun_position(
|
|
206
207
|
self, jd: float, frame: Literal["icrf", "ecliptic"] = "icrf"
|
|
207
|
-
) -> Tuple[np.
|
|
208
|
+
) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
208
209
|
"""Compute Sun position and velocity.
|
|
209
210
|
|
|
210
211
|
Parameters
|
|
@@ -253,7 +254,7 @@ class DEEphemeris:
|
|
|
253
254
|
|
|
254
255
|
def moon_position(
|
|
255
256
|
self, jd: float, frame: Literal["icrf", "ecliptic", "earth_centered"] = "icrf"
|
|
256
|
-
) -> Tuple[np.
|
|
257
|
+
) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
257
258
|
"""Compute Moon position and velocity.
|
|
258
259
|
|
|
259
260
|
Parameters
|
|
@@ -323,7 +324,7 @@ class DEEphemeris:
|
|
|
323
324
|
],
|
|
324
325
|
jd: float,
|
|
325
326
|
frame: Literal["icrf", "ecliptic"] = "icrf",
|
|
326
|
-
) -> Tuple[np.ndarray, np.ndarray]:
|
|
327
|
+
) -> Tuple[np.ndarray[Any, Any], np.ndarray[Any, Any]]:
|
|
327
328
|
"""Compute planet position and velocity.
|
|
328
329
|
|
|
329
330
|
Parameters
|
|
@@ -379,7 +380,7 @@ class DEEphemeris:
|
|
|
379
380
|
|
|
380
381
|
def barycenter_position(
|
|
381
382
|
self, body: str, jd: float
|
|
382
|
-
) -> Tuple[np.
|
|
383
|
+
) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
383
384
|
"""Compute position of any body relative to Solar System Barycenter.
|
|
384
385
|
|
|
385
386
|
Parameters
|
|
@@ -424,7 +425,7 @@ def _get_default_ephemeris() -> DEEphemeris:
|
|
|
424
425
|
|
|
425
426
|
def sun_position(
|
|
426
427
|
jd: float, frame: Literal["icrf", "ecliptic"] = "icrf"
|
|
427
|
-
) -> Tuple[np.
|
|
428
|
+
) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
428
429
|
"""Convenience function: Compute Sun position and velocity.
|
|
429
430
|
|
|
430
431
|
Parameters
|
|
@@ -451,7 +452,7 @@ def sun_position(
|
|
|
451
452
|
|
|
452
453
|
def moon_position(
|
|
453
454
|
jd: float, frame: Literal["icrf", "ecliptic", "earth_centered"] = "icrf"
|
|
454
|
-
) -> Tuple[np.
|
|
455
|
+
) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
455
456
|
"""Convenience function: Compute Moon position and velocity.
|
|
456
457
|
|
|
457
458
|
Parameters
|
|
@@ -482,7 +483,7 @@ def planet_position(
|
|
|
482
483
|
],
|
|
483
484
|
jd: float,
|
|
484
485
|
frame: Literal["icrf", "ecliptic"] = "icrf",
|
|
485
|
-
) -> Tuple[np.ndarray, np.ndarray]:
|
|
486
|
+
) -> Tuple[np.ndarray[Any, Any], np.ndarray[Any, Any]]:
|
|
486
487
|
"""Convenience function: Compute planet position and velocity.
|
|
487
488
|
|
|
488
489
|
Parameters
|
|
@@ -509,7 +510,9 @@ def planet_position(
|
|
|
509
510
|
return _get_default_ephemeris().planet_position(planet, jd, frame=frame)
|
|
510
511
|
|
|
511
512
|
|
|
512
|
-
def barycenter_position(
|
|
513
|
+
def barycenter_position(
|
|
514
|
+
body: str, jd: float
|
|
515
|
+
) -> Tuple[NDArray[np.floating], NDArray[np.floating]]:
|
|
513
516
|
"""Convenience function: Position relative to Solar System Barycenter.
|
|
514
517
|
|
|
515
518
|
Parameters
|