keplemon 0.1.3__cp311-cp311-macosx_11_0_arm64.whl → 0.1.5__cp311-cp311-macosx_11_0_arm64.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.
Potentially problematic release.
This version of keplemon might be problematic. Click here for more details.
- keplemon/_keplemon.cpython-311-darwin.so +0 -0
- keplemon/bodies.pyi +111 -9
- keplemon/elements.pyi +236 -14
- keplemon/estimation.pyi +127 -2
- keplemon/events.pyi +17 -0
- keplemon/time.pyi +5 -4
- keplemon-0.1.5.dist-info/METADATA +100 -0
- {keplemon-0.1.3.dist-info → keplemon-0.1.5.dist-info}/RECORD +27 -27
- {keplemon-0.1.3.dist-info → keplemon-0.1.5.dist-info}/WHEEL +1 -1
- keplemon-0.1.3.dist-info/METADATA +0 -28
- {keplemon-0.1.3.dist-info → keplemon-0.1.5.dist-info}/entry_points.txt +0 -0
|
Binary file
|
keplemon/bodies.pyi
CHANGED
|
@@ -51,49 +51,143 @@ class Satellite:
|
|
|
51
51
|
step: TimeSpan,
|
|
52
52
|
) -> Ephemeris: ...
|
|
53
53
|
def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
|
|
54
|
+
def to_tle(self) -> TLE | None:
|
|
55
|
+
"""
|
|
56
|
+
Returns:
|
|
57
|
+
Satellite as a two-line element set or None if no state is loaded
|
|
58
|
+
|
|
59
|
+
"""
|
|
60
|
+
...
|
|
54
61
|
|
|
55
62
|
class Constellation:
|
|
63
|
+
"""
|
|
64
|
+
Args:
|
|
65
|
+
name: Identifier of the constellation
|
|
66
|
+
"""
|
|
67
|
+
|
|
56
68
|
count: int
|
|
69
|
+
"""Number of satellites in the constellation"""
|
|
70
|
+
|
|
57
71
|
name: str | None
|
|
72
|
+
"""Human-readable name of the constellation"""
|
|
73
|
+
|
|
58
74
|
def __init__(self, name: str) -> None: ...
|
|
59
75
|
@classmethod
|
|
60
|
-
def from_tle_catalog(cls, tle_catalog: TLECatalog) -> Constellation:
|
|
61
|
-
|
|
76
|
+
def from_tle_catalog(cls, tle_catalog: TLECatalog) -> Constellation:
|
|
77
|
+
"""
|
|
78
|
+
Instantiate a Constellation from a TLE catalog
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
tle_catalog: TLE catalog for the constellation
|
|
82
|
+
"""
|
|
83
|
+
...
|
|
84
|
+
|
|
85
|
+
def get_states_at_epoch(self, epoch: Epoch) -> dict[int, CartesianState]:
|
|
86
|
+
"""
|
|
87
|
+
Args:
|
|
88
|
+
epoch: UTC epoch at which the states will be calculated
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
(satellite_id, state) dictionary for the constellation at the given epoch
|
|
92
|
+
"""
|
|
93
|
+
...
|
|
94
|
+
|
|
62
95
|
def get_ephemeris(
|
|
63
96
|
self,
|
|
64
97
|
start: Epoch,
|
|
65
98
|
end: Epoch,
|
|
66
99
|
step: TimeSpan,
|
|
67
|
-
) -> dict[int, Ephemeris]:
|
|
100
|
+
) -> dict[int, Ephemeris]:
|
|
101
|
+
"""
|
|
102
|
+
Args:
|
|
103
|
+
start: UTC epoch of the start of the ephemeris
|
|
104
|
+
end: UTC epoch of the end of the ephemeris
|
|
105
|
+
step: Time step for the ephemeris
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
(satellite_id, ephemeris) dictionary for the constellation
|
|
109
|
+
"""
|
|
110
|
+
...
|
|
111
|
+
|
|
68
112
|
def get_ca_report_vs_one(
|
|
69
113
|
self,
|
|
70
114
|
other: Satellite,
|
|
71
115
|
start: Epoch,
|
|
72
116
|
end: Epoch,
|
|
73
117
|
distance_threshold: float,
|
|
74
|
-
) -> CloseApproachReport:
|
|
118
|
+
) -> CloseApproachReport:
|
|
119
|
+
"""
|
|
120
|
+
Calculate close approaches between the constellation and a given satellite.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
other: Satellite to compare against
|
|
124
|
+
start: UTC epoch of the start of the close approach report
|
|
125
|
+
end: UTC epoch of the end of the close approach report
|
|
126
|
+
distance_threshold: Distance threshold for close approach screening in **_kilometers_**
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
Close approach report for the constellation vs. the given satellite
|
|
130
|
+
"""
|
|
131
|
+
...
|
|
132
|
+
|
|
75
133
|
def get_ca_report_vs_many(
|
|
76
134
|
self,
|
|
77
135
|
start: Epoch,
|
|
78
136
|
end: Epoch,
|
|
79
137
|
distance_threshold: float,
|
|
80
|
-
) -> CloseApproachReport:
|
|
138
|
+
) -> CloseApproachReport:
|
|
139
|
+
"""
|
|
140
|
+
Calculate close approaches among satellites in the calling constellation.
|
|
141
|
+
|
|
142
|
+
!!! warning
|
|
143
|
+
This is a long-running operation when the constellation is large.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
start: UTC epoch of the start of the close approach report
|
|
147
|
+
end: UTC epoch of the end of the close approach report
|
|
148
|
+
distance_threshold: Distance threshold for close approach screening in **_kilometers_**
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Close approach report for the constellation vs. all other satellites
|
|
152
|
+
"""
|
|
153
|
+
...
|
|
154
|
+
|
|
81
155
|
def __getitem__(self, satellite_id: int) -> Satellite: ...
|
|
82
156
|
|
|
83
157
|
class Sensor:
|
|
158
|
+
"""
|
|
159
|
+
Args:
|
|
160
|
+
name: Identifier of the sensor
|
|
161
|
+
angular_noise: Angular noise in **_degrees_**
|
|
162
|
+
"""
|
|
163
|
+
|
|
84
164
|
name: str
|
|
85
165
|
angular_noise: float
|
|
86
|
-
range_noise: float
|
|
87
|
-
|
|
88
|
-
|
|
166
|
+
range_noise: float | None
|
|
167
|
+
"""Range noise in **_kilometers_**"""
|
|
168
|
+
|
|
169
|
+
range_rate_noise: float | None
|
|
170
|
+
"""Range rate noise in **_kilometers per second_**"""
|
|
171
|
+
|
|
172
|
+
angular_rate_noise: float | None
|
|
173
|
+
"""Angular rate noise in **_degrees per second_**"""
|
|
89
174
|
def __init__(self, name: str, angular_noise: float) -> None: ...
|
|
90
175
|
|
|
91
176
|
class Observatory:
|
|
177
|
+
"""
|
|
178
|
+
Args:
|
|
179
|
+
name: Identifier of the observatory
|
|
180
|
+
latitude: Latitude in **_degrees_**
|
|
181
|
+
longitude: Longitude in **_degrees_**
|
|
182
|
+
altitude: Altitude in **_kilometers_**
|
|
183
|
+
"""
|
|
184
|
+
|
|
92
185
|
name: str
|
|
93
186
|
latitude: float
|
|
94
187
|
longitude: float
|
|
95
188
|
altitude: float
|
|
96
189
|
sensors: list[Sensor]
|
|
190
|
+
"""List of sensors at the observatory"""
|
|
97
191
|
def __init__(
|
|
98
192
|
self,
|
|
99
193
|
name: str,
|
|
@@ -101,4 +195,12 @@ class Observatory:
|
|
|
101
195
|
longitude: float,
|
|
102
196
|
altitude: float,
|
|
103
197
|
) -> None: ...
|
|
104
|
-
def get_state_at_epoch(self, epoch: Epoch) -> CartesianState:
|
|
198
|
+
def get_state_at_epoch(self, epoch: Epoch) -> CartesianState:
|
|
199
|
+
"""
|
|
200
|
+
Args:
|
|
201
|
+
epoch: UTC epoch of the state
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
TEME Cartesian state of the observatory in **_kilometers_** and **_kilometers per second_**
|
|
205
|
+
"""
|
|
206
|
+
...
|
keplemon/elements.pyi
CHANGED
|
@@ -6,6 +6,16 @@ from keplemon.propagation import ForceProperties
|
|
|
6
6
|
from keplemon.events import CloseApproach
|
|
7
7
|
|
|
8
8
|
class KeplerianElements:
|
|
9
|
+
"""
|
|
10
|
+
Args:
|
|
11
|
+
semi_major_axis: Average distance from the central body in **_kilometers_**
|
|
12
|
+
eccentricity: Eccentricity of the orbit
|
|
13
|
+
inclination: Inclination of the orbit in **_degrees_**
|
|
14
|
+
raan: Right Ascension of Ascending Node in **_degrees_**
|
|
15
|
+
argument_of_perigee: Argument of Perigee in **_degrees_**
|
|
16
|
+
mean_anomaly: Mean Anomaly in **_degrees_**
|
|
17
|
+
"""
|
|
18
|
+
|
|
9
19
|
semi_major_axis: float
|
|
10
20
|
eccentricity: float
|
|
11
21
|
inclination: float
|
|
@@ -25,46 +35,222 @@ class KeplerianElements:
|
|
|
25
35
|
|
|
26
36
|
class TLE:
|
|
27
37
|
satellite_id: int
|
|
28
|
-
|
|
38
|
+
""""""
|
|
39
|
+
|
|
40
|
+
name: str
|
|
41
|
+
""""""
|
|
42
|
+
|
|
43
|
+
inclination: float
|
|
44
|
+
"""Inclination of the orbit in **_degrees_**"""
|
|
45
|
+
|
|
46
|
+
eccentricity: float
|
|
47
|
+
""""""
|
|
48
|
+
|
|
49
|
+
raan: float
|
|
50
|
+
"""Right Ascension of Ascending Node in **_degrees_**"""
|
|
51
|
+
|
|
52
|
+
argument_of_perigee: float
|
|
53
|
+
"""Argument of Perigee in **_degrees_**"""
|
|
54
|
+
|
|
55
|
+
mean_anomaly: float
|
|
56
|
+
"""Mean Anomaly in **_degrees_**"""
|
|
57
|
+
|
|
58
|
+
mean_motion: float
|
|
59
|
+
"""Mean motion in **_revolutions per day_**"""
|
|
60
|
+
|
|
61
|
+
type: KeplerianType
|
|
62
|
+
""""""
|
|
63
|
+
|
|
64
|
+
b_star: float
|
|
65
|
+
""""""
|
|
66
|
+
|
|
67
|
+
mean_motion_dot: float
|
|
68
|
+
""""""
|
|
69
|
+
|
|
70
|
+
mean_motion_dot_dot: float
|
|
71
|
+
""""""
|
|
72
|
+
|
|
73
|
+
agom: float
|
|
74
|
+
""""""
|
|
75
|
+
|
|
76
|
+
b_term: float
|
|
77
|
+
""""""
|
|
78
|
+
|
|
79
|
+
epoch: Epoch
|
|
80
|
+
"""UTC epoch of the state"""
|
|
81
|
+
|
|
29
82
|
classification: Classification
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
83
|
+
""""""
|
|
84
|
+
|
|
85
|
+
designator: str
|
|
86
|
+
"""8-character identifier of the satellite"""
|
|
87
|
+
|
|
88
|
+
cartesian_state: CartesianState
|
|
89
|
+
"""TEME cartesian state of the TLE at epoch"""
|
|
33
90
|
|
|
34
91
|
@classmethod
|
|
35
|
-
def from_lines(cls, line_1: str, line_2: str, line_3: str | None = None) -> TLE:
|
|
36
|
-
|
|
37
|
-
|
|
92
|
+
def from_lines(cls, line_1: str, line_2: str, line_3: str | None = None) -> TLE:
|
|
93
|
+
"""
|
|
94
|
+
Create a TLE object using strings in 2 or 3 line format
|
|
95
|
+
"""
|
|
96
|
+
...
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def lines(self) -> tuple[str, str]:
|
|
100
|
+
"""
|
|
101
|
+
!!! note
|
|
102
|
+
If the TLE was created in the 3LE format, only lines 2 and 3 will be returned. The name must be accessed
|
|
103
|
+
using the `name` property.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Tuple of strings in 2 line format
|
|
107
|
+
"""
|
|
108
|
+
...
|
|
109
|
+
|
|
38
110
|
def get_state_at_epoch(self, epoch: Epoch) -> CartesianState: ...
|
|
39
111
|
|
|
40
112
|
class SphericalVector:
|
|
113
|
+
"""
|
|
114
|
+
!!! note
|
|
115
|
+
The range units can be disregarded if this class is not being used for astrodynamic transforms.
|
|
116
|
+
|
|
117
|
+
Args:
|
|
118
|
+
range: distance from the origin in **_kilometers_**
|
|
119
|
+
right_ascension: right ascension in **_degrees_**
|
|
120
|
+
declination: declination in **_degrees_**
|
|
121
|
+
"""
|
|
122
|
+
|
|
41
123
|
range: float
|
|
42
124
|
right_ascension: float
|
|
43
125
|
declination: float
|
|
44
126
|
def __init__(self, range: float, right_ascension: float, declination: float) -> None: ...
|
|
45
|
-
def to_cartesian(self) -> CartesianVector:
|
|
127
|
+
def to_cartesian(self) -> CartesianVector:
|
|
128
|
+
"""
|
|
129
|
+
Returns:
|
|
130
|
+
Cartesian vector in **_kilometers_**.
|
|
131
|
+
"""
|
|
132
|
+
...
|
|
46
133
|
|
|
47
134
|
class CartesianVector:
|
|
135
|
+
"""
|
|
136
|
+
Args:
|
|
137
|
+
x: x coordinate
|
|
138
|
+
y: y coordinate
|
|
139
|
+
z: z coordinate
|
|
140
|
+
"""
|
|
141
|
+
|
|
48
142
|
x: float
|
|
49
143
|
y: float
|
|
50
144
|
z: float
|
|
51
145
|
magnitude: float
|
|
146
|
+
""""""
|
|
147
|
+
|
|
52
148
|
def __init__(self, x: float, y: float, z: float) -> None: ...
|
|
53
|
-
def distance(self, other: CartesianVector) -> float:
|
|
54
|
-
|
|
149
|
+
def distance(self, other: CartesianVector) -> float:
|
|
150
|
+
"""
|
|
151
|
+
!!! note
|
|
152
|
+
Take care to use consistent units with this function.
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Distance between two Cartesian vectors
|
|
156
|
+
"""
|
|
157
|
+
...
|
|
158
|
+
|
|
159
|
+
def to_spherical(self) -> SphericalVector:
|
|
160
|
+
"""
|
|
161
|
+
Returns:
|
|
162
|
+
Spherical representation of the point
|
|
163
|
+
"""
|
|
164
|
+
...
|
|
165
|
+
|
|
55
166
|
def __add__(self, other: CartesianVector) -> CartesianVector: ...
|
|
56
167
|
def __sub__(self, other: CartesianVector) -> CartesianVector: ...
|
|
57
|
-
def angle(self, other: CartesianVector) -> float:
|
|
168
|
+
def angle(self, other: CartesianVector) -> float:
|
|
169
|
+
"""
|
|
170
|
+
Returns:
|
|
171
|
+
Angle between two Cartesian vectors in **_radians_**.
|
|
172
|
+
"""
|
|
173
|
+
...
|
|
58
174
|
|
|
59
175
|
class CartesianState:
|
|
176
|
+
"""State represented as x, y, z and vx, vy, vz in a given reference frame.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
epoch: UTC epoch of the state
|
|
180
|
+
position: Cartesian position vector in kilometers
|
|
181
|
+
velocity: Cartesian velocity vector in kilometers per second
|
|
182
|
+
frame: reference frame of the state
|
|
183
|
+
"""
|
|
184
|
+
|
|
60
185
|
position: CartesianVector
|
|
186
|
+
"""Position of the state in kilometers"""
|
|
187
|
+
|
|
61
188
|
velocity: CartesianVector
|
|
189
|
+
"""Velocity of the state in kilometers per second"""
|
|
190
|
+
|
|
191
|
+
epoch: Epoch
|
|
192
|
+
"""UTC epoch of the state"""
|
|
193
|
+
|
|
194
|
+
frame: ReferenceFrame
|
|
195
|
+
"""Current reference frame of the state"""
|
|
196
|
+
|
|
197
|
+
def __init__(
|
|
198
|
+
self, epoch: Epoch, position: CartesianVector, velocity: CartesianVector, frame: ReferenceFrame
|
|
199
|
+
) -> None: ...
|
|
200
|
+
def to_keplerian(self) -> KeplerianState:
|
|
201
|
+
"""Convert the Cartesian state to osculating Keplerian elements"""
|
|
202
|
+
...
|
|
203
|
+
|
|
204
|
+
def to_frame(self, frame: ReferenceFrame) -> CartesianState:
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
Args:
|
|
208
|
+
frame: reference frame of the output state
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
CartesianState: Cartesian state in the new frame"""
|
|
212
|
+
...
|
|
62
213
|
|
|
63
214
|
class KeplerianState:
|
|
215
|
+
"""Orbit represented as Keplerian elements in a given reference frame.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
epoch: UTC epoch of the state
|
|
219
|
+
elements: Keplerian elements of the state
|
|
220
|
+
frame: reference frame of the state
|
|
221
|
+
keplerian_type: type of the Keplerian elements
|
|
222
|
+
"""
|
|
223
|
+
|
|
64
224
|
epoch: Epoch
|
|
65
|
-
elements: KeplerianElements
|
|
66
225
|
frame: ReferenceFrame
|
|
67
|
-
|
|
226
|
+
type: KeplerianType
|
|
227
|
+
semi_major_axis: float
|
|
228
|
+
"""Average distance from the central body in **_kilometers_**"""
|
|
229
|
+
|
|
230
|
+
eccentricity: float
|
|
231
|
+
"""Eccentricity of the orbit"""
|
|
232
|
+
|
|
233
|
+
inclination: float
|
|
234
|
+
"""Inclination of the orbit in **_degrees_**"""
|
|
235
|
+
|
|
236
|
+
raan: float
|
|
237
|
+
"""Right Ascension of Ascending Node in **_degrees_**"""
|
|
238
|
+
|
|
239
|
+
argument_of_perigee: float
|
|
240
|
+
"""Argument of Perigee in **_degrees_**"""
|
|
241
|
+
|
|
242
|
+
mean_anomaly: float
|
|
243
|
+
"""Mean Anomaly in **_degrees_**"""
|
|
244
|
+
|
|
245
|
+
mean_motion: float
|
|
246
|
+
"""Mean motion in **_revolutions per day_**"""
|
|
247
|
+
|
|
248
|
+
apoapsis: float
|
|
249
|
+
"""Furthest point from the central body in **_kilometers_**"""
|
|
250
|
+
|
|
251
|
+
periapsis: float
|
|
252
|
+
"""Closest point to the central body in **_kilometers_**"""
|
|
253
|
+
|
|
68
254
|
def __init__(
|
|
69
255
|
self,
|
|
70
256
|
epoch: Epoch,
|
|
@@ -72,6 +258,21 @@ class KeplerianState:
|
|
|
72
258
|
frame: ReferenceFrame,
|
|
73
259
|
keplerian_type: KeplerianType,
|
|
74
260
|
) -> None: ...
|
|
261
|
+
def to_cartesian(self) -> CartesianState:
|
|
262
|
+
"""
|
|
263
|
+
Returns:
|
|
264
|
+
Cartesian state in **_kilometers_** and **_kilometers per second_**.
|
|
265
|
+
"""
|
|
266
|
+
...
|
|
267
|
+
|
|
268
|
+
def to_frame(self, frame: ReferenceFrame) -> KeplerianState:
|
|
269
|
+
"""
|
|
270
|
+
Args:
|
|
271
|
+
frame: reference frame of the output state
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
Keplerian state in the new frame"""
|
|
275
|
+
...
|
|
75
276
|
|
|
76
277
|
class Ephemeris:
|
|
77
278
|
def get_close_approach(
|
|
@@ -81,12 +282,33 @@ class Ephemeris:
|
|
|
81
282
|
) -> CloseApproach: ...
|
|
82
283
|
|
|
83
284
|
class TopocentricElements:
|
|
285
|
+
"""
|
|
286
|
+
Args:
|
|
287
|
+
ra: TEME right ascension in **_degrees_**
|
|
288
|
+
dec: TEME declination in **_degrees_**
|
|
289
|
+
"""
|
|
290
|
+
|
|
84
291
|
range: float | None
|
|
292
|
+
"""Range in **_kilometers_**"""
|
|
293
|
+
|
|
85
294
|
right_ascension: float
|
|
86
295
|
declination: float
|
|
87
296
|
range_rate: float | None
|
|
297
|
+
"""Range rate in **_kilometers per second_**"""
|
|
298
|
+
|
|
88
299
|
right_ascension_rate: float | None
|
|
300
|
+
"""Right ascension rate in **_degrees per second**"""
|
|
301
|
+
|
|
89
302
|
declination_rate: float | None
|
|
303
|
+
"""Declination rate in **_degrees per second**"""
|
|
304
|
+
|
|
90
305
|
def __init__(self, ra: float, dec: float) -> None: ...
|
|
91
306
|
@classmethod
|
|
92
|
-
def from_j2000(cls, epoch: Epoch, ra: float, dec: float) -> TopocentricElements:
|
|
307
|
+
def from_j2000(cls, epoch: Epoch, ra: float, dec: float) -> TopocentricElements:
|
|
308
|
+
"""
|
|
309
|
+
Args:
|
|
310
|
+
epoch: UTC epoch of the angles
|
|
311
|
+
ra: J2000 right ascension in **_degrees_**
|
|
312
|
+
dec: J2000 declination in **_degrees_**
|
|
313
|
+
"""
|
|
314
|
+
...
|
keplemon/estimation.pyi
CHANGED
|
@@ -6,8 +6,44 @@ from keplemon.enums import KeplerianType
|
|
|
6
6
|
|
|
7
7
|
class Covariance:
|
|
8
8
|
sigmas: list[float]
|
|
9
|
+
""""""
|
|
9
10
|
|
|
10
11
|
class Observation:
|
|
12
|
+
"""
|
|
13
|
+
Args:
|
|
14
|
+
sensor: Sensor that made the observation
|
|
15
|
+
epoch: Time of the observation
|
|
16
|
+
observed_teme_topo: Topocentric elements of the satellite at the time of observation
|
|
17
|
+
observer_teme_pos: Position of the observer in TEME coordinates
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
sensor: Sensor
|
|
21
|
+
"""Sensor which produced the observation"""
|
|
22
|
+
|
|
23
|
+
epoch: Epoch
|
|
24
|
+
"""Time the measurement was observed"""
|
|
25
|
+
|
|
26
|
+
range: float | None
|
|
27
|
+
"""Observed range from the sensor to the satellite in **_kilometers_**"""
|
|
28
|
+
|
|
29
|
+
range_rate: float | None
|
|
30
|
+
"""Observed range rate from the sensor to the satellite in **_kilometers per second_**"""
|
|
31
|
+
|
|
32
|
+
right_ascension: float
|
|
33
|
+
"""Observed TEME right ascension in **_degrees_**"""
|
|
34
|
+
|
|
35
|
+
declination: float
|
|
36
|
+
"""Observed TEME declination in **_degrees_**"""
|
|
37
|
+
|
|
38
|
+
right_ascension_rate: float | None
|
|
39
|
+
"""Observed right ascension rate in **_degrees per second_**"""
|
|
40
|
+
|
|
41
|
+
declination_rate: float | None
|
|
42
|
+
"""Observed declination rate in **_degrees per second_**"""
|
|
43
|
+
|
|
44
|
+
observed_satellite_id: int | None
|
|
45
|
+
"""Tagged satellite ID of the observation"""
|
|
46
|
+
|
|
11
47
|
def __init__(
|
|
12
48
|
self,
|
|
13
49
|
sensor: Sensor,
|
|
@@ -15,33 +51,122 @@ class Observation:
|
|
|
15
51
|
observed_teme_topo: TopocentricElements,
|
|
16
52
|
observer_teme_pos: CartesianVector,
|
|
17
53
|
) -> None: ...
|
|
18
|
-
def get_residual(self, sat: Satellite) -> ObservationResidual:
|
|
54
|
+
def get_residual(self, sat: Satellite) -> ObservationResidual | None:
|
|
55
|
+
"""
|
|
56
|
+
Calculate the residual of the observation with respect to a given satellite state.
|
|
57
|
+
|
|
58
|
+
!!! note
|
|
59
|
+
If an error occurs during propagation of the satellite state, this method will return None.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
sat: Expected satellite state
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Calculated residual
|
|
66
|
+
"""
|
|
67
|
+
...
|
|
19
68
|
|
|
20
69
|
class ObservationResidual:
|
|
21
70
|
range: float
|
|
71
|
+
"""Euclidean distance between the observed and expected state in **_kilometers_**"""
|
|
72
|
+
|
|
22
73
|
radial: float
|
|
74
|
+
"""Radial distance between the observed and expected state in **_kilometers_**"""
|
|
75
|
+
|
|
23
76
|
in_track: float
|
|
77
|
+
"""In-track distance between the observed and expected state in **_kilometers_**"""
|
|
78
|
+
|
|
24
79
|
cross_track: float
|
|
80
|
+
"""Cross-track distance between the observed and expected state in **_kilometers_**"""
|
|
81
|
+
|
|
82
|
+
velocity: float
|
|
83
|
+
"""Velocity magnitude difference between the observed and expected state in **_kilometers per second_**"""
|
|
84
|
+
|
|
85
|
+
radial_velocity: float
|
|
86
|
+
"""Radial velocity difference between the observed and expected state in **_kilometers per second_**"""
|
|
87
|
+
|
|
88
|
+
in_track_velocity: float
|
|
89
|
+
"""In-track velocity difference between the observed and expected state in **_kilometers per second_**"""
|
|
90
|
+
|
|
91
|
+
cross_track_velocity: float
|
|
92
|
+
"""Cross-track velocity difference between the observed and expected state in **_kilometers per second_**"""
|
|
93
|
+
|
|
25
94
|
time: float
|
|
95
|
+
"""Time difference between the observed and expected state in **_seconds_**"""
|
|
96
|
+
|
|
26
97
|
beta: float
|
|
98
|
+
"""Out-of-plane difference between the observed and expected state in **_degrees_**"""
|
|
99
|
+
|
|
100
|
+
height: float
|
|
101
|
+
"""Height difference between the observed and expected state in **_kilometers_**"""
|
|
27
102
|
|
|
28
103
|
class BatchLeastSquares:
|
|
104
|
+
"""
|
|
105
|
+
Args:
|
|
106
|
+
obs: List of observations to be used in the estimation
|
|
107
|
+
a_priori: A priori satellite state
|
|
108
|
+
"""
|
|
109
|
+
|
|
29
110
|
converged: bool
|
|
111
|
+
"""Indicates if the solution meets the tolerance criteria"""
|
|
112
|
+
|
|
30
113
|
max_iterations: int
|
|
114
|
+
"""Maximum number of iterations to perform when solving if the tolerance is not met"""
|
|
115
|
+
|
|
31
116
|
iteration_count: int
|
|
117
|
+
"""Number of iterations performed to reach the solution"""
|
|
118
|
+
|
|
32
119
|
current_estimate: Satellite
|
|
120
|
+
"""Current estimate of the satellite state after iterating or solving"""
|
|
121
|
+
|
|
33
122
|
rms: float | None
|
|
123
|
+
"""Root mean square of the residuals in **_kilometers_**"""
|
|
124
|
+
|
|
34
125
|
weighted_rms: float | None
|
|
126
|
+
"""Unitless weighted root mean square of the residuals"""
|
|
127
|
+
|
|
35
128
|
estimate_srp: bool
|
|
129
|
+
"""Flag to indicate if solar radiation pressure should be estimated
|
|
130
|
+
|
|
131
|
+
!!! warning
|
|
132
|
+
This currently has unexpected behavior if solving for output_types other than XP
|
|
133
|
+
"""
|
|
134
|
+
|
|
36
135
|
estimate_drag: bool
|
|
136
|
+
"""Flag to indicate if atmospheric drag should be estimated
|
|
137
|
+
|
|
138
|
+
!!! warning
|
|
139
|
+
This currently has unexpected behavior if solving for output_types other than XP
|
|
140
|
+
"""
|
|
141
|
+
|
|
37
142
|
a_priori: Satellite
|
|
143
|
+
"""A priori satellite state used to initialize the estimation"""
|
|
144
|
+
|
|
38
145
|
observations: list[Observation]
|
|
146
|
+
"""List of observations used in the estimation"""
|
|
147
|
+
|
|
39
148
|
residuals: list[tuple[Epoch, ObservationResidual]]
|
|
149
|
+
"""List of residuals for each observation compared to the current estimate"""
|
|
150
|
+
|
|
40
151
|
covariance: Covariance | None
|
|
152
|
+
"""UVW covariance matrix of the current estimate in **_kilometers_** and **_kilometers per second_**"""
|
|
153
|
+
|
|
41
154
|
output_type: KeplerianType
|
|
155
|
+
"""Type of Keplerian elements to be used in the output state"""
|
|
156
|
+
|
|
42
157
|
def __init__(
|
|
43
158
|
self,
|
|
44
159
|
obs: list[Observation],
|
|
45
160
|
a_priori: Satellite,
|
|
46
161
|
) -> None: ...
|
|
47
|
-
def solve(self) -> None:
|
|
162
|
+
def solve(self) -> None:
|
|
163
|
+
"""Iterate until the solution converges or the maximum number of iterations is reached."""
|
|
164
|
+
...
|
|
165
|
+
|
|
166
|
+
def iterate(self) -> None:
|
|
167
|
+
"""Perform a single iteration of the estimation process."""
|
|
168
|
+
...
|
|
169
|
+
|
|
170
|
+
def reset(self) -> None:
|
|
171
|
+
"""Reset the estimation process to the initial state."""
|
|
172
|
+
...
|
keplemon/events.pyi
CHANGED
|
@@ -3,10 +3,27 @@ from keplemon.time import Epoch
|
|
|
3
3
|
|
|
4
4
|
class CloseApproach:
|
|
5
5
|
epoch: Epoch
|
|
6
|
+
"""UTC epoch of the close approach"""
|
|
7
|
+
|
|
6
8
|
primary_id: int
|
|
9
|
+
"""Satellite ID of the primary body in the close approach"""
|
|
10
|
+
|
|
7
11
|
secondary_id: int
|
|
12
|
+
"""Satellite ID of the secondary body in the close approach"""
|
|
13
|
+
|
|
8
14
|
distance: float
|
|
15
|
+
"""Distance between the two bodies in **_kilometers_**"""
|
|
9
16
|
|
|
10
17
|
class CloseApproachReport:
|
|
18
|
+
"""
|
|
19
|
+
Args:
|
|
20
|
+
start: CA screening start time
|
|
21
|
+
end: CA screening end time
|
|
22
|
+
distance_threshold: Distance threshold for CA screening in **_kilometers_**
|
|
23
|
+
"""
|
|
24
|
+
|
|
11
25
|
close_approaches: list[CloseApproach]
|
|
26
|
+
"""List of close approaches found during the screening"""
|
|
27
|
+
|
|
12
28
|
distance_threshold: float
|
|
29
|
+
def __init__(self, start: Epoch, end: Epoch, distance_threshold: float) -> None: ...
|
keplemon/time.pyi
CHANGED
|
@@ -121,7 +121,7 @@ class TimeComponents:
|
|
|
121
121
|
def to_iso(self) -> str:
|
|
122
122
|
"""
|
|
123
123
|
Returns:
|
|
124
|
-
Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.
|
|
124
|
+
Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.sss)
|
|
125
125
|
"""
|
|
126
126
|
...
|
|
127
127
|
|
|
@@ -129,7 +129,7 @@ class TimeComponents:
|
|
|
129
129
|
def from_iso(cls, iso_str: str) -> TimeComponents:
|
|
130
130
|
"""
|
|
131
131
|
Args:
|
|
132
|
-
iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.
|
|
132
|
+
iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.sss)
|
|
133
133
|
"""
|
|
134
134
|
...
|
|
135
135
|
|
|
@@ -158,7 +158,7 @@ class Epoch:
|
|
|
158
158
|
def from_iso(cls, iso_str: str, time_system: TimeSystem) -> Epoch:
|
|
159
159
|
"""
|
|
160
160
|
Args:
|
|
161
|
-
iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.
|
|
161
|
+
iso_str: ISO 8601 formatted string (YYYY-MM-DDThh:mm:ss.sss)
|
|
162
162
|
time_system: System used to calculate the epoch
|
|
163
163
|
"""
|
|
164
164
|
...
|
|
@@ -179,6 +179,7 @@ class Epoch:
|
|
|
179
179
|
|
|
180
180
|
!!! note
|
|
181
181
|
DTG formats include:
|
|
182
|
+
|
|
182
183
|
- DTG 20: YYYY/DDD HHMM SS.SSS
|
|
183
184
|
- DTG 19: YYYYMonDDHHMMSS.SSS
|
|
184
185
|
- DTG 17: YYYY/DDD.DDDDDDDD
|
|
@@ -193,7 +194,7 @@ class Epoch:
|
|
|
193
194
|
def to_iso(self) -> str:
|
|
194
195
|
"""
|
|
195
196
|
Returns:
|
|
196
|
-
Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.
|
|
197
|
+
Epoch in ISO 8601 format (YYYY-MM-DDThh:mm:ss.sss)
|
|
197
198
|
"""
|
|
198
199
|
...
|
|
199
200
|
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: keplemon
|
|
3
|
+
Version: 0.1.5
|
|
4
|
+
Requires-Dist: requests
|
|
5
|
+
Requires-Dist: click
|
|
6
|
+
Requires-Dist: maturin ; extra == 'dev'
|
|
7
|
+
Requires-Dist: keplemon[test] ; extra == 'dev'
|
|
8
|
+
Requires-Dist: mkdocstrings[python] ; extra == 'dev'
|
|
9
|
+
Requires-Dist: mkdocs-material ; extra == 'dev'
|
|
10
|
+
Requires-Dist: markdown-include ; extra == 'dev'
|
|
11
|
+
Requires-Dist: pytest ; extra == 'test'
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Provides-Extra: test
|
|
14
|
+
Summary: Citra Space Corporation's Rust-accelerated astrodynamics library.
|
|
15
|
+
Author-email: Brandon Sexton <brandon@citra.space>
|
|
16
|
+
License: MIT
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
19
|
+
Project-URL: Documentation, https://keplemon.citra.space
|
|
20
|
+
Project-URL: Repository, https://github.com/citra-space/keplemon.git
|
|
21
|
+
Project-URL: Issues, https://github.com/citra-space/keplemon/issues
|
|
22
|
+
|
|
23
|
+
# KepLemon
|
|
24
|
+
|
|
25
|
+
[Citra Space Corporation's](https://citra.space) Rust-accelerated astrodynamics package built on the shared libraries
|
|
26
|
+
provided by [space-track](https://space-track.org). Please visit the [documentation](https://keplemon.citra.space)
|
|
27
|
+
page for additional details.
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
### From PyPI (Preferred)
|
|
32
|
+
|
|
33
|
+
KepLemon can be installed directly for any operating system from a command line using `pip install keplemon`.
|
|
34
|
+
|
|
35
|
+
### From a Local Build
|
|
36
|
+
|
|
37
|
+
For python users, the **_preferred installation method is through [PyPI](https://www.pypi.org)_**; however, the package can be
|
|
38
|
+
installed locally by following the steps below.
|
|
39
|
+
|
|
40
|
+
1. `git clone https://github.com/citra-space/keplemon.git`
|
|
41
|
+
2. `cargo install cargo-make`
|
|
42
|
+
3. `cargo make build-<os>-<architecture>` (e.g. for Linux x86 `cargo make build-linux-amd`)
|
|
43
|
+
4. `pip install target/wheels/*.whl`
|
|
44
|
+
|
|
45
|
+
## Environment Settings
|
|
46
|
+
|
|
47
|
+
Although not required, it is recommended to explicitly apply the settings in this section before using KepLemon to avoid
|
|
48
|
+
unexpected behaviors and inaccurate calculations.
|
|
49
|
+
|
|
50
|
+
### CPU Limits
|
|
51
|
+
|
|
52
|
+
By default, KepLemon will have access to all available cores when performing parallel functions. Limit this by calling
|
|
53
|
+
`set_thread_count` **_before_** using other KepLemon functions.
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
from keplemon import set_thread_count, get_thread_count
|
|
57
|
+
|
|
58
|
+
# Update this to the desired core count
|
|
59
|
+
set_thread_count(4)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Time Constants and Earth-Orientation Parameters (EOP)
|
|
63
|
+
|
|
64
|
+
All astrodynamics packages have a strict dependence on measured changes to time and Earth's orientation. Since KepLemon
|
|
65
|
+
uses the public Standardized Astrodynamics Algorithms Library (SAAL) at the core, the time and (EOP) data must conform
|
|
66
|
+
to a specific format required by the underlying binaries. Rather than referencing data directly provided by the
|
|
67
|
+
[USNO](https://maia.usno.navy.mil/), utility scripts are provided in KepLemon to request and export the relevant data.
|
|
68
|
+
|
|
69
|
+
#### Global Update
|
|
70
|
+
|
|
71
|
+
Use the command below from a terminal to update time constants and EOP data package-wide.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
keplemon --update-eop global
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### Local Override
|
|
78
|
+
|
|
79
|
+
EOP data can also be written to explicit paths for inspection or package overrides using the commands below.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
keplemon --update-eop custom_path.txt
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
!!! note
|
|
86
|
+
If you intend to use the data written to a local override, you must use the `load_time_constants` method at the
|
|
87
|
+
beginning of your scripts. **_This is not needed if you maintain constants using the global method_**.
|
|
88
|
+
|
|
89
|
+
```python
|
|
90
|
+
from keplemon.time import load_time_constants
|
|
91
|
+
|
|
92
|
+
# Update this to reflect the desired override path
|
|
93
|
+
load_time_constants("custom_path.txt")
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Contributing
|
|
97
|
+
|
|
98
|
+
Anyone is welcome to contribute to KepLemon. Users are encouraged to start by opening issues or forking the repository.
|
|
99
|
+
Changes directly to the baseline may be approved by contacting the owner at <brandon@citra.space>.
|
|
100
|
+
|
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
keplemon-0.1.
|
|
2
|
-
keplemon-0.1.
|
|
3
|
-
keplemon-0.1.
|
|
4
|
-
keplemon/time.py,sha256=rFefwGP2deAeyzMQcaK5D7dIpiQDklr9eBKT6yVK7Ac,2872
|
|
5
|
-
keplemon/enums.py,sha256=Jh0tFHg_rZXnOyLUXmHjSm3MSZFbvQKTBcP0BqHXeMY,308
|
|
6
|
-
keplemon/events.py,sha256=Ep-X4WqhLtXue08swm6Whcc4VFzyWvqnjjAOov6M4bI,154
|
|
7
|
-
keplemon/catalogs.py,sha256=lw71NiXlVtb-z3pQR03afxtkLca4HJcnpZ6kDCcR-Lk,102
|
|
8
|
-
keplemon/elements.py,sha256=Nijsj-qHNuLtc0wfX16eMcBGOsBPZamvTfl8DHTl9P4,399
|
|
9
|
-
keplemon/bodies.py,sha256=XnaY6XTuj8CHM3XOwOSY3E8nSo0RWwCcAY0FGxAVWa8,208
|
|
10
|
-
keplemon/estimation.py,sha256=2K87pFhOfaFohbAtBXv2SA6m_oIN-56toJOftu350fY,228
|
|
11
|
-
keplemon/__init__.py,sha256=BAPHlEUZPMZ6RpxA_VHtTVS7Hf_mQjLWiWNaW69B9-o,742
|
|
12
|
-
keplemon/propagation.py,sha256=sFP4PYDkTFAuZ815J_XaLneLNKx0s_cW4yJBCJKpDxE,115
|
|
13
|
-
keplemon/saal.py,sha256=P_vrtUn0dxZnd_IhzgwbP_KcDYUhZ3vkCN2wrzPTHmo,301
|
|
14
|
-
keplemon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1
|
+
keplemon-0.1.5.dist-info/METADATA,sha256=BOciaVVVFehz2CETHrTtfatOBq1uO_6cWv5temZBDKM,3711
|
|
2
|
+
keplemon-0.1.5.dist-info/WHEEL,sha256=p_tvkyHH2UmMBrR2Gemb1ahXJMM2SXUIsCLrWZgJvB8,104
|
|
3
|
+
keplemon-0.1.5.dist-info/entry_points.txt,sha256=eYbCkvQvWfRDQ0LzaCELov1xeLAxQEHlfdgNq-LXyb0,49
|
|
15
4
|
keplemon/SGP4_Open_License.txt,sha256=0WofOXQb5YJqnYhXWXnBdCajiTJQAT60UAkSeHsxyr8,8509
|
|
5
|
+
keplemon/__init__.py,sha256=BAPHlEUZPMZ6RpxA_VHtTVS7Hf_mQjLWiWNaW69B9-o,742
|
|
6
|
+
keplemon/__init__.pyi,sha256=53luemEWRmxv8_3hkqme2Gp0bSwfkNuLgxxieU4XWdM,679
|
|
7
|
+
keplemon/__main__.py,sha256=-3GVkDOA0lV0MIqU9gPb4zbVimg2lA8HMkvdPDw1O28,669
|
|
8
|
+
keplemon/_keplemon.cpython-311-darwin.so,sha256=Z9F_XnkF6h501uzyNrdaq7TSB4cEgV8Nl4s-fGycLic,1680864
|
|
9
|
+
keplemon/assets/EGM-2008.GEO,sha256=K2nG8HGLATIHZYMfw3GSClYOTCuZ7rq4RdCeUNgCw5A,148770
|
|
10
|
+
keplemon/assets/EGM-96.GEO,sha256=VBkILuvEMwAPuWmUHy2PeyEfULOwJ4PEJLNf5hr84mU,148770
|
|
16
11
|
keplemon/assets/GEM_5-22.GEO,sha256=stemYLn1ChXa-VdLGHYfa15AXZa_xxGZQ65p4c3gffI,6852
|
|
17
12
|
keplemon/assets/GEM_9-30.GEO,sha256=1mM2LRXRdxhs8-Z_xjadlWq8s2tOnRJd7nYOK3cgW_o,15012
|
|
18
13
|
keplemon/assets/JGM2-70.GEO,sha256=7NCW-clrb7PddiBOf_GWrJ0Qf_ZjM823jU9mDIOVLG0,148566
|
|
19
14
|
keplemon/assets/JPLcon_1950_2050.405,sha256=IRfVZmBTDAKGdMGTyZr06KSBY0N5PxRgEcljPrZB_iU,31222725
|
|
20
|
-
keplemon/assets/
|
|
21
|
-
keplemon/assets/EGM-96.GEO,sha256=VBkILuvEMwAPuWmUHy2PeyEfULOwJ4PEJLNf5hr84mU,148770
|
|
15
|
+
keplemon/assets/NWL8C-12.GEO,sha256=ZwDKiFC5AxrSIkDPBUnQMmZeSaA5272V-z8yn6bKjOs,4788
|
|
22
16
|
keplemon/assets/SEM68R-8.GEO,sha256=vJTCLrviQ9HonN9BojX8PbH0vPkL4qgpBxUc9X43sjI,2482
|
|
23
|
-
keplemon/assets/EGM-2008.GEO,sha256=K2nG8HGLATIHZYMfw3GSClYOTCuZ7rq4RdCeUNgCw5A,148770
|
|
24
17
|
keplemon/assets/WGS84-70.GEO,sha256=ARjEC_5s2SVd0Kh9udbTy1ztBwTeuBYPOhUVJgIqit8,148510
|
|
25
|
-
keplemon/assets/
|
|
26
|
-
keplemon/
|
|
27
|
-
keplemon/
|
|
28
|
-
keplemon/
|
|
18
|
+
keplemon/assets/time_constants.dat,sha256=qDpJ2UrQvIDfxsBc4P2AdLS-b2lyR7RCzjqmeG4Ypl8,1226736
|
|
19
|
+
keplemon/bodies.py,sha256=XnaY6XTuj8CHM3XOwOSY3E8nSo0RWwCcAY0FGxAVWa8,208
|
|
20
|
+
keplemon/bodies.pyi,sha256=9BNhUpAm2nQtaMLZkz0xF5T-4i5SkksERkOCRIm3sP8,5621
|
|
21
|
+
keplemon/catalogs.py,sha256=lw71NiXlVtb-z3pQR03afxtkLca4HJcnpZ6kDCcR-Lk,102
|
|
29
22
|
keplemon/catalogs.pyi,sha256=NlWv2E7g5JH8LZyyPCDe9Lh_Me5Fmpv3sPinnbJpLf8,524
|
|
30
|
-
keplemon/elements.
|
|
23
|
+
keplemon/elements.py,sha256=Nijsj-qHNuLtc0wfX16eMcBGOsBPZamvTfl8DHTl9P4,399
|
|
24
|
+
keplemon/elements.pyi,sha256=Ds3viksVpHARyXmhQx4_sR_pDznEApMWwIkbkQ43eJc,8056
|
|
25
|
+
keplemon/enums.py,sha256=Jh0tFHg_rZXnOyLUXmHjSm3MSZFbvQKTBcP0BqHXeMY,308
|
|
31
26
|
keplemon/enums.pyi,sha256=s9uqkm3Zrx6HLV4dQBScRiUy0CT4QoQwFjaCLOEMW1c,2330
|
|
32
|
-
keplemon/estimation.
|
|
33
|
-
keplemon/
|
|
27
|
+
keplemon/estimation.py,sha256=2K87pFhOfaFohbAtBXv2SA6m_oIN-56toJOftu350fY,228
|
|
28
|
+
keplemon/estimation.pyi,sha256=zb_llx8pCx9Iv95mXXpGnXPZeJsg9Oh5GRWDLyXrMFI,5521
|
|
29
|
+
keplemon/events.py,sha256=Ep-X4WqhLtXue08swm6Whcc4VFzyWvqnjjAOov6M4bI,154
|
|
30
|
+
keplemon/events.pyi,sha256=PrVNvvw1_BgUOIEPmxHE03-XTQcl3LTw8UeuRZOTha4,824
|
|
34
31
|
keplemon/libastrofunc.dylib,sha256=UAf9ix55_mm1rvVCYHWTbuHvXPuZ673GfZsEqRknquc,241952
|
|
35
32
|
keplemon/libdllmain.dylib,sha256=8-BkFlZIXC45mx5wPNq0JeEA3Coyqs5oKvcTPZBQC5g,112224
|
|
36
33
|
keplemon/libelops.dylib,sha256=hzdkXXB582wBOBBJZa7gALMtB54sIwroEpgW-ol_EBI,92800
|
|
@@ -48,8 +45,11 @@ keplemon/libspvec.dylib,sha256=d16YFWFxg1kkaA85zr5rknGj8d_XTkVsnrb5U2f0Zfs,14729
|
|
|
48
45
|
keplemon/libtimefunc.dylib,sha256=67pgmC9KRbXxXBpMHF9LJ4xZOYf-1oTP3gySzeQrX_o,130960
|
|
49
46
|
keplemon/libtle.dylib,sha256=GIGNJrqUqIzLTrNcUaC9yg94ZP53MZhClq4n7xvSdTk,164816
|
|
50
47
|
keplemon/libvcm.dylib,sha256=c2x97IoW_cXq9kO1k56V1nTKXbnl812aZNKMPqKa6yU,196384
|
|
48
|
+
keplemon/propagation.py,sha256=sFP4PYDkTFAuZ815J_XaLneLNKx0s_cW4yJBCJKpDxE,115
|
|
51
49
|
keplemon/propagation.pyi,sha256=YSA3cBzgHLW3_dykrjMX4PbReYJmz5Z7bzfuibPaegc,464
|
|
50
|
+
keplemon/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
|
+
keplemon/saal.py,sha256=P_vrtUn0dxZnd_IhzgwbP_KcDYUhZ3vkCN2wrzPTHmo,301
|
|
52
52
|
keplemon/saal.pyi,sha256=LX4i3SxpL6UduhHjJ5aO443QbH1v-BhKBL968Z8vQhY,469
|
|
53
|
-
keplemon/time.
|
|
54
|
-
keplemon/
|
|
55
|
-
keplemon-0.1.
|
|
53
|
+
keplemon/time.py,sha256=rFefwGP2deAeyzMQcaK5D7dIpiQDklr9eBKT6yVK7Ac,2872
|
|
54
|
+
keplemon/time.pyi,sha256=f6MxNpscs3jje0zo5yilyMBj8b0U7TVFnU6bt6NAJl0,6255
|
|
55
|
+
keplemon-0.1.5.dist-info/RECORD,,
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: keplemon
|
|
3
|
-
Version: 0.1.3
|
|
4
|
-
Requires-Dist: requests
|
|
5
|
-
Requires-Dist: click
|
|
6
|
-
Requires-Dist: maturin ; extra == 'dev'
|
|
7
|
-
Requires-Dist: keplemon[test] ; extra == 'dev'
|
|
8
|
-
Requires-Dist: mkdocstrings[python] ; extra == 'dev'
|
|
9
|
-
Requires-Dist: mkdocs-material ; extra == 'dev'
|
|
10
|
-
Requires-Dist: markdown-include ; extra == 'dev'
|
|
11
|
-
Requires-Dist: pytest ; extra == 'test'
|
|
12
|
-
Provides-Extra: dev
|
|
13
|
-
Provides-Extra: test
|
|
14
|
-
Summary: Citra Space Corporation's Rust-accelerated astrodynamics library.
|
|
15
|
-
Author-email: Brandon Sexton <brandon@citra.space>
|
|
16
|
-
License: MIT
|
|
17
|
-
Requires-Python: >=3.9
|
|
18
|
-
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
19
|
-
Project-URL: Documentation, https://keplemon.citra.space
|
|
20
|
-
Project-URL: Repository, https://github.com/citra-space/keplemon.git
|
|
21
|
-
Project-URL: Issues, https://github.com/citra-space/keplemon/issues
|
|
22
|
-
|
|
23
|
-
# KepLemon
|
|
24
|
-
|
|
25
|
-
[Citra Space Corporation's](https://citra.space) Rust-accelerated astrodynamics package built on the shared libraries
|
|
26
|
-
provided by [space-track](https://space-track.org). Please visit the [documentation](https://keplemon.citra.space)
|
|
27
|
-
page for additional details.
|
|
28
|
-
|
|
File without changes
|