open-space-toolkit-astrodynamics 16.2.0__py313-none-manylinux2014_aarch64.whl → 16.4.0__py313-none-manylinux2014_aarch64.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.
Files changed (21) hide show
  1. {open_space_toolkit_astrodynamics-16.2.0.dist-info → open_space_toolkit_astrodynamics-16.4.0.dist-info}/METADATA +1 -1
  2. {open_space_toolkit_astrodynamics-16.2.0.dist-info → open_space_toolkit_astrodynamics-16.4.0.dist-info}/RECORD +21 -16
  3. ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-313-aarch64-linux-gnu.so +0 -0
  4. ostk/astrodynamics/__init__.pyi +4 -4
  5. ostk/astrodynamics/flight/__init__.pyi +18 -9
  6. ostk/astrodynamics/flight/profile/model.pyi +19 -0
  7. ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.16 +0 -0
  8. ostk/astrodynamics/test/flight/profile/model/test_tabulated_profile.py +115 -0
  9. ostk/astrodynamics/test/flight/test_profile.py +4 -0
  10. ostk/astrodynamics/test/test_display.py +0 -2
  11. ostk/astrodynamics/test/test_trajectory.py +28 -7
  12. ostk/astrodynamics/test/test_viewer.py +56 -0
  13. ostk/astrodynamics/test/trajectory/model/test_nadir_trajectory.py +87 -0
  14. ostk/astrodynamics/test/trajectory/model/test_tabulated_trajectory.py +303 -0
  15. ostk/astrodynamics/test/trajectory/model/test_target_scan_trajectory.py +126 -0
  16. ostk/astrodynamics/trajectory/__init__.pyi +10 -9
  17. ostk/astrodynamics/trajectory/model.pyi +259 -0
  18. ostk/astrodynamics/viewer.py +316 -14
  19. {open_space_toolkit_astrodynamics-16.2.0.dist-info → open_space_toolkit_astrodynamics-16.4.0.dist-info}/WHEEL +0 -0
  20. {open_space_toolkit_astrodynamics-16.2.0.dist-info → open_space_toolkit_astrodynamics-16.4.0.dist-info}/top_level.txt +0 -0
  21. {open_space_toolkit_astrodynamics-16.2.0.dist-info → open_space_toolkit_astrodynamics-16.4.0.dist-info}/zip-safe +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: open-space-toolkit-astrodynamics
3
- Version: 16.2.0
3
+ Version: 16.4.0
4
4
  Summary: Orbit, attitude, access.
5
5
  Author: Open Space Collective
6
6
  Author-email: contact@open-space-collective.org
@@ -1,7 +1,7 @@
1
1
  ostk/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
2
- ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-313-aarch64-linux-gnu.so,sha256=L2m7GBL269mB3C0WzpFN8I0FIauSf7CxzyDPjiy2chQ,2554056
2
+ ostk/astrodynamics/OpenSpaceToolkitAstrodynamicsPy.cpython-313-aarch64-linux-gnu.so,sha256=XQqQd53--_BbDnFDA8GmFp0m-1Y_e65pCLwkaJH7Kn0,2599232
3
3
  ostk/astrodynamics/__init__.py,sha256=3gWyqFIbhAfcdeMhmfBPQPlPQTmaOzm-6flkJe745Zk,251
4
- ostk/astrodynamics/__init__.pyi,sha256=JOxzCji3EPZHzNUnumhtXGlH4V24Dvjq0_JiTo9_zZk,32193
4
+ ostk/astrodynamics/__init__.pyi,sha256=VwymtmEM-WcRIds_fQS0z5BStoTfJ-IrR-7SuoSF_dY,32191
5
5
  ostk/astrodynamics/access.pyi,sha256=t2CF0TU6_6ow_rkV_I4rVKap7ZIdC4jYKL3WkTDHRXg,25157
6
6
  ostk/astrodynamics/converters.py,sha256=luPh30qMp9bzEkN7hUccmxlLf7zRp_AzqmBe8IUjPhU,3314
7
7
  ostk/astrodynamics/converters.pyi,sha256=tTUT0xGbiUkKxUj79Hq5EEtxV3b2uR6Wsnj_vwyj-mk,1625
@@ -11,19 +11,19 @@ ostk/astrodynamics/dynamics.pyi,sha256=gZ95KoGex4SB-1z6yMrngkZN1Ir9X6bEmrZgdLxq1
11
11
  ostk/astrodynamics/estimator.pyi,sha256=MnahWzp8aACxrNKWlYRsgQr5zpBxogNr-yPm7hJob5k,14000
12
12
  ostk/astrodynamics/event_condition.pyi,sha256=2c_1Sq7tkYKeAA_aRWBi43KDQXXxu6EMSmUpEWz_Fa4,45814
13
13
  ostk/astrodynamics/guidance_law.pyi,sha256=rVmbpV2Y5FsIXejaInxINS67nVHmTIxVEkhaDIn17SA,12171
14
- ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.16,sha256=YbA-2rOC-u6uHd51oPuZF3Aj03UAoJD8UDP6cFCmncQ,3853728
14
+ ostk/astrodynamics/libopen-space-toolkit-astrodynamics.so.16,sha256=MEfhg-xZLWaMKrzjgnS3iA69EmTF4qfiH42uv0G_954,3930832
15
15
  ostk/astrodynamics/solver.pyi,sha256=sPqyYPXBfFGC24dzzYyFyt01VfMAlWQ5_gh_RpeaBFk,17734
16
16
  ostk/astrodynamics/utilities.py,sha256=y8mr3M46J5z-GhS1oIEnuEJA6otwcyJ9YDhvn_5JxHM,6976
17
- ostk/astrodynamics/viewer.py,sha256=PLznIOEArRlx-pfMHpGoszNRf2F8mf2SHe8CGvZrVnw,16740
17
+ ostk/astrodynamics/viewer.py,sha256=SlKyOWKjaF3V9HFB3I7ZgHy7n_GLeHTWM9q2wXkpxe8,27077
18
18
  ostk/astrodynamics/conjunction/__init__.pyi,sha256=HFvWl8bCmrq3cBkUh5X5RGIh8webmVGxaZdpsz3WN-E,79
19
19
  ostk/astrodynamics/conjunction/message/__init__.pyi,sha256=5H__sg_QUx7ybf9jtVWvXzrUHeK3ECotfhddAdHjJUc,75
20
20
  ostk/astrodynamics/conjunction/message/ccsds.pyi,sha256=1Peto19hRqlD7KHf1cyLP3CT4OAKzwtemqvO6_4FZ0g,28162
21
21
  ostk/astrodynamics/data/__init__.pyi,sha256=4l_mfVbnU_L7wImwgTCe8fVI81gK_tUmd0z7BY9lLi8,81
22
22
  ostk/astrodynamics/data/provider.pyi,sha256=O4Lg9FBq9itufgATnic5SMg90pn8vJJJMUdNcWP72NI,1492
23
- ostk/astrodynamics/flight/__init__.pyi,sha256=JEMXdq_Fkfc2GGMFZL3pta-Juu5sj9v5t3A_Tdc9SW8,22248
23
+ ostk/astrodynamics/flight/__init__.pyi,sha256=f7hDDcisAtBE86w5s0d0M2N_m3Rjlh2pWGWFTdnoaGw,23058
24
24
  ostk/astrodynamics/flight/system.pyi,sha256=WVxy6Oe4q3C81c0AOxSwAmnwUHcpXO7JCEvESjs2g4A,10508
25
25
  ostk/astrodynamics/flight/profile/__init__.pyi,sha256=WBTG17V59UwD-X1r6TOrXT_rA3WjKY-2ML1cWfji_4g,3688
26
- ostk/astrodynamics/flight/profile/model.pyi,sha256=g5Uy2ZLxImuETrMP4jqXr5FXl2dGAoKuNgzOH07EdBo,6807
26
+ ostk/astrodynamics/flight/profile/model.pyi,sha256=wwnVaTjTytxPqKyNo1tpdZRedabQlIHgyxfT0nivO5M,7777
27
27
  ostk/astrodynamics/pytrajectory/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
28
28
  ostk/astrodynamics/pytrajectory/__init__.pyi,sha256=QWrGyQNiICBEI3pKku2wJYdu-SQCBKXjJ_93XTEgkP8,79
29
29
  ostk/astrodynamics/pytrajectory/pystate.py,sha256=HbWtj1_FXGXTuvSu52ewMaO3ahwLBLStyJ4e5xqL-jw,8415
@@ -33,13 +33,13 @@ ostk/astrodynamics/test/conftest.py,sha256=stmQOt7UXjBlXKJzNN6RkS2miv1xXSOX-YNpF
33
33
  ostk/astrodynamics/test/test_access.py,sha256=MCBsUPtuVm7NgHZR0z0DpWnPZ_qBu4aRhLI2PnRNUYs,3940
34
34
  ostk/astrodynamics/test/test_converters.py,sha256=mFpDD0YM8o356lj91GGIwYdMk2ut6xZFV3uYcgZepMY,8744
35
35
  ostk/astrodynamics/test/test_dataframe.py,sha256=NddmwnV8R1QgTD_iLXn_h0xK2kP5Qk22Oh93hF6KjT0,38300
36
- ostk/astrodynamics/test/test_display.py,sha256=6giw_i08YMOSRgqNpdVWtzDu6fFalEVKz_Uisu3N_X8,3870
36
+ ostk/astrodynamics/test/test_display.py,sha256=CQEz66OZna6W8_ZIEVCPKAH-cM9YjzCOGpoINqC8m40,3840
37
37
  ostk/astrodynamics/test/test_event_condition.py,sha256=fQ-rVYpQsa7xacxRMBOQDyn61CuAGX1QBOGZxGWR0_s,2204
38
38
  ostk/astrodynamics/test/test_import.py,sha256=py_hALBR0IYuUzv9dfgQZzrrLHJIpnyKvt3Oi1XBqCg,1251
39
39
  ostk/astrodynamics/test/test_root_solver.py,sha256=hQ8O6g-WP49gZH_H3Rdufv0F0gQorpzJyIcjBGGUQ34,1831
40
- ostk/astrodynamics/test/test_trajectory.py,sha256=GzH7RNRiL088nFeeMm1lhpG4-HEFz15cnWcbD-8VAow,3933
40
+ ostk/astrodynamics/test/test_trajectory.py,sha256=8J9NAAn5s2SvaIScUoM7GtStI7-4-xffrBwg4ph7Ppw,4096
41
41
  ostk/astrodynamics/test/test_utilities.py,sha256=NNIyzqOxMdsNpK2z0wU0utX06iZNfbMJDE36Upard28,3048
42
- ostk/astrodynamics/test/test_viewer.py,sha256=kDstRH_WKufN_0JPSXttzLMk3Afv_ylcEBfHxc35yrA,8946
42
+ ostk/astrodynamics/test/test_viewer.py,sha256=6IxHjSrwnLkmLiTTzRcnwAdEeWdIF_b2Kjz5iCqwctw,10912
43
43
  ostk/astrodynamics/test/access/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
44
44
  ostk/astrodynamics/test/access/test_generator.py,sha256=i7TnM80kF0Q_9KmyoqKt5n1ufg3ZjAIEMPVVds8ZDdI,10315
45
45
  ostk/astrodynamics/test/access/test_visibility_criterion.py,sha256=VA6WDQTj3q-f2YGIIkrrNp8G23Nf_0g9nKmfZAgAlWQ,6568
@@ -69,8 +69,9 @@ ostk/astrodynamics/test/event_condition/test_logical_condition.py,sha256=09h5TYW
69
69
  ostk/astrodynamics/test/event_condition/test_real_condition.py,sha256=tle6HVzMFMIIkfRY7CuaA0mPtw3riJBG_JQkc1L0dpk,1374
70
70
  ostk/astrodynamics/test/flight/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
71
71
  ostk/astrodynamics/test/flight/test_maneuver.py,sha256=HonAvD9qtax72lizoDLR6ELI-poC3LWk_umg-WYygYA,5388
72
- ostk/astrodynamics/test/flight/test_profile.py,sha256=ialv-BdeGq9WX_G8l9sva-C0TXfenA8ZOXEA_aiVtuA,8051
72
+ ostk/astrodynamics/test/flight/test_profile.py,sha256=lfTGy9l2rAhHsmLZCdE-kzy-s_-EgXIZwfGs_7f8UPo,8205
73
73
  ostk/astrodynamics/test/flight/test_system.py,sha256=5kJCULHdpkwAC7i6xLV7vdJnGfOdrOuhi0G22p_L160,1224
74
+ ostk/astrodynamics/test/flight/profile/model/test_tabulated_profile.py,sha256=NZVa9dXzp4UDmohAlBaYeY594CPbqIv5j3VSEzlbYHk,3168
74
75
  ostk/astrodynamics/test/flight/system/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
75
76
  ostk/astrodynamics/test/flight/system/test_propulsion_system.py,sha256=SoxOt-fjHvs_86f6Xb3jAsHDOShJ6Puz7eO5wrqibaM,1835
76
77
  ostk/astrodynamics/test/flight/system/test_satellite_system.py,sha256=dCFcl2RKiLxDKLI0sytPBXr3vHOFQIVNNCzpw5WzlAA,2437
@@ -91,6 +92,9 @@ ostk/astrodynamics/test/trajectory/test_segment.py,sha256=aXdF5CpNLwN_hKRU5sG3ID
91
92
  ostk/astrodynamics/test/trajectory/test_sequence.py,sha256=4piYpMZ9C_eCXxaOcdz2We67wZxhsNBnETgKwvq6dl0,15083
92
93
  ostk/astrodynamics/test/trajectory/test_state.py,sha256=JO-SnUCRZ6sfVNwB5soT5c1f8c5DXuFN5lHZkiiTcYc,18119
93
94
  ostk/astrodynamics/test/trajectory/test_state_builder.py,sha256=LpCCYdCaLu_D2npm9wgA2sMlcekrtbRqP-afe5IE5L4,4871
95
+ ostk/astrodynamics/test/trajectory/model/test_nadir_trajectory.py,sha256=AzXLO7qqcGnN7Pu7T_ue16wGcLodj9aH-xsZnk5KRMM,2219
96
+ ostk/astrodynamics/test/trajectory/model/test_tabulated_trajectory.py,sha256=zbjI5mFkJOgyO_e8i0-RN1jhq2nIOs0dAJbkrP9nTYI,8405
97
+ ostk/astrodynamics/test/trajectory/model/test_target_scan_trajectory.py,sha256=zSIkTP1sggEU58obPjbtdhO5xnWUJQ2XNkK_zUP6jdY,3253
94
98
  ostk/astrodynamics/test/trajectory/orbit/__init__.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
95
99
  ostk/astrodynamics/test/trajectory/orbit/test_model.py,sha256=epnVn2PwdQkUDZ1msqBRO5nEZIOUBIq-IfK3IlNPijE,21
96
100
  ostk/astrodynamics/test/trajectory/orbit/test_pass.py,sha256=LTHDGW26I0kujifCXFMcUFu9yaHMeUoIM-7jt6kJkJU,2492
@@ -119,7 +123,8 @@ ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_attitude_quatern
119
123
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_cartesian_acceleration.py,sha256=1p37_FYN85d9SrOqO3iCkNecovJJayhnFeZ4QCOw2ao,3528
120
124
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_cartesian_position.py,sha256=XvHdk1KjacTwtkgx2jUAc9I9N3nvjPDv03FAanpv8jQ,2702
121
125
  ostk/astrodynamics/test/trajectory/state/coordinate_subset/test_cartesian_velocity.py,sha256=-kd5TZO5TICihbkqDTew2i_tDpggdpe3Yf23046FATM,3057
122
- ostk/astrodynamics/trajectory/__init__.pyi,sha256=kfU5uVj2heXIoKeRionY6ZC-Vgo4d6BMruU_NoBypfU,76110
126
+ ostk/astrodynamics/trajectory/__init__.pyi,sha256=O-hq2r271NJq8Djm4utNtCdGgPJyVd3brFMpu_KUQkg,76275
127
+ ostk/astrodynamics/trajectory/model.pyi,sha256=SIneZx3pQ6XAo6iBccr4B1OsATbs1PEsCngtaTvja00,10473
123
128
  ostk/astrodynamics/trajectory/orbit/__init__.pyi,sha256=wbuRK7Yp_NYBr3ta5-NpnJYMX4baUl7yIlUWhaRlR4o,12899
124
129
  ostk/astrodynamics/trajectory/orbit/message/__init__.pyi,sha256=-GNBlYPrsjelhKxWorYQYhIWzFsibiIQNZvMXjhRpfM,77
125
130
  ostk/astrodynamics/trajectory/orbit/message/spacex.pyi,sha256=fnUVJGWlSPo8AmLVuu08LubsAuVGo-gFaT86yd4f4CI,10558
@@ -129,8 +134,8 @@ ostk/astrodynamics/trajectory/orbit/model/kepler.pyi,sha256=OZMznHuU7e6m1rfqtOgX
129
134
  ostk/astrodynamics/trajectory/orbit/model/sgp4.pyi,sha256=OhFzoPPQHlYy7m3LiZ8TXF89M4uBTfNk6tGsBEp0sjI,14235
130
135
  ostk/astrodynamics/trajectory/state/__init__.pyi,sha256=bq__Fii35czVrTeNxc9eQVjXdqwbbQxUdNQWK3vLrMo,17649
131
136
  ostk/astrodynamics/trajectory/state/coordinate_subset.pyi,sha256=kYMfMwEjCqO1NepMYFT4QS6kIPBkVL6sGCLeLbogcMw,10176
132
- open_space_toolkit_astrodynamics-16.2.0.dist-info/METADATA,sha256=Xna6Sf7jCN-myVL7NvFMecPLgJTxbg5Akf9wfjZyyhI,1913
133
- open_space_toolkit_astrodynamics-16.2.0.dist-info/WHEEL,sha256=SoYeZtqoiLCL_G4rzH07IDMwRvSqG334rWZuI48h-Rk,111
134
- open_space_toolkit_astrodynamics-16.2.0.dist-info/top_level.txt,sha256=zOR18699uDYnafgarhL8WU_LmTZY_5NVqutv-flp_x4,5
135
- open_space_toolkit_astrodynamics-16.2.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
136
- open_space_toolkit_astrodynamics-16.2.0.dist-info/RECORD,,
137
+ open_space_toolkit_astrodynamics-16.4.0.dist-info/METADATA,sha256=hmk7loB1mnnlXQ39BmWfd3MqBhiTKzoK0D1jIkGlVfk,1913
138
+ open_space_toolkit_astrodynamics-16.4.0.dist-info/WHEEL,sha256=SoYeZtqoiLCL_G4rzH07IDMwRvSqG334rWZuI48h-Rk,111
139
+ open_space_toolkit_astrodynamics-16.4.0.dist-info/top_level.txt,sha256=zOR18699uDYnafgarhL8WU_LmTZY_5NVqutv-flp_x4,5
140
+ open_space_toolkit_astrodynamics-16.4.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
141
+ open_space_toolkit_astrodynamics-16.4.0.dist-info/RECORD,,
@@ -14,18 +14,18 @@ from ostk import mathematics as OpenSpaceToolkitMathematicsPy
14
14
  from ostk.mathematics import curve_fitting
15
15
  from ostk.mathematics import geometry
16
16
  from ostk.mathematics import object
17
- import ostk.physics
18
17
  from ostk import physics as OpenSpaceToolkitPhysicsPy
18
+ import ostk.physics
19
19
  from ostk.physics import Environment
20
20
  from ostk.physics import Manager
21
21
  from ostk.physics import Unit
22
- from ostk.physics import coordinate
23
22
  import ostk.physics.coordinate
23
+ from ostk.physics import coordinate
24
24
  import ostk.physics.coordinate.spherical
25
25
  from ostk.physics import environment
26
26
  import ostk.physics.environment.object
27
- from ostk.physics import time
28
27
  import ostk.physics.time
28
+ from ostk.physics import time
29
29
  from ostk.physics import unit
30
30
  import ostk.physics.unit
31
31
  import typing
@@ -682,7 +682,7 @@ class Trajectory:
682
682
  celestial_object (Celestial): The celestial object. Defaults to Earth.WGS84().
683
683
 
684
684
  Returns:
685
- Trajectory: The `Trajectory` object representing the ground strip.
685
+ Trajectory: The `Trajectory` object representing the ground strip.
686
686
  """
687
687
  @staticmethod
688
688
  def position(position: ostk.physics.coordinate.Position) -> Trajectory:
@@ -252,12 +252,14 @@ class Profile:
252
252
 
253
253
  GeodeticNadir : Geodetic nadir
254
254
 
255
- Trajectory : Trajectory
255
+ Trajectory : Deprecated - Use TargetPosition instead.
256
256
 
257
257
  TargetPosition : Target position
258
258
 
259
259
  TargetVelocity : Target velocity
260
260
 
261
+ TargetSlidingGroundVelocity : Target sliding ground velocity
262
+
261
263
  Sun : Sun
262
264
 
263
265
  Moon : Moon
@@ -272,16 +274,17 @@ class Profile:
272
274
  """
273
275
  GeocentricNadir: typing.ClassVar[Profile.TargetType] # value = <TargetType.GeocentricNadir: 0>
274
276
  GeodeticNadir: typing.ClassVar[Profile.TargetType] # value = <TargetType.GeodeticNadir: 1>
275
- Moon: typing.ClassVar[Profile.TargetType] # value = <TargetType.Moon: 6>
276
- OrbitalMomentum: typing.ClassVar[Profile.TargetType] # value = <TargetType.OrbitalMomentum: 9>
277
- OrientationProfile: typing.ClassVar[Profile.TargetType] # value = <TargetType.OrientationProfile: 10>
278
- Sun: typing.ClassVar[Profile.TargetType] # value = <TargetType.Sun: 5>
277
+ Moon: typing.ClassVar[Profile.TargetType] # value = <TargetType.Moon: 7>
278
+ OrbitalMomentum: typing.ClassVar[Profile.TargetType] # value = <TargetType.OrbitalMomentum: 10>
279
+ OrientationProfile: typing.ClassVar[Profile.TargetType] # value = <TargetType.OrientationProfile: 11>
280
+ Sun: typing.ClassVar[Profile.TargetType] # value = <TargetType.Sun: 6>
279
281
  TargetPosition: typing.ClassVar[Profile.TargetType] # value = <TargetType.TargetPosition: 3>
282
+ TargetSlidingGroundVelocity: typing.ClassVar[Profile.TargetType] # value = <TargetType.TargetSlidingGroundVelocity: 5>
280
283
  TargetVelocity: typing.ClassVar[Profile.TargetType] # value = <TargetType.TargetVelocity: 4>
281
284
  Trajectory: typing.ClassVar[Profile.TargetType] # value = <TargetType.Trajectory: 2>
282
- VelocityECEF: typing.ClassVar[Profile.TargetType] # value = <TargetType.VelocityECEF: 8>
283
- VelocityECI: typing.ClassVar[Profile.TargetType] # value = <TargetType.VelocityECI: 7>
284
- __members__: typing.ClassVar[dict[str, Profile.TargetType]] # value = {'GeocentricNadir': <TargetType.GeocentricNadir: 0>, 'GeodeticNadir': <TargetType.GeodeticNadir: 1>, 'Trajectory': <TargetType.Trajectory: 2>, 'TargetPosition': <TargetType.TargetPosition: 3>, 'TargetVelocity': <TargetType.TargetVelocity: 4>, 'Sun': <TargetType.Sun: 5>, 'Moon': <TargetType.Moon: 6>, 'VelocityECI': <TargetType.VelocityECI: 7>, 'VelocityECEF': <TargetType.VelocityECEF: 8>, 'OrbitalMomentum': <TargetType.OrbitalMomentum: 9>, 'OrientationProfile': <TargetType.OrientationProfile: 10>}
285
+ VelocityECEF: typing.ClassVar[Profile.TargetType] # value = <TargetType.VelocityECEF: 9>
286
+ VelocityECI: typing.ClassVar[Profile.TargetType] # value = <TargetType.VelocityECI: 8>
287
+ __members__: typing.ClassVar[dict[str, Profile.TargetType]] # value = {'GeocentricNadir': <TargetType.GeocentricNadir: 0>, 'GeodeticNadir': <TargetType.GeodeticNadir: 1>, 'Trajectory': <TargetType.Trajectory: 2>, 'TargetPosition': <TargetType.TargetPosition: 3>, 'TargetVelocity': <TargetType.TargetVelocity: 4>, 'TargetSlidingGroundVelocity': <TargetType.TargetSlidingGroundVelocity: 5>, 'Sun': <TargetType.Sun: 6>, 'Moon': <TargetType.Moon: 7>, 'VelocityECI': <TargetType.VelocityECI: 8>, 'VelocityECEF': <TargetType.VelocityECEF: 9>, 'OrbitalMomentum': <TargetType.OrbitalMomentum: 10>, 'OrientationProfile': <TargetType.OrientationProfile: 11>}
285
288
  def __eq__(self, other: typing.Any) -> bool:
286
289
  ...
287
290
  def __getstate__(self) -> int:
@@ -321,9 +324,15 @@ class Profile:
321
324
  Create a target, which produces a vector pointing from the observer to the target position.
322
325
  """
323
326
  @staticmethod
327
+ def target_sliding_ground_velocity(trajectory: ostk.astrodynamics.Trajectory, axis: Profile.Axis, anti_direction: bool = False) -> Profile.TrajectoryTarget:
328
+ """
329
+ Create a target, which produces a vector pointing along the ground velocity vector (aka the scan direction of the point sliding across the ground).
330
+ This will compensate for the rotation of the referenced celestial body.
331
+ """
332
+ @staticmethod
324
333
  def target_velocity(trajectory: ostk.astrodynamics.Trajectory, axis: Profile.Axis, anti_direction: bool = False) -> Profile.TrajectoryTarget:
325
334
  """
326
- Create a target, which produces a vector pointing along the target velocity.
335
+ Create a target, which produces a vector pointing along the scan direction.
327
336
  """
328
337
  def __init__(self, trajectory: ostk.astrodynamics.Trajectory, axis: Profile.Axis, anti_direction: bool = False) -> None:
329
338
  """
@@ -3,10 +3,12 @@ import ostk.astrodynamics
3
3
  import ostk.astrodynamics.flight.profile
4
4
  import ostk.astrodynamics.trajectory
5
5
  import ostk.core.type
6
+ import ostk.mathematics.curve_fitting
6
7
  import ostk.mathematics.geometry.d3.transformation.rotation
7
8
  import ostk.physics.coordinate
8
9
  import ostk.physics.coordinate.frame.provider
9
10
  import ostk.physics.time
11
+ import typing
10
12
  __all__ = ['Tabulated', 'Transform']
11
13
  class Tabulated(ostk.astrodynamics.flight.profile.Model):
12
14
  """
@@ -15,6 +17,7 @@ class Tabulated(ostk.astrodynamics.flight.profile.Model):
15
17
 
16
18
 
17
19
  """
20
+ @typing.overload
18
21
  def __init__(self, states: list[ostk.astrodynamics.trajectory.State]) -> None:
19
22
  """
20
23
  Constructor.
@@ -22,6 +25,15 @@ class Tabulated(ostk.astrodynamics.flight.profile.Model):
22
25
  Args:
23
26
  states (Array[State]): The states of the model.
24
27
  """
28
+ @typing.overload
29
+ def __init__(self, states: list[ostk.astrodynamics.trajectory.State], interpolator_type: ostk.mathematics.curve_fitting.Interpolator.Type) -> None:
30
+ """
31
+ Constructor.
32
+
33
+ Args:
34
+ states (Array[State]): The states of the model.
35
+ interpolator_type (Interpolator.Type): The type of interpolator to use for all but the AttitudeQuaternion subset. Attitude quaternions will be interpolated using spherical linear interpolation (SLERP).
36
+ """
25
37
  def __repr__(self) -> str:
26
38
  """
27
39
  Convert the model to a string.
@@ -66,6 +78,13 @@ class Tabulated(ostk.astrodynamics.flight.profile.Model):
66
78
  Returns:
67
79
  Frame: The body frame of the model with the specified name.
68
80
  """
81
+ def get_interpolator_type(self) -> ostk.mathematics.curve_fitting.Interpolator.Type:
82
+ """
83
+ Get the type of interpolator used in the model.
84
+
85
+ Returns:
86
+ Interpolator.Type: The type of interpolator used in the model.
87
+ """
69
88
  def get_interval(self) -> ostk.physics.time.Interval:
70
89
  """
71
90
  Get the interval of the model.
@@ -0,0 +1,115 @@
1
+ # Apache License 2.0
2
+
3
+ from datetime import datetime
4
+
5
+ import pytest
6
+
7
+ from ostk.mathematics.geometry.d3.transformation.rotation import Quaternion
8
+ from ostk.mathematics.curve_fitting import Interpolator
9
+
10
+ from ostk.physics.time import Scale
11
+ from ostk.physics.time import Instant
12
+ from ostk.physics.coordinate import Position
13
+ from ostk.physics.coordinate import Velocity
14
+ from ostk.physics.coordinate import Frame
15
+
16
+ from ostk.astrodynamics.trajectory import State
17
+ from ostk.astrodynamics.flight.profile.model import Tabulated as TabulatedModel
18
+
19
+
20
+ @pytest.fixture
21
+ def states() -> list[State]:
22
+ return [
23
+ State(
24
+ instant=Instant.date_time(datetime(2020, 1, 1, 0, 0, 0), Scale.UTC),
25
+ position=Position.meters((0.0, 0.0, 0.0), Frame.GCRF()),
26
+ velocity=Velocity.meters_per_second((0.0, 0.0, 0.0), Frame.GCRF()),
27
+ attitude=Quaternion.unit(),
28
+ angular_velocity=(0.0, 0.0, 0.0),
29
+ attitude_frame=Frame.GCRF(),
30
+ ),
31
+ State(
32
+ instant=Instant.date_time(datetime(2020, 1, 1, 0, 1, 0), Scale.UTC),
33
+ position=Position.meters((0.0, 0.0, 0.0), Frame.GCRF()),
34
+ velocity=Velocity.meters_per_second((0.0, 0.0, 0.0), Frame.GCRF()),
35
+ attitude=Quaternion.unit(),
36
+ angular_velocity=(0.0, 0.0, 0.0),
37
+ attitude_frame=Frame.GCRF(),
38
+ ),
39
+ ]
40
+
41
+
42
+ @pytest.fixture
43
+ def interpolator_type() -> Interpolator.Type:
44
+ return Interpolator.Type.Linear
45
+
46
+
47
+ @pytest.fixture
48
+ def tabulated_model(
49
+ states: list[State],
50
+ interpolator_type: Interpolator.Type,
51
+ ) -> TabulatedModel:
52
+ return TabulatedModel(
53
+ states=states,
54
+ interpolator_type=interpolator_type,
55
+ )
56
+
57
+
58
+ class TestTabulatedProfile:
59
+ def test_constructors(
60
+ self,
61
+ tabulated_model: TabulatedModel,
62
+ ):
63
+ assert tabulated_model is not None
64
+ assert isinstance(tabulated_model, TabulatedModel)
65
+
66
+ def test_is_defined(
67
+ self,
68
+ tabulated_model: TabulatedModel,
69
+ ):
70
+ assert tabulated_model.is_defined() is True
71
+
72
+ def test_get_interval(
73
+ self,
74
+ tabulated_model: TabulatedModel,
75
+ ):
76
+ interval = tabulated_model.get_interval()
77
+
78
+ assert interval is not None
79
+
80
+ def test_get_interpolator_type(
81
+ self,
82
+ tabulated_model: TabulatedModel,
83
+ ):
84
+ interpolator_type = tabulated_model.get_interpolator_type()
85
+
86
+ assert interpolator_type is not None
87
+
88
+ def test_calculate_state_at(
89
+ self,
90
+ tabulated_model: TabulatedModel,
91
+ states: list[State],
92
+ ):
93
+ state: State = tabulated_model.calculate_state_at(states[0].get_instant())
94
+
95
+ assert state is not None
96
+
97
+ def test_get_axes_at(
98
+ self,
99
+ tabulated_model: TabulatedModel,
100
+ states: list[State],
101
+ ):
102
+ axes = tabulated_model.get_axes_at(states[0].get_instant())
103
+
104
+ assert axes is not None
105
+
106
+ def test_get_body_frame(
107
+ self,
108
+ tabulated_model: TabulatedModel,
109
+ ):
110
+ if Frame.exists("test"):
111
+ Frame.destruct("test")
112
+
113
+ body_frame = tabulated_model.get_body_frame("test")
114
+
115
+ assert body_frame is not None
@@ -97,6 +97,10 @@ def profile(request) -> Profile:
97
97
  @pytest.fixture(
98
98
  params=[
99
99
  Profile.Target(Profile.TargetType.GeocentricNadir, Profile.Axis.X),
100
+ Profile.TrajectoryTarget(
101
+ Trajectory.position(Position.meters((0.0, 0.0, 0.0), Frame.ITRF())),
102
+ Profile.Axis.X,
103
+ ),
100
104
  Profile.TrajectoryTarget.target_position(
101
105
  Trajectory.position(Position.meters((0.0, 0.0, 0.0), Frame.ITRF())),
102
106
  Profile.Axis.X,
@@ -116,5 +116,3 @@ class TestDisplay:
116
116
  accesses=accesses_2,
117
117
  rgb=[0, 0, 180],
118
118
  )
119
-
120
- accesses_plot.show()
@@ -75,19 +75,34 @@ def orbit() -> Orbit:
75
75
 
76
76
 
77
77
  class TestTrajectory:
78
- def test_trajectory(self, states: list[State]):
78
+ def test_trajectory(
79
+ self,
80
+ states: list[State],
81
+ ):
79
82
  assert Trajectory(states) is not None
80
83
 
81
- def test_is_defined(self, trajectory: Trajectory):
84
+ def test_is_defined(
85
+ self,
86
+ trajectory: Trajectory,
87
+ ):
82
88
  assert trajectory.is_defined()
83
89
 
84
- def test_access_model(self, trajectory: Trajectory):
90
+ def test_access_model(
91
+ self,
92
+ trajectory: Trajectory,
93
+ ):
85
94
  assert trajectory.access_model() is not None
86
95
 
87
- def test_get_state_at(self, trajectory: Trajectory):
96
+ def test_get_state_at(
97
+ self,
98
+ trajectory: Trajectory,
99
+ ):
88
100
  assert trajectory.get_state_at(Instant.J2000()) is not None
89
101
 
90
- def test_get_states_at(self, trajectory: Trajectory):
102
+ def test_get_states_at(
103
+ self,
104
+ trajectory: Trajectory,
105
+ ):
91
106
  assert (
92
107
  trajectory.get_states_at(
93
108
  [Instant.J2000(), Instant.J2000() + Duration.seconds(10.0)]
@@ -102,7 +117,10 @@ class TestTrajectory:
102
117
  assert isinstance(trajectory, Trajectory)
103
118
  assert trajectory.is_defined() is False
104
119
 
105
- def test_trajectory_position(self, position: Position):
120
+ def test_trajectory_position(
121
+ self,
122
+ position: Position,
123
+ ):
106
124
  trajectory: Trajectory = Trajectory.position(position)
107
125
 
108
126
  assert trajectory is not None
@@ -131,7 +149,10 @@ class TestTrajectory:
131
149
  assert Trajectory.ground_strip(start_lla, end_lla, instants) is not None
132
150
 
133
151
  def test_ground_strip_geodetic_nadir(
134
- self, orbit: Orbit, instants: list[Instant], earth: Earth
152
+ self,
153
+ orbit: Orbit,
154
+ instants: list[Instant],
155
+ earth: Earth,
135
156
  ):
136
157
  assert (
137
158
  Trajectory.ground_strip_geodetic_nadir(
@@ -19,6 +19,7 @@ from ostk.astrodynamics.trajectory import Orbit
19
19
  from ostk.astrodynamics.flight import Profile
20
20
  from ostk.astrodynamics.viewer import Viewer
21
21
  from ostk.astrodynamics.viewer import ConicSensor
22
+ from ostk.astrodynamics.viewer import _compute_celestial_angular_diameter_from_states
22
23
 
23
24
 
24
25
  @pytest.fixture
@@ -172,6 +173,48 @@ class TestViewer:
172
173
  )
173
174
  assert rendered_html.endswith("</script>")
174
175
 
176
+ @pytest.mark.parametrize(
177
+ "celestial_body_name",
178
+ ["Earth", "Moon", "Sun"],
179
+ )
180
+ def test_add_celestial_body_direction_success(
181
+ self,
182
+ viewer: Viewer,
183
+ orbit: Orbit,
184
+ celestial_body_name: str,
185
+ environment: Environment,
186
+ ):
187
+ viewer.add_celestial_body_direction(
188
+ profile_or_trajectory=orbit,
189
+ time_step=Duration.seconds(30.0),
190
+ celestial=environment.access_celestial_object_with_name(celestial_body_name),
191
+ )
192
+
193
+ rendered_html: str = viewer.render()
194
+
195
+ assert rendered_html.startswith('<meta charset="utf-8">')
196
+ assert "var widget = new Cesium.Viewer" in rendered_html
197
+ assert " widget.entities.add({position: widget" in rendered_html
198
+ assert (
199
+ f"widget.entities.add({{position: widget.{celestial_body_name.lower()}_direction_position"
200
+ in rendered_html
201
+ )
202
+ assert rendered_html.endswith("</script>")
203
+
204
+ def test_add_ground_tracks_success(
205
+ self,
206
+ viewer: Viewer,
207
+ orbit: Orbit,
208
+ ):
209
+ viewer.add_ground_tracks(profile_or_trajectory=orbit)
210
+
211
+ rendered_html: str = viewer.render()
212
+
213
+ assert rendered_html.startswith('<meta charset="utf-8">')
214
+ assert "var widget = new Cesium.Viewer" in rendered_html
215
+ assert "widget.entities.add({polyline:" in rendered_html
216
+ assert rendered_html.endswith("</script>")
217
+
175
218
  def test_add_target_success(
176
219
  self,
177
220
  viewer: Viewer,
@@ -260,3 +303,16 @@ class TestViewer:
260
303
  in rendered_html
261
304
  )
262
305
  assert rendered_html.endswith("</script>")
306
+
307
+
308
+ def test_compute_celestial_angular_diameter_from_states_success(
309
+ orbit: Orbit,
310
+ interval: Interval,
311
+ environment: Environment,
312
+ ) -> None:
313
+ assert _compute_celestial_angular_diameter_from_states(
314
+ celestial=environment.access_celestial_object_with_name("Sun"),
315
+ states=orbit.get_states_at(
316
+ interval.generate_grid(Duration.seconds(30.0)),
317
+ ),
318
+ ).mean() == pytest.approx(0.54, rel=1e-2)
@@ -0,0 +1,87 @@
1
+ # Apache License 2.0
2
+
3
+ import pytest
4
+
5
+ from ostk.physics.environment.object.celestial import Earth
6
+ from ostk.physics.time import Instant
7
+ from ostk.physics.time import DateTime
8
+ from ostk.physics.time import Scale
9
+ from ostk.physics.unit import Length
10
+ from ostk.physics.unit import Angle
11
+
12
+ from ostk.astrodynamics.trajectory import Orbit
13
+ from ostk.astrodynamics.trajectory import State
14
+ from ostk.astrodynamics.trajectory.model import Nadir
15
+ from ostk.astrodynamics.trajectory.orbit.model import Kepler
16
+ from ostk.astrodynamics.trajectory.orbit.model.kepler import COE
17
+
18
+
19
+ @pytest.fixture
20
+ def orbit() -> Orbit:
21
+ earth = Earth.WGS84()
22
+ coe = COE(
23
+ semi_major_axis=Length.kilometers(7000.0),
24
+ eccentricity=0.0,
25
+ inclination=Angle.degrees(98.0),
26
+ raan=Angle.degrees(0.0),
27
+ aop=Angle.degrees(0.0),
28
+ true_anomaly=Angle.degrees(0.0),
29
+ )
30
+ keplerian_model = Kepler(
31
+ coe=coe,
32
+ epoch=Instant.date_time(DateTime(2018, 1, 1, 0, 0, 0), Scale.UTC),
33
+ gravitational_parameter=earth.get_gravitational_parameter(),
34
+ equatorial_radius=earth.get_equatorial_radius(),
35
+ j2=earth.get_j2(),
36
+ j4=earth.get_j4(),
37
+ perturbation_type=Kepler.PerturbationType.No,
38
+ )
39
+ return Orbit(keplerian_model, earth)
40
+
41
+
42
+ @pytest.fixture
43
+ def nadir(orbit: Orbit) -> Nadir:
44
+ return Nadir(orbit)
45
+
46
+
47
+ class TestNadir:
48
+ def test_constructor(
49
+ self,
50
+ nadir: Nadir,
51
+ ):
52
+ assert nadir.is_defined()
53
+
54
+ def test_calculate_state_at(
55
+ self,
56
+ nadir: Nadir,
57
+ ):
58
+ instant: Instant = Instant.date_time(DateTime(2018, 1, 1, 0, 0, 0), Scale.UTC)
59
+
60
+ state: State = nadir.calculate_state_at(instant)
61
+
62
+ assert state is not None
63
+
64
+ def test_equality_operator(
65
+ self,
66
+ nadir: Nadir,
67
+ ):
68
+ assert nadir == nadir
69
+
70
+ def test_inequality_operator(
71
+ self,
72
+ nadir: Nadir,
73
+ ):
74
+ nadir2 = Nadir(Orbit.undefined())
75
+ assert nadir != nadir2
76
+
77
+ def test_get_orbit(
78
+ self,
79
+ nadir: Nadir,
80
+ ):
81
+ assert nadir.get_orbit() is not None
82
+
83
+ def test_get_step_size(
84
+ self,
85
+ nadir: Nadir,
86
+ ):
87
+ assert nadir.get_step_size() is not None