open-space-toolkit-astrodynamics 2.3.0__py310-none-any.whl → 2.4.1__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: open-space-toolkit-astrodynamics
3
- Version: 2.3.0
3
+ Version: 2.4.1
4
4
  Summary: Orbit, attitude, access.
5
5
  Author: Open Space Collective
6
6
  Author-email: contact@open-space-collective.org
@@ -1,9 +1,9 @@
1
1
  ostk/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
2
- ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-310-x86_64-linux-gnu.so,sha256=y0rCCK_XdtLAISDIRWH8GbZggNqGtWfe9BJKm06YMZs,1410488
2
+ ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-310-x86_64-linux-gnu.so,sha256=qCSYF-ewvt5XbiNtkPqrxnJSTwoIHkVnfMeGlVenMX8,1410488
3
3
  ostk/astrodynamics/__init__.py,sha256=BE7yyrOnPqFCTPT3GhYEI4IWR5nzs96VSjKphhQ09ew,97
4
4
  ostk/astrodynamics/converters.py,sha256=sBZ3_JMjowWbQ9gBPA2cSEkbBfAwXmt1IBbLks76-Vk,3502
5
5
  ostk/astrodynamics/display.py,sha256=y9FnoQbPFGM6LzkUdgXgeqtuVGhv57GuTKbeDdcFPgw,6306
6
- ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.2,sha256=qzmqePuEfU8J_QV5BKrf88tkEku00y9itRWhXlpiR0g,68236840
6
+ ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.2,sha256=T_TuCtec8GdjMD4y6RUGDQwbF-YE-opFdCWDAajjo3o,69733560
7
7
  ostk/astrodynamics/utilities.py,sha256=NbeKN_CtcCRHIinhoNWTEosBMR7xc924S-ZFD97mduw,4478
8
8
  ostk/astrodynamics/viewer.py,sha256=_4uucNtZrIADtKtEYHbiu91RVVvKRG3vPULUAshPLJU,8912
9
9
  ostk/astrodynamics/test/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
@@ -38,7 +38,7 @@ ostk/astrodynamics/test/flight/system/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5n
38
38
  ostk/astrodynamics/test/flight/system/test_propulsion_system.py,sha256=ei-25MZczwzhiV5QVB9LXdmBY3VnBHr1DEVn_Zqtb1A,1027
39
39
  ostk/astrodynamics/test/flight/system/test_satellite_system.py,sha256=-5KOGVTWRIpY1jcRc0xGX6N9oRbUT_EexzB9jZFsZQg,2208
40
40
  ostk/astrodynamics/test/flight/system/dynamics/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
41
- ostk/astrodynamics/test/flight/system/dynamics/test_atmospheric_drag.py,sha256=Dnla3DkzQknZwul5hn0MqYGuKexUbG3AN5FByZaLgVc,4042
41
+ ostk/astrodynamics/test/flight/system/dynamics/test_atmospheric_drag.py,sha256=bTFDvI1riLFlgKzs3TRt8dafFtb--L_AMEDuuRWEgGc,3793
42
42
  ostk/astrodynamics/test/flight/system/dynamics/test_central_body_gravity.py,sha256=r3JIIX7cD63BhrgvLtjFaK7ew1BqHdKP5_VxwGmuv1Q,1818
43
43
  ostk/astrodynamics/test/flight/system/dynamics/test_dynamics.py,sha256=arNkAOj2y4CDmc9CXxItbFtC4QYjaByuJefdi5S6alw,914
44
44
  ostk/astrodynamics/test/flight/system/dynamics/test_position_derivative.py,sha256=ZVVewpqZwqiBLDqoNQDHDgDodtj6_M0J6ZmgHe_1gz8,1646
@@ -51,8 +51,8 @@ ostk/astrodynamics/test/trajectory/test_local_orbital_frame_direction.py,sha256=
51
51
  ostk/astrodynamics/test/trajectory/test_local_orbital_frame_factory.py,sha256=FziYh9XxD2FEuj6WhnqOe5mF9twLTQtvcem8KzQZKXg,1864
52
52
  ostk/astrodynamics/test/trajectory/test_model.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
53
53
  ostk/astrodynamics/test/trajectory/test_orbit.py,sha256=SlCBZ_broPaJ6L8khMuvbdPem9-zmqG6IZwxr9cECB4,3155
54
- ostk/astrodynamics/test/trajectory/test_propagator.py,sha256=087AXQSsG2yCCOUi2jcfAZCDWc4g-jkPXxc-qG5coS0,9966
55
- ostk/astrodynamics/test/trajectory/test_state.py,sha256=Ohjc_cQ28XoOtEY4mP-EuyrCKirRf0-RxJNzFVFqiJ4,3699
54
+ ostk/astrodynamics/test/trajectory/test_propagator.py,sha256=e_fmvvaoMhYs0ApqCgbzfBYrYPaGOIuzouo-6x2jbK4,12504
55
+ ostk/astrodynamics/test/trajectory/test_state.py,sha256=Kr4IbGBc1TNGdEOsXFLGSQGC9SwCER-lJ6E-xumqgN4,3829
56
56
  ostk/astrodynamics/test/trajectory/test_trajectory_segment.py,sha256=eOCI9GLcAnMrwXkdaHbd0thnyNDCyBgAemhuMO6B7xY,3863
57
57
  ostk/astrodynamics/test/trajectory/orbit/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
58
58
  ostk/astrodynamics/test/trajectory/orbit/test_model.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
@@ -76,8 +76,8 @@ ostk/astrodynamics/test/trajectory/state/test_coordinates_subset.py,sha256=eMmif
76
76
  ostk/astrodynamics/test/trajectory/state/test_numerical_solver.py,sha256=ZTWRSVFOJnjzQP7JDsHZxvZ4ldyDHmXTptG2csC7_ic,7480
77
77
  ostk/astrodynamics/test/trajectory/state/coordinates_subset/test_cartesian_position.py,sha256=V5d7UnV6KIJjJvh5R0i3imRfyN04JCDvCUsKdvfKmhE,2708
78
78
  ostk/astrodynamics/test/trajectory/state/coordinates_subset/test_cartesian_velocity.py,sha256=5a7yeOVt7gY4oQdINSElb_U2jznJmuWPrT_YJrI6KaM,3070
79
- open_space_toolkit_astrodynamics-2.3.0.dist-info/METADATA,sha256=mvgYHZGl8ZJIQLDvtsD1FxCFTmArDnmYqdliiacyS6s,1779
80
- open_space_toolkit_astrodynamics-2.3.0.dist-info/WHEEL,sha256=oaSFssuzKzruaIhyzhbDphpBmFeR9wv-Pmjc-TsXgB4,94
81
- open_space_toolkit_astrodynamics-2.3.0.dist-info/top_level.txt,sha256=zOR18699uDYnafgarhL8WU_LmTZY_5NVqutv-flp_x4,5
82
- open_space_toolkit_astrodynamics-2.3.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
83
- open_space_toolkit_astrodynamics-2.3.0.dist-info/RECORD,,
79
+ open_space_toolkit_astrodynamics-2.4.1.dist-info/METADATA,sha256=DAXVfJGTx8JV0XG2LD28nREtjAXnKGISMsDbD7P4HTY,1779
80
+ open_space_toolkit_astrodynamics-2.4.1.dist-info/WHEEL,sha256=oaSFssuzKzruaIhyzhbDphpBmFeR9wv-Pmjc-TsXgB4,94
81
+ open_space_toolkit_astrodynamics-2.4.1.dist-info/top_level.txt,sha256=zOR18699uDYnafgarhL8WU_LmTZY_5NVqutv-flp_x4,5
82
+ open_space_toolkit_astrodynamics-2.4.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
83
+ open_space_toolkit_astrodynamics-2.4.1.dist-info/RECORD,,
@@ -26,7 +26,11 @@ from ostk.astrodynamics.trajectory.state.coordinates_subset import CartesianVelo
26
26
  from ostk.astrodynamics.trajectory.state import CoordinatesBroker
27
27
 
28
28
  from ostk.astrodynamics.trajectory import State
29
- from ostk.astrodynamics.flight.system import SatelliteSystem
29
+ from ostk.astrodynamics.trajectory.state import CoordinatesSubset, CoordinatesBroker
30
+ from ostk.astrodynamics.trajectory.state.coordinates_subset import (
31
+ CartesianPosition,
32
+ CartesianVelocity,
33
+ )
30
34
  from ostk.astrodynamics.flight.system import Dynamics
31
35
  from ostk.astrodynamics.flight.system.dynamics import AtmosphericDrag
32
36
 
@@ -46,27 +50,18 @@ def dry_mass() -> float:
46
50
 
47
51
 
48
52
  @pytest.fixture
49
- def satellite_system(dry_mass: float) -> SatelliteSystem:
50
- mass = Mass(dry_mass, Mass.Unit.Kilogram)
51
- satellite_geometry = Composite(
52
- Cuboid(
53
- Point(0.0, 0.0, 0.0),
54
- [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]],
55
- [1.0, 0.0, 0.0],
56
- )
57
- )
58
- inertia_tensor = np.ndarray(shape=(3, 3))
59
- surface_area = 500.0
60
- drag_coefficient = 2.1
53
+ def surface_area() -> float:
54
+ return 500.0
61
55
 
62
- return SatelliteSystem(
63
- mass, satellite_geometry, inertia_tensor, surface_area, drag_coefficient
64
- )
56
+
57
+ @pytest.fixture
58
+ def drag_coefficient() -> float:
59
+ return 2.1
65
60
 
66
61
 
67
62
  @pytest.fixture
68
- def dynamics(earth: Earth, satellite_system: SatelliteSystem) -> AtmosphericDrag:
69
- return AtmosphericDrag(earth, satellite_system)
63
+ def dynamics(earth: Earth) -> AtmosphericDrag:
64
+ return AtmosphericDrag(earth)
70
65
 
71
66
 
72
67
  @pytest.fixture
@@ -76,6 +71,8 @@ def coordinates_broker() -> CoordinatesBroker:
76
71
  CartesianPosition.default(),
77
72
  CartesianVelocity.default(),
78
73
  CoordinatesSubset.mass(),
74
+ CoordinatesSubset.surface_area(),
75
+ CoordinatesSubset.drag_coefficient(),
79
76
  ]
80
77
  )
81
78
 
@@ -101,10 +98,15 @@ def state(
101
98
  position_coordinates: list,
102
99
  velocity_coordinates: list,
103
100
  dry_mass: float,
101
+ surface_area: float,
102
+ drag_coefficient: float,
104
103
  coordinates_broker: CoordinatesBroker,
105
104
  ) -> State:
106
- wet_mass = dry_mass + 10.0
107
- coordinates = position_coordinates + velocity_coordinates + [wet_mass]
105
+ coordinates = (
106
+ position_coordinates
107
+ + velocity_coordinates
108
+ + [dry_mass, surface_area, drag_coefficient]
109
+ )
108
110
  return State(instant, coordinates, Frame.GCRF(), coordinates_broker)
109
111
 
110
112
 
@@ -124,6 +126,3 @@ class TestAtmosphericDrag:
124
126
  )
125
127
 
126
128
  assert len(contribution) == 3
127
- assert contribution == pytest.approx(
128
- [0.0, -2.53370345e-05, 3.57473816e-12], abs=5e-11
129
- )
@@ -17,7 +17,10 @@ from ostk.physics.time import Duration
17
17
  from ostk.physics.coordinate import Position
18
18
  from ostk.physics.coordinate import Velocity
19
19
  from ostk.physics.coordinate import Frame
20
- from ostk.physics.environment.objects.celestial_bodies import Earth
20
+ from ostk.physics.environment.objects.celestial_bodies import Earth, Sun
21
+ from ostk.physics.environment.gravitational import Earth as EarthGravitationalModel
22
+ from ostk.physics.environment.magnetic import Earth as EarthMagneticModel
23
+ from ostk.physics.environment.atmospheric import Earth as EarthAtmosphericModel
21
24
 
22
25
  from ostk.astrodynamics.trajectory import LocalOrbitalFrameFactory
23
26
  from ostk.astrodynamics.trajectory import LocalOrbitalFrameDirection
@@ -34,7 +37,13 @@ from ostk.astrodynamics.flight.system import Dynamics
34
37
  from ostk.astrodynamics.flight.system.dynamics import CentralBodyGravity
35
38
  from ostk.astrodynamics.flight.system.dynamics.thruster import ConstantThrust
36
39
  from ostk.astrodynamics.flight.system.dynamics import PositionDerivative
40
+ from ostk.astrodynamics.flight.system.dynamics import AtmosphericDrag
37
41
  from ostk.astrodynamics.trajectory import State
42
+ from ostk.astrodynamics.trajectory.state import CoordinatesSubset, CoordinatesBroker
43
+ from ostk.astrodynamics.trajectory.state.coordinates_subset import (
44
+ CartesianPosition,
45
+ CartesianVelocity,
46
+ )
38
47
  from ostk.astrodynamics.trajectory import Propagator
39
48
 
40
49
  from ostk.astrodynamics.event_condition import InstantCondition
@@ -73,17 +82,30 @@ def satellite_system(propulsion_system: PropulsionSystem) -> SatelliteSystem:
73
82
 
74
83
 
75
84
  @pytest.fixture
76
- def environment() -> Environment:
77
- return Environment.default()
85
+ def earth() -> Earth:
86
+ return Earth.from_models(
87
+ EarthGravitationalModel(EarthGravitationalModel.Type.EGM96),
88
+ EarthMagneticModel(EarthMagneticModel.Type.Undefined),
89
+ EarthAtmosphericModel(EarthAtmosphericModel.Type.Exponential),
90
+ )
91
+
92
+
93
+ @pytest.fixture
94
+ def environment(earth) -> Environment:
95
+ sun = Sun.default()
96
+
97
+ return Environment(Instant.J2000(), [earth, sun])
78
98
 
79
99
 
80
100
  @pytest.fixture
81
- def coordinates_broker() -> CoordinatesBroker:
101
+ def coordinates_broker():
82
102
  return CoordinatesBroker(
83
103
  [
84
104
  CartesianPosition.default(),
85
105
  CartesianVelocity.default(),
86
106
  CoordinatesSubset.mass(),
107
+ CoordinatesSubset.surface_area(),
108
+ CoordinatesSubset.drag_coefficient(),
87
109
  ]
88
110
  )
89
111
 
@@ -93,7 +115,9 @@ def state(
93
115
  satellite_system: SatelliteSystem, coordinates_broker: CoordinatesBroker
94
116
  ) -> State:
95
117
  instant: Instant = Instant.date_time(DateTime(2018, 1, 1, 0, 0, 0), Scale.UTC)
118
+
96
119
  propellant_mass: float = 10.0
120
+
97
121
  coordinates: list = [
98
122
  7500000.0,
99
123
  0.0,
@@ -107,11 +131,41 @@ def state(
107
131
  return State(instant, coordinates, Frame.GCRF(), coordinates_broker)
108
132
 
109
133
 
134
+ @pytest.fixture
135
+ def state_low_altitude(
136
+ satellite_system: SatelliteSystem, coordinates_broker: CoordinatesBroker
137
+ ) -> State:
138
+ instant: Instant = Instant.date_time(DateTime(2018, 1, 1, 0, 0, 0), Scale.UTC)
139
+
140
+ propellant_mass: float = 10.0
141
+ area: float = satellite_system.get_cross_sectional_surface_area()
142
+ cd: float = satellite_system.get_drag_coefficient()
143
+
144
+ coordinates: list = [
145
+ 7000000.0,
146
+ 0.0,
147
+ 0.0,
148
+ 0.0,
149
+ 5335.865450622126,
150
+ 5335.865450622126,
151
+ satellite_system.get_mass().in_kilograms() + propellant_mass,
152
+ area,
153
+ cd,
154
+ ]
155
+
156
+ return State(instant, coordinates, Frame.GCRF(), coordinates_broker)
157
+
158
+
110
159
  @pytest.fixture
111
160
  def central_body_gravity() -> CentralBodyGravity:
112
161
  return CentralBodyGravity(Earth.WGS84(20, 0))
113
162
 
114
163
 
164
+ @pytest.fixture
165
+ def atmospheric_drag(environment, satellite_system) -> AtmosphericDrag:
166
+ return AtmosphericDrag(environment.access_celestial_object_with_name("Earth"))
167
+
168
+
115
169
  @pytest.fixture
116
170
  def position_derivative() -> PositionDerivative:
117
171
  return PositionDerivative()
@@ -135,7 +189,8 @@ def constant_thrust(
135
189
 
136
190
  @pytest.fixture
137
191
  def dynamics(
138
- position_derivative: PositionDerivative, central_body_gravity: CentralBodyGravity
192
+ position_derivative: PositionDerivative,
193
+ central_body_gravity: CentralBodyGravity,
139
194
  ) -> list:
140
195
  return [position_derivative, central_body_gravity]
141
196
 
@@ -273,6 +328,26 @@ class TestPropagator:
273
328
  instant_array.reverse()
274
329
  propagator.calculate_states_at(state, instant_array)
275
330
 
331
+ def test_calculate_states_at_with_drag(
332
+ self,
333
+ numerical_solver: NumericalSolver,
334
+ dynamics: list[Dynamics],
335
+ atmospheric_drag: AtmosphericDrag,
336
+ state_low_altitude: State,
337
+ ):
338
+ propagator: Propagator = Propagator(
339
+ numerical_solver, dynamics + [atmospheric_drag]
340
+ )
341
+
342
+ instant_array = [
343
+ Instant.date_time(DateTime(2018, 1, 1, 0, 10, 0), Scale.UTC),
344
+ Instant.date_time(DateTime(2018, 1, 1, 0, 20, 0), Scale.UTC),
345
+ Instant.date_time(DateTime(2018, 1, 1, 0, 30, 0), Scale.UTC),
346
+ Instant.date_time(DateTime(2018, 1, 1, 0, 40, 0), Scale.UTC),
347
+ ]
348
+
349
+ _ = propagator.calculate_states_at(state_low_altitude, instant_array)
350
+
276
351
  def test_calculate_states_at_with_thrust(
277
352
  self,
278
353
  numerical_solver: NumericalSolver,
@@ -102,6 +102,7 @@ class TestState:
102
102
  position: Position,
103
103
  velocity: Velocity,
104
104
  frame: Frame,
105
+ coordinates_broker: CoordinatesBroker,
105
106
  ):
106
107
  assert state.get_instant() == instant
107
108
  assert state.get_position() == position
@@ -111,6 +112,7 @@ class TestState:
111
112
  state.get_coordinates()
112
113
  == np.append(position.get_coordinates(), velocity.get_coordinates())
113
114
  ).all()
115
+ assert state.get_coordinates_subsets() == coordinates_broker.get_subsets()
114
116
 
115
117
  def test_in_frame(
116
118
  self,