open-space-toolkit-astrodynamics 1.2.0__py310-none-any.whl → 4.2.0__py310-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.
- {open_space_toolkit_astrodynamics-1.2.0.dist-info → open_space_toolkit_astrodynamics-4.2.0.dist-info}/METADATA +2 -2
- open_space_toolkit_astrodynamics-4.2.0.dist-info/RECORD +25 -0
- ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-310-x86_64-linux-gnu.so +0 -0
- ostk/astrodynamics/__init__.py +6 -0
- ostk/astrodynamics/{libopen-space-toolkit-astrodynamics.so.1 → libopen-space-toolkit-astrodynamics.so.4} +0 -0
- ostk/astrodynamics/pytrajectory/pystate.py +36 -0
- ostk/astrodynamics/test/test_access.py +2 -6
- ostk/astrodynamics/test/test_converters.py +1 -3
- ostk/astrodynamics/test/test_event_condition.py +24 -41
- ostk/astrodynamics/test/test_import.py +3 -3
- ostk/astrodynamics/test/test_viewer.py +1 -2
- ostk/astrodynamics/viewer.py +1 -1
- open_space_toolkit_astrodynamics-1.2.0.dist-info/RECORD +0 -72
- ostk/astrodynamics/test/access/__init__.py +0 -1
- ostk/astrodynamics/test/access/test_generator.py +0 -248
- ostk/astrodynamics/test/conjunction/messages/ccsds/__init__.py +0 -1
- ostk/astrodynamics/test/conjunction/messages/ccsds/conftest.py +0 -325
- ostk/astrodynamics/test/conjunction/messages/ccsds/data/cdm.json +0 -303
- ostk/astrodynamics/test/conjunction/messages/ccsds/test_cdm.py +0 -418
- ostk/astrodynamics/test/event_condition/test_coe_condition.py +0 -95
- ostk/astrodynamics/test/event_condition/test_conjunctive.py +0 -64
- ostk/astrodynamics/test/event_condition/test_disjunctive.py +0 -63
- ostk/astrodynamics/test/event_condition/test_duration_condition.py +0 -36
- ostk/astrodynamics/test/event_condition/test_logical_connective.py +0 -37
- ostk/astrodynamics/test/flight/__init__.py +0 -1
- ostk/astrodynamics/test/flight/profile/__init__.py +0 -1
- ostk/astrodynamics/test/flight/profile/test_state.py +0 -144
- ostk/astrodynamics/test/flight/system/__init__.py +0 -1
- ostk/astrodynamics/test/flight/system/dynamics/__init__.py +0 -1
- ostk/astrodynamics/test/flight/system/dynamics/test_atmospheric_drag.py +0 -86
- ostk/astrodynamics/test/flight/system/dynamics/test_central_body_gravity.py +0 -57
- ostk/astrodynamics/test/flight/system/dynamics/test_position_derivative.py +0 -49
- ostk/astrodynamics/test/flight/system/dynamics/test_third_body_gravity.py +0 -65
- ostk/astrodynamics/test/flight/system/test_satellite_system.py +0 -77
- ostk/astrodynamics/test/flight/test_profile.py +0 -147
- ostk/astrodynamics/test/flight/test_system.py +0 -55
- ostk/astrodynamics/test/solvers/__init__.py +0 -1
- ostk/astrodynamics/test/solvers/test_temporal_condition_solver.py +0 -153
- ostk/astrodynamics/test/test_numerical_solver.py +0 -248
- ostk/astrodynamics/test/trajectory/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/messages/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/messages/spacex/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/messages/spacex/conftest.py +0 -18
- ostk/astrodynamics/test/trajectory/orbit/messages/spacex/data/opm_1.yaml +0 -44
- ostk/astrodynamics/test/trajectory/orbit/messages/spacex/test_opm.py +0 -108
- ostk/astrodynamics/test/trajectory/orbit/models/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/models/kepler/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/models/kepler/test_coe.py +0 -108
- ostk/astrodynamics/test/trajectory/orbit/models/sgp4/__init__.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/models/sgp4/test_tle.py +0 -332
- ostk/astrodynamics/test/trajectory/orbit/models/test_kepler.py +0 -130
- ostk/astrodynamics/test/trajectory/orbit/models/test_propagated.py +0 -197
- ostk/astrodynamics/test/trajectory/orbit/models/test_sgp4.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/models/test_tabulated.py +0 -383
- ostk/astrodynamics/test/trajectory/orbit/test_model.py +0 -1
- ostk/astrodynamics/test/trajectory/orbit/test_pass.py +0 -55
- ostk/astrodynamics/test/trajectory/test_model.py +0 -1
- ostk/astrodynamics/test/trajectory/test_orbit.py +0 -92
- ostk/astrodynamics/test/trajectory/test_propagator.py +0 -233
- ostk/astrodynamics/test/trajectory/test_state.py +0 -70
- {open_space_toolkit_astrodynamics-1.2.0.dist-info → open_space_toolkit_astrodynamics-4.2.0.dist-info}/WHEEL +0 -0
- {open_space_toolkit_astrodynamics-1.2.0.dist-info → open_space_toolkit_astrodynamics-4.2.0.dist-info}/top_level.txt +0 -0
- {open_space_toolkit_astrodynamics-1.2.0.dist-info → open_space_toolkit_astrodynamics-4.2.0.dist-info}/zip-safe +0 -0
- /ostk/{__init__.py → astrodynamics/pytrajectory/__init__.py} +0 -0
@@ -1,418 +0,0 @@
|
|
1
|
-
# Apache License 2.0
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
from datetime import datetime
|
6
|
-
|
7
|
-
from ostk.core.containers import Dictionary
|
8
|
-
from ostk.core.filesystem import File
|
9
|
-
|
10
|
-
from ostk.physics.units import Length
|
11
|
-
from ostk.physics.units import Mass
|
12
|
-
from ostk.physics.time import Instant
|
13
|
-
from ostk.physics.time import Scale
|
14
|
-
from ostk.physics.time import Duration
|
15
|
-
from ostk.physics.coordinate import Frame
|
16
|
-
from ostk.physics.coordinate import Position
|
17
|
-
from ostk.physics.coordinate import Velocity
|
18
|
-
|
19
|
-
from ostk.astrodynamics.trajectory import State
|
20
|
-
from ostk.astrodynamics.conjunction.messages.ccsds import CDM
|
21
|
-
|
22
|
-
|
23
|
-
@pytest.fixture
|
24
|
-
def cdm() -> CDM:
|
25
|
-
return CDM(
|
26
|
-
header=CDM.Header(
|
27
|
-
ccsds_cdm_version="1.0",
|
28
|
-
creation_date=Instant.date_time(
|
29
|
-
datetime(2010, 3, 12, 22, 31, 12), Scale.UTC
|
30
|
-
),
|
31
|
-
originator="JSPOC",
|
32
|
-
message_for="SATELLITE A",
|
33
|
-
message_id="201113719185",
|
34
|
-
),
|
35
|
-
relative_metadata=CDM.RelativeMetadata(
|
36
|
-
comment="",
|
37
|
-
time_of_closest_approach=Instant.date_time(
|
38
|
-
datetime(2010, 3, 13, 22, 37, 52, 618), Scale.UTC
|
39
|
-
),
|
40
|
-
miss_distance=Length.meters(715.0),
|
41
|
-
start_screen_period=Instant.date_time(
|
42
|
-
datetime(2010, 3, 12, 18, 29, 32, 212), Scale.UTC
|
43
|
-
),
|
44
|
-
end_screen_period=Instant.date_time(
|
45
|
-
datetime(2010, 3, 15, 18, 29, 32, 212), Scale.UTC
|
46
|
-
),
|
47
|
-
screen_volume_frame="RTN",
|
48
|
-
screen_volume_shape="ELLIPSOID",
|
49
|
-
screen_volume_x=200.0,
|
50
|
-
screen_volume_y=1000.0,
|
51
|
-
screen_volume_z=1000.0,
|
52
|
-
screen_entry_time=Instant.date_time(
|
53
|
-
datetime(2010, 3, 13, 22, 37, 52, 222), Scale.UTC
|
54
|
-
),
|
55
|
-
screen_exit_time=Instant.date_time(
|
56
|
-
datetime(2010, 3, 13, 22, 37, 52, 824), Scale.UTC
|
57
|
-
),
|
58
|
-
collision_probability=0.0000435,
|
59
|
-
collision_probability_method="FOSTER-1992",
|
60
|
-
),
|
61
|
-
objects_metadata_array=[
|
62
|
-
CDM.Metadata(
|
63
|
-
comment="",
|
64
|
-
object="OBJECT1",
|
65
|
-
object_designator=12345,
|
66
|
-
catalog_name="SATCAT",
|
67
|
-
object_name="SATELLITE A",
|
68
|
-
international_designator="1997−030E",
|
69
|
-
object_type=CDM.ObjectType.Payload,
|
70
|
-
operator_contact_position="OSA",
|
71
|
-
operator_organization="EUTMETSAT",
|
72
|
-
operator_phone="+49615130312",
|
73
|
-
operator_email="JOHN.DOE@SOMEWHERE.NET",
|
74
|
-
ephemeris_name="EPHEMERIS SATELLITE A",
|
75
|
-
covariance_method="CALCULATED",
|
76
|
-
maneuverable="YES",
|
77
|
-
orbit_center="",
|
78
|
-
reference_frame="EME2000",
|
79
|
-
gravity_model="EGM-96: 36D 36O",
|
80
|
-
atmospheric_model="JACCHIA 70 DCA",
|
81
|
-
n_body_perturbations="MOON, SUN",
|
82
|
-
solar_radiation_pressure=False,
|
83
|
-
earth_tides=False,
|
84
|
-
in_track_thrust=False,
|
85
|
-
),
|
86
|
-
CDM.Metadata(
|
87
|
-
object="OBJECT2",
|
88
|
-
object_designator=12346,
|
89
|
-
catalog_name="SATCAT",
|
90
|
-
object_name="SATELLITE B",
|
91
|
-
international_designator="1997−030F",
|
92
|
-
object_type=CDM.ObjectType.Payload,
|
93
|
-
ephemeris_name="EPHEMERIS SATELLITE B",
|
94
|
-
covariance_method="CALCULATED",
|
95
|
-
maneuverable="YES",
|
96
|
-
reference_frame="EME2000",
|
97
|
-
),
|
98
|
-
],
|
99
|
-
objects_data_array=[
|
100
|
-
CDM.Data(
|
101
|
-
time_last_observation_start=Instant.date_time(
|
102
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
103
|
-
),
|
104
|
-
time_last_observation_end=Instant.date_time(
|
105
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
106
|
-
),
|
107
|
-
recommended_od_span=Duration.days(7.88),
|
108
|
-
actual_od_span=Duration.days(5.50),
|
109
|
-
observations_available=592,
|
110
|
-
observations_used=579,
|
111
|
-
tracks_available=123,
|
112
|
-
tracks_used=119,
|
113
|
-
residuals_accepted=97.8,
|
114
|
-
weighted_rms=0.864,
|
115
|
-
area_pc=5.2,
|
116
|
-
area_drag=0.0,
|
117
|
-
area_srp=0.0,
|
118
|
-
mass=Mass.kilograms(251.6),
|
119
|
-
cd_area_over_mass=0.0,
|
120
|
-
cr_area_over_mass=0.0,
|
121
|
-
thrust_acceleration=0.0,
|
122
|
-
sedr=0.0,
|
123
|
-
),
|
124
|
-
CDM.Data(
|
125
|
-
time_last_observation_start=Instant.date_time(
|
126
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
127
|
-
),
|
128
|
-
time_last_observation_end=Instant.date_time(
|
129
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
130
|
-
),
|
131
|
-
recommended_od_span=Duration.days(7.88),
|
132
|
-
actual_od_span=Duration.days(5.50),
|
133
|
-
observations_available=592,
|
134
|
-
observations_used=579,
|
135
|
-
tracks_available=123,
|
136
|
-
tracks_used=119,
|
137
|
-
residuals_accepted=97.8,
|
138
|
-
weighted_rms=0.864,
|
139
|
-
area_pc=5.2,
|
140
|
-
area_drag=0.0,
|
141
|
-
area_srp=0.0,
|
142
|
-
mass=Mass.kilograms(251.6),
|
143
|
-
cd_area_over_mass=0.0,
|
144
|
-
cr_area_over_mass=0.0,
|
145
|
-
thrust_acceleration=0.0,
|
146
|
-
sedr=0.0,
|
147
|
-
),
|
148
|
-
],
|
149
|
-
)
|
150
|
-
|
151
|
-
|
152
|
-
class TestCDM:
|
153
|
-
def test_constructor(self, cdm: CDM):
|
154
|
-
assert cdm is not None
|
155
|
-
|
156
|
-
def test_get_header(self, cdm: CDM):
|
157
|
-
cdm_header: CDM.Header = cdm.get_header()
|
158
|
-
|
159
|
-
assert cdm_header is not None
|
160
|
-
assert cdm_header.ccsds_cdm_version == "1.0"
|
161
|
-
assert cdm_header.creation_date == Instant.date_time(
|
162
|
-
datetime(2010, 3, 12, 22, 31, 12), Scale.UTC
|
163
|
-
)
|
164
|
-
assert cdm_header.originator == "JSPOC"
|
165
|
-
assert cdm_header.message_for == "SATELLITE A"
|
166
|
-
assert cdm_header.message_id == "201113719185"
|
167
|
-
|
168
|
-
def test_get_relative_metadata(self, cdm: CDM):
|
169
|
-
cdm_relative_metadata: CDM.RelativeMetadata = cdm.get_relative_metadata()
|
170
|
-
|
171
|
-
assert cdm_relative_metadata is not None
|
172
|
-
assert cdm_relative_metadata.comment == ""
|
173
|
-
assert cdm_relative_metadata.time_of_closest_approach == Instant.date_time(
|
174
|
-
datetime(2010, 3, 13, 22, 37, 52, 618), Scale.UTC
|
175
|
-
)
|
176
|
-
assert cdm_relative_metadata.miss_distance == Length.meters(715.0)
|
177
|
-
assert cdm_relative_metadata.start_screen_period == Instant.date_time(
|
178
|
-
datetime(2010, 3, 12, 18, 29, 32, 212), Scale.UTC
|
179
|
-
)
|
180
|
-
assert cdm_relative_metadata.end_screen_period == Instant.date_time(
|
181
|
-
datetime(2010, 3, 15, 18, 29, 32, 212), Scale.UTC
|
182
|
-
)
|
183
|
-
assert cdm_relative_metadata.screen_volume_frame == "RTN"
|
184
|
-
assert cdm_relative_metadata.screen_volume_shape == "ELLIPSOID"
|
185
|
-
assert cdm_relative_metadata.screen_volume_x == 200.0
|
186
|
-
assert cdm_relative_metadata.screen_volume_y == 1000.0
|
187
|
-
assert cdm_relative_metadata.screen_volume_z == 1000.0
|
188
|
-
assert cdm_relative_metadata.screen_entry_time == Instant.date_time(
|
189
|
-
datetime(2010, 3, 13, 22, 37, 52, 222), Scale.UTC
|
190
|
-
)
|
191
|
-
assert cdm_relative_metadata.screen_exit_time == Instant.date_time(
|
192
|
-
datetime(2010, 3, 13, 22, 37, 52, 824), Scale.UTC
|
193
|
-
)
|
194
|
-
assert cdm_relative_metadata.collision_probability == 0.0000435
|
195
|
-
assert cdm_relative_metadata.collision_probability_method == "FOSTER-1992"
|
196
|
-
|
197
|
-
def test_get_metadata_array(self, cdm: CDM):
|
198
|
-
assert cdm.get_metadata_array() is not None
|
199
|
-
assert len(cdm.get_metadata_array()) == 2
|
200
|
-
|
201
|
-
def test_get_data_array(self, cdm: CDM):
|
202
|
-
assert cdm.get_data_array() is not None
|
203
|
-
assert len(cdm.get_data_array()) == 2
|
204
|
-
|
205
|
-
def test_get_object_metadata_at(self, cdm: CDM):
|
206
|
-
assert cdm.get_object_metadata_at(0) is not None
|
207
|
-
assert cdm.get_object_metadata_at(1) is not None
|
208
|
-
|
209
|
-
cdm_object_1_metadata: CDM.Metadata = cdm.get_object_metadata_at(0)
|
210
|
-
|
211
|
-
assert cdm_object_1_metadata.comment == ""
|
212
|
-
assert cdm_object_1_metadata.object == "OBJECT1"
|
213
|
-
assert cdm_object_1_metadata.object_designator == 12345
|
214
|
-
assert cdm_object_1_metadata.catalog_name == "SATCAT"
|
215
|
-
assert cdm_object_1_metadata.object_name == "SATELLITE A"
|
216
|
-
assert cdm_object_1_metadata.international_designator == "1997−030E"
|
217
|
-
assert cdm_object_1_metadata.object_type == CDM.ObjectType.Payload
|
218
|
-
assert cdm_object_1_metadata.operator_contact_position == "OSA"
|
219
|
-
assert cdm_object_1_metadata.operator_organization == "EUTMETSAT"
|
220
|
-
assert cdm_object_1_metadata.operator_phone == "+49615130312"
|
221
|
-
assert cdm_object_1_metadata.operator_email == "JOHN.DOE@SOMEWHERE.NET"
|
222
|
-
assert cdm_object_1_metadata.ephemeris_name == "EPHEMERIS SATELLITE A"
|
223
|
-
assert cdm_object_1_metadata.covariance_method == "CALCULATED"
|
224
|
-
assert cdm_object_1_metadata.maneuverable == "YES"
|
225
|
-
assert cdm_object_1_metadata.orbit_center == ""
|
226
|
-
assert cdm_object_1_metadata.reference_frame == "EME2000"
|
227
|
-
assert cdm_object_1_metadata.gravity_model == "EGM-96: 36D 36O"
|
228
|
-
assert cdm_object_1_metadata.atmospheric_model == "JACCHIA 70 DCA"
|
229
|
-
assert cdm_object_1_metadata.n_body_perturbations == "MOON, SUN"
|
230
|
-
assert cdm_object_1_metadata.solar_radiation_pressure == False
|
231
|
-
assert cdm_object_1_metadata.earth_tides == False
|
232
|
-
assert cdm_object_1_metadata.in_track_thrust == False
|
233
|
-
|
234
|
-
cdm_object_2_metadata: CDM.Metadata = cdm.get_object_metadata_at(1)
|
235
|
-
|
236
|
-
assert cdm_object_2_metadata.comment == ""
|
237
|
-
assert cdm_object_2_metadata.object == "OBJECT2"
|
238
|
-
assert cdm_object_2_metadata.object_designator == 12346
|
239
|
-
assert cdm_object_2_metadata.catalog_name == "SATCAT"
|
240
|
-
assert cdm_object_2_metadata.object_name == "SATELLITE B"
|
241
|
-
assert cdm_object_2_metadata.international_designator == "1997−030F"
|
242
|
-
assert cdm_object_2_metadata.object_type == CDM.ObjectType.Payload
|
243
|
-
assert cdm_object_2_metadata.operator_contact_position == ""
|
244
|
-
assert cdm_object_2_metadata.operator_organization == ""
|
245
|
-
assert cdm_object_2_metadata.operator_phone == ""
|
246
|
-
assert cdm_object_2_metadata.operator_email == ""
|
247
|
-
assert cdm_object_2_metadata.ephemeris_name == "EPHEMERIS SATELLITE B"
|
248
|
-
assert cdm_object_2_metadata.covariance_method == "CALCULATED"
|
249
|
-
assert cdm_object_2_metadata.maneuverable == "YES"
|
250
|
-
assert cdm_object_2_metadata.orbit_center == ""
|
251
|
-
assert cdm_object_2_metadata.reference_frame == "EME2000"
|
252
|
-
assert cdm_object_2_metadata.gravity_model == ""
|
253
|
-
assert cdm_object_2_metadata.atmospheric_model == ""
|
254
|
-
assert cdm_object_2_metadata.n_body_perturbations == ""
|
255
|
-
assert cdm_object_2_metadata.solar_radiation_pressure == False
|
256
|
-
assert cdm_object_2_metadata.earth_tides == False
|
257
|
-
assert cdm_object_2_metadata.in_track_thrust == False
|
258
|
-
|
259
|
-
with pytest.raises(Exception) as e:
|
260
|
-
cdm.get_object_metadata_at(2)
|
261
|
-
|
262
|
-
def test_get_object_data_at(self, cdm: CDM):
|
263
|
-
assert cdm.get_object_data_at(0) is not None
|
264
|
-
assert cdm.get_object_data_at(1) is not None
|
265
|
-
|
266
|
-
cdm_object_1_data: CDM.Data = cdm.get_object_data_at(0)
|
267
|
-
|
268
|
-
assert cdm_object_1_data.time_last_observation_start == Instant.date_time(
|
269
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
270
|
-
)
|
271
|
-
assert cdm_object_1_data.time_last_observation_end == Instant.date_time(
|
272
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
273
|
-
)
|
274
|
-
assert cdm_object_1_data.recommended_od_span == Duration.days(7.88)
|
275
|
-
assert cdm_object_1_data.actual_od_span == Duration.days(5.50)
|
276
|
-
assert cdm_object_1_data.observations_available == 592
|
277
|
-
assert cdm_object_1_data.observations_used == 579
|
278
|
-
assert cdm_object_1_data.tracks_available == 123
|
279
|
-
assert cdm_object_1_data.tracks_used == 119
|
280
|
-
assert cdm_object_1_data.residuals_accepted == 97.8
|
281
|
-
assert cdm_object_1_data.weighted_rms == 0.864
|
282
|
-
assert cdm_object_1_data.area_pc == 5.2
|
283
|
-
assert cdm_object_1_data.area_drag == 0.0
|
284
|
-
assert cdm_object_1_data.area_srp == 0.0
|
285
|
-
assert cdm_object_1_data.mass == Mass.kilograms(251.6)
|
286
|
-
assert cdm_object_1_data.cd_area_over_mass == 0.0
|
287
|
-
assert cdm_object_1_data.cr_area_over_mass == 0.0
|
288
|
-
assert cdm_object_1_data.thrust_acceleration == 0.0
|
289
|
-
assert cdm_object_1_data.sedr == 0.0
|
290
|
-
|
291
|
-
cdm_object_2_data: CDM.Data = cdm.get_object_data_at(1)
|
292
|
-
|
293
|
-
assert cdm_object_2_data.time_last_observation_start == Instant.date_time(
|
294
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
295
|
-
)
|
296
|
-
assert cdm_object_2_data.time_last_observation_end == Instant.date_time(
|
297
|
-
datetime(2010, 3, 12, 2, 14, 12, 746), Scale.UTC
|
298
|
-
)
|
299
|
-
assert cdm_object_2_data.recommended_od_span == Duration.days(7.88)
|
300
|
-
assert cdm_object_2_data.actual_od_span == Duration.days(5.50)
|
301
|
-
assert cdm_object_2_data.observations_available == 592
|
302
|
-
assert cdm_object_2_data.observations_used == 579
|
303
|
-
assert cdm_object_2_data.tracks_available == 123
|
304
|
-
assert cdm_object_2_data.tracks_used == 119
|
305
|
-
assert cdm_object_2_data.residuals_accepted == 97.8
|
306
|
-
assert cdm_object_2_data.weighted_rms == 0.864
|
307
|
-
assert cdm_object_2_data.area_pc == 5.2
|
308
|
-
assert cdm_object_2_data.area_drag == 0.0
|
309
|
-
assert cdm_object_2_data.area_srp == 0.0
|
310
|
-
assert cdm_object_2_data.mass == Mass.kilograms(251.6)
|
311
|
-
assert cdm_object_2_data.cd_area_over_mass == 0.0
|
312
|
-
assert cdm_object_2_data.cr_area_over_mass == 0.0
|
313
|
-
assert cdm_object_2_data.thrust_acceleration == 0.0
|
314
|
-
assert cdm_object_2_data.sedr == 0.0
|
315
|
-
|
316
|
-
with pytest.raises(Exception) as e:
|
317
|
-
cdm.get_object_data_at(2)
|
318
|
-
|
319
|
-
def test_get_ccsds_cdm_version(self, cdm: CDM):
|
320
|
-
assert cdm.get_ccsds_cdm_version() == "1.0"
|
321
|
-
|
322
|
-
def test_get_creation_instant(self, cdm: CDM):
|
323
|
-
assert cdm.get_creation_instant() == Instant.date_time(
|
324
|
-
datetime(2010, 3, 12, 22, 31, 12), Scale.UTC
|
325
|
-
)
|
326
|
-
|
327
|
-
def test_get_originator(self, cdm: CDM):
|
328
|
-
assert cdm.get_originator() == "JSPOC"
|
329
|
-
|
330
|
-
def test_get_message_for(self, cdm: CDM):
|
331
|
-
assert cdm.get_message_for() == "SATELLITE A"
|
332
|
-
|
333
|
-
def test_get_message_id(self, cdm: CDM):
|
334
|
-
assert cdm.get_message_id() == "201113719185"
|
335
|
-
|
336
|
-
def test_get_time_of_closest_approach(self, cdm: CDM):
|
337
|
-
assert cdm.get_time_of_closest_approach() == Instant.date_time(
|
338
|
-
datetime(2010, 3, 13, 22, 37, 52, 618), Scale.UTC
|
339
|
-
)
|
340
|
-
|
341
|
-
def test_get_miss_distance(self, cdm: CDM):
|
342
|
-
assert cdm.get_miss_distance() == Length.meters(715.0)
|
343
|
-
|
344
|
-
def test_get_relative_position(self, cdm: CDM):
|
345
|
-
assert cdm.get_relative_position().is_defined() is False
|
346
|
-
|
347
|
-
def test_get_relative_velocity(self, cdm: CDM):
|
348
|
-
assert cdm.get_relative_velocity().is_defined() is False
|
349
|
-
|
350
|
-
def test_get_collision_probability(self, cdm: CDM):
|
351
|
-
assert cdm.get_collision_probability() == 0.0000435
|
352
|
-
|
353
|
-
def test_get_collision_probability_method(self, cdm: CDM):
|
354
|
-
assert cdm.get_collision_probability_method() == "FOSTER-1992"
|
355
|
-
|
356
|
-
def test_undefined(self):
|
357
|
-
assert CDM.undefined().is_defined() is False
|
358
|
-
|
359
|
-
def test_dictionary(self, cdm_spacetrack_dictionary: dict):
|
360
|
-
dictionary = Dictionary(cdm_spacetrack_dictionary)
|
361
|
-
|
362
|
-
cdm: CDM = CDM.dictionary(dictionary)
|
363
|
-
|
364
|
-
assert cdm is not None
|
365
|
-
assert cdm.get_header() is not None
|
366
|
-
assert cdm.get_ccsds_cdm_version() == "1.0"
|
367
|
-
assert cdm.get_creation_instant() == Instant.date_time(
|
368
|
-
datetime(2022, 12, 25, 0, 33, 16), Scale.UTC
|
369
|
-
)
|
370
|
-
assert cdm.get_originator() == "CSpOC"
|
371
|
-
assert cdm.get_message_for() == "YAM-2"
|
372
|
-
assert cdm.get_message_id() == "406320986"
|
373
|
-
assert cdm.get_time_of_closest_approach() == Instant.date_time(
|
374
|
-
datetime(2022, 12, 27, 13, 28, 59, 516000), Scale.UTC
|
375
|
-
)
|
376
|
-
assert cdm.get_miss_distance() == Length.meters(974.0)
|
377
|
-
assert cdm.get_relative_position().is_defined() is False
|
378
|
-
assert cdm.get_relative_velocity().is_defined() is False
|
379
|
-
assert cdm.get_collision_probability() == 5.162516e-16
|
380
|
-
assert cdm.get_collision_probability_method() == "FOSTER-1992"
|
381
|
-
|
382
|
-
object_1_metadata: CDM.Metadata = cdm.get_object_metadata_at(0)
|
383
|
-
|
384
|
-
assert object_1_metadata.object == "OBJECT1"
|
385
|
-
assert object_1_metadata.object_designator == 48911
|
386
|
-
assert object_1_metadata.catalog_name == "SATCAT"
|
387
|
-
assert object_1_metadata.object_name == "YAM-2"
|
388
|
-
assert object_1_metadata.international_designator == "2021-059AJ"
|
389
|
-
assert object_1_metadata.object_type == CDM.ObjectType.Payload
|
390
|
-
assert object_1_metadata.ephemeris_name == "NONE"
|
391
|
-
assert object_1_metadata.covariance_method == "CALCULATED"
|
392
|
-
assert object_1_metadata.maneuverable == "N/A"
|
393
|
-
assert object_1_metadata.reference_frame == "ITRF"
|
394
|
-
|
395
|
-
# object_1_data: CDM.Data = cdm.get_object_data_at(0)
|
396
|
-
|
397
|
-
# assert object_1_data.state == State(
|
398
|
-
# Instant.date_time(datetime(2022, 12, 27, 13, 28, 59, 516000), Scale.UTC),
|
399
|
-
# Position.meters([-4988150.231999999844, -1691825.955000000075, -4469421.481999999844], Frame.ITRF()),
|
400
|
-
# Velocity.meters_per_second([-5122.248844000000, 54.300816000000, 5699.434412000000], Frame.ITRF())
|
401
|
-
# )
|
402
|
-
|
403
|
-
def test_parse(self, cdm_file: File):
|
404
|
-
with open(str(cdm_file.get_path().to_string()), "r") as stream:
|
405
|
-
assert CDM.parse(string=stream.read()) is not None
|
406
|
-
|
407
|
-
def test_load(self, cdm_file: File):
|
408
|
-
assert CDM.load(file=cdm_file) is not None
|
409
|
-
|
410
|
-
def test_object_type_from_string(self):
|
411
|
-
assert CDM.object_type_from_string("PAYLOAD") == CDM.ObjectType.Payload
|
412
|
-
assert CDM.object_type_from_string("ROCKET BODY") == CDM.ObjectType.RocketBody
|
413
|
-
assert CDM.object_type_from_string("DEBRIS") == CDM.ObjectType.Debris
|
414
|
-
assert CDM.object_type_from_string("UNKNOWN") == CDM.ObjectType.Unknown
|
415
|
-
assert CDM.object_type_from_string("OTHER") == CDM.ObjectType.Other
|
416
|
-
|
417
|
-
with pytest.raises(Exception) as e:
|
418
|
-
CDM.object_type_from_string("ANOTHERSUPPORTEDTYPE")
|
@@ -1,95 +0,0 @@
|
|
1
|
-
# Apache License 2.0
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
from ostk.physics.environment.gravitational import Earth
|
6
|
-
from ostk.physics.units import Derived, Length, Angle
|
7
|
-
|
8
|
-
from ostk.astrodynamics.event_condition import COECondition
|
9
|
-
from ostk.astrodynamics.trajectory.orbit.models.kepler import COE
|
10
|
-
|
11
|
-
|
12
|
-
@pytest.fixture
|
13
|
-
def criteria() -> COECondition.Criteria:
|
14
|
-
return COECondition.Criteria.AnyCrossing
|
15
|
-
|
16
|
-
|
17
|
-
@pytest.fixture
|
18
|
-
def gravitational_parameter() -> Derived:
|
19
|
-
return Earth.spherical.gravitational_parameter
|
20
|
-
|
21
|
-
|
22
|
-
@pytest.fixture
|
23
|
-
def element() -> COE.Element:
|
24
|
-
return COE.Element.SemiMajorAxis
|
25
|
-
|
26
|
-
|
27
|
-
@pytest.fixture
|
28
|
-
def target() -> float:
|
29
|
-
return 7e6
|
30
|
-
|
31
|
-
|
32
|
-
@pytest.fixture
|
33
|
-
def condition(
|
34
|
-
criteria: COECondition.Criteria,
|
35
|
-
element: COE.Element,
|
36
|
-
target: float,
|
37
|
-
gravitational_parameter: Derived,
|
38
|
-
) -> COECondition:
|
39
|
-
return COECondition(
|
40
|
-
"Test COECondition", criteria, element, target, gravitational_parameter
|
41
|
-
)
|
42
|
-
|
43
|
-
|
44
|
-
@pytest.fixture
|
45
|
-
def state_vector() -> list[float]:
|
46
|
-
return [
|
47
|
-
717094.039086306,
|
48
|
-
-6872433.2241124,
|
49
|
-
46175.9696673281,
|
50
|
-
-970.650826004612,
|
51
|
-
-45.4598114773158,
|
52
|
-
7529.82424886455,
|
53
|
-
]
|
54
|
-
|
55
|
-
|
56
|
-
class TestCOECondition:
|
57
|
-
def test_constructor(self, criteria, element, target, gravitational_parameter):
|
58
|
-
name = "Test COECondition"
|
59
|
-
condition = COECondition(
|
60
|
-
name, criteria, element, target, gravitational_parameter
|
61
|
-
)
|
62
|
-
|
63
|
-
assert condition is not None
|
64
|
-
|
65
|
-
def test_getters(self, condition, element, target, gravitational_parameter):
|
66
|
-
assert condition.get_element() == element
|
67
|
-
assert condition.get_target() == target
|
68
|
-
assert condition.get_gravitational_parameter() == gravitational_parameter
|
69
|
-
|
70
|
-
@pytest.mark.parametrize(
|
71
|
-
"static_constructor,target",
|
72
|
-
(
|
73
|
-
(COECondition.semi_major_axis, Length.meters(7e6)),
|
74
|
-
(COECondition.eccentricity, 0.1),
|
75
|
-
(COECondition.inclination, Angle.degrees(0.0)),
|
76
|
-
(COECondition.aop, Angle.degrees(0.0)),
|
77
|
-
(COECondition.raan, Angle.degrees(0.0)),
|
78
|
-
(COECondition.true_anomaly, Angle.degrees(0.0)),
|
79
|
-
(COECondition.mean_anomaly, Angle.degrees(0.0)),
|
80
|
-
(COECondition.eccentric_anomaly, Angle.degrees(0.0)),
|
81
|
-
),
|
82
|
-
)
|
83
|
-
def test_static_constructors(
|
84
|
-
self, static_constructor, target, criteria, gravitational_parameter
|
85
|
-
):
|
86
|
-
assert static_constructor(criteria, target, gravitational_parameter) is not None
|
87
|
-
|
88
|
-
def test_evaluate(self, condition, state_vector, target):
|
89
|
-
assert condition.evaluate(state_vector, 0.0) == pytest.approx(
|
90
|
-
6904757.8910061345 - target, abs=1e-9
|
91
|
-
)
|
92
|
-
|
93
|
-
def test_string_from_element(self):
|
94
|
-
element_str = COECondition.string_from_element(COE.Element.SemiMajorAxis)
|
95
|
-
assert element_str == "Semi-major axis"
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# Apache License 2.0
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
from ostk.astrodynamics import EventCondition
|
6
|
-
from ostk.astrodynamics.event_condition import Conjunctive
|
7
|
-
|
8
|
-
|
9
|
-
@pytest.fixture
|
10
|
-
def first_condition() -> EventCondition:
|
11
|
-
class FirstCondition(EventCondition):
|
12
|
-
def evaluate(self, state_vector, time):
|
13
|
-
return state_vector[0]
|
14
|
-
|
15
|
-
return FirstCondition("First Condition", EventCondition.Criteria.PositiveCrossing)
|
16
|
-
|
17
|
-
|
18
|
-
@pytest.fixture
|
19
|
-
def second_condition() -> EventCondition:
|
20
|
-
class SecondCondition(EventCondition):
|
21
|
-
def evaluate(self, state_vector, time):
|
22
|
-
return state_vector[1] - 0.1
|
23
|
-
|
24
|
-
return SecondCondition("Second condition", EventCondition.Criteria.StrictlyNegative)
|
25
|
-
|
26
|
-
|
27
|
-
@pytest.fixture
|
28
|
-
def event_conditions(
|
29
|
-
first_condition: EventCondition, second_condition: EventCondition
|
30
|
-
) -> list[EventCondition]:
|
31
|
-
return [first_condition, second_condition]
|
32
|
-
|
33
|
-
|
34
|
-
@pytest.fixture
|
35
|
-
def conjunction_condition(event_conditions: list[EventCondition]) -> Conjunctive:
|
36
|
-
return Conjunctive(event_conditions)
|
37
|
-
|
38
|
-
|
39
|
-
class TestConjunctiveCondition:
|
40
|
-
def test_constructor(self, event_conditions: list[EventCondition]):
|
41
|
-
assert Conjunctive(event_conditions) is not None
|
42
|
-
|
43
|
-
def test_is_satisfied(self, conjunction_condition: Conjunctive):
|
44
|
-
# x0 crossing root (true), x1 negative (true)
|
45
|
-
assert (
|
46
|
-
conjunction_condition.is_satisfied([1.0, 0.0], 0.0, [-1.0, 3.0], 0.0) == True
|
47
|
-
)
|
48
|
-
|
49
|
-
# x0 crossing root (true), x1 positive (false)
|
50
|
-
assert (
|
51
|
-
conjunction_condition.is_satisfied([1.0, 1.0], 0.0, [-1.0, 3.0], 0.0) == False
|
52
|
-
)
|
53
|
-
|
54
|
-
# x0 not crossing root (false), x1 negative (true)
|
55
|
-
assert (
|
56
|
-
conjunction_condition.is_satisfied([-0.5, 1.0], 0.0, [-1.0, 3.0], 0.0)
|
57
|
-
== False
|
58
|
-
)
|
59
|
-
|
60
|
-
# x0 not crossing root (false), x1 positive (false)
|
61
|
-
assert (
|
62
|
-
conjunction_condition.is_satisfied([-0.5, 0.0], 0.0, [-1.0, 3.0], 0.0)
|
63
|
-
== False
|
64
|
-
)
|
@@ -1,63 +0,0 @@
|
|
1
|
-
# Apache License 2.0
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
from ostk.astrodynamics import EventCondition
|
6
|
-
from ostk.astrodynamics.event_condition import Disjunctive
|
7
|
-
|
8
|
-
|
9
|
-
@pytest.fixture
|
10
|
-
def first_condition() -> EventCondition:
|
11
|
-
class FirstCondition(EventCondition):
|
12
|
-
def evaluate(self, state_vector, time):
|
13
|
-
return state_vector[0]
|
14
|
-
|
15
|
-
return FirstCondition("First Condition", EventCondition.Criteria.PositiveCrossing)
|
16
|
-
|
17
|
-
|
18
|
-
@pytest.fixture
|
19
|
-
def second_condition() -> EventCondition:
|
20
|
-
class SecondCondition(EventCondition):
|
21
|
-
def evaluate(self, state_vector, time):
|
22
|
-
return state_vector[1] - 0.1
|
23
|
-
|
24
|
-
return SecondCondition("Second condition", EventCondition.Criteria.StrictlyNegative)
|
25
|
-
|
26
|
-
|
27
|
-
@pytest.fixture
|
28
|
-
def event_conditions(
|
29
|
-
first_condition: EventCondition, second_condition: EventCondition
|
30
|
-
) -> list[EventCondition]:
|
31
|
-
return [first_condition, second_condition]
|
32
|
-
|
33
|
-
|
34
|
-
@pytest.fixture
|
35
|
-
def disjunction_condition(event_conditions: list[EventCondition]) -> Disjunctive:
|
36
|
-
return Disjunctive(event_conditions)
|
37
|
-
|
38
|
-
|
39
|
-
class TestDisjunctiveCondition:
|
40
|
-
def test_constructor(self, event_conditions: list[EventCondition]):
|
41
|
-
assert Disjunctive(event_conditions) is not None
|
42
|
-
|
43
|
-
def test_is_satisfied(self, disjunction_condition: Disjunctive):
|
44
|
-
# x0 crossing root (true), x1 negative (true)
|
45
|
-
assert (
|
46
|
-
disjunction_condition.is_satisfied([1.0, 0.0], 0.0, [-1.0, 3.0], 0.0) == True
|
47
|
-
)
|
48
|
-
|
49
|
-
# x0 crossing root (true), x1 positive (false)
|
50
|
-
assert (
|
51
|
-
disjunction_condition.is_satisfied([1.0, 1.0], 0.0, [-1.0, 3.0], 0.0) == True
|
52
|
-
)
|
53
|
-
|
54
|
-
# x0 not crossing root (false), x1 negative (true)
|
55
|
-
assert (
|
56
|
-
disjunction_condition.is_satisfied([-0.5, 1.0], 0.0, [-1.0, 3.0], 0.0)
|
57
|
-
== False
|
58
|
-
)
|
59
|
-
|
60
|
-
# x0 not crossing root (false), x1 positive (false)
|
61
|
-
assert (
|
62
|
-
disjunction_condition.is_satisfied([-0.5, 0.0], 0.0, [-1.0, 3.0], 0.0) == True
|
63
|
-
)
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# Apache License 2.0
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
from ostk.physics.time import Duration
|
6
|
-
|
7
|
-
from ostk.astrodynamics import EventCondition
|
8
|
-
from ostk.astrodynamics.event_condition import DurationCondition
|
9
|
-
|
10
|
-
|
11
|
-
@pytest.fixture
|
12
|
-
def duration() -> Duration:
|
13
|
-
return Duration.seconds(5.0)
|
14
|
-
|
15
|
-
|
16
|
-
@pytest.fixture
|
17
|
-
def criteria() -> EventCondition.Criteria:
|
18
|
-
return EventCondition.Criteria.StrictlyPositive
|
19
|
-
|
20
|
-
|
21
|
-
@pytest.fixture
|
22
|
-
def duration_condition(
|
23
|
-
criteria: EventCondition.Criteria, duration: Duration
|
24
|
-
) -> DurationCondition:
|
25
|
-
return DurationCondition(criteria, duration)
|
26
|
-
|
27
|
-
|
28
|
-
class TestDurationCondition:
|
29
|
-
def test_get_duration(self, duration_condition: EventCondition, duration: Duration):
|
30
|
-
assert duration_condition.get_duration() == duration
|
31
|
-
|
32
|
-
def test_evaluate(self, duration_condition: EventCondition, duration: Duration):
|
33
|
-
time: float = 3.0
|
34
|
-
assert duration_condition.evaluate(state_vector=[], time=time) == (
|
35
|
-
time - duration.in_seconds()
|
36
|
-
)
|