⚠️ This release includes type stubs in the Python bindings, which may contain syntax errors that cause mypy to crash.
While we work to resolve these issues, it's recommended to add `no_site_packages = True` to your mypy config to suppress these errors.
What's Changed
* build: bump nlopt dep to from 2.5.0 to 2.9.1 by apaletta3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/496
* build: prepare for test matrix by alex-liang3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/490
* build: update all gh action extensions to latest versions by apaletta3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/489
* chore: fix dockerfile and setuptools warnings, bump ostk-core and boost by alex-liang3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/499
* chore: package stubs in whl by alex-liang3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/486
* docs: clean-up Local Orbital Frame comments by phc1990 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/487
* feat: add label to viewer by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/483
* feat: off nadir angle computations by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/492
* feat!: add correct computeJacobian method by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/485
* feat!: include states with Maneuver by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/432
* feat!: vectorize access generation by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/461
* fix: use absolute path of package by alex-liang3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/498
* refactor!: FiniteDifferenceSolver interface for computeStateTransitionMatrix by apaletta3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/497
* refactor!: rename nadir_pointing profile to local_orbital_frame by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/484
* refactor!: use state instead of instantposvel by vishwa2710 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/493
* test: reorder test fixture for clarity by apaletta3 in https://github.com/open-space-collective/open-space-toolkit-astrodynamics/pull/494
Migration Guide
Finite Difference Solver
python
Before
output: np.ndarray = finite_difference_solver.compute_jacobian(
state=state,
instants=instants,
generate_states_coordinates=generate_states_coordinates,
coordinate_dimension=2,
)
Now
output: list[np.ndarray] = finite_difference_solver.compute_state_transition_matrix(
state=state,
instants=instants,
generate_states_coordinates=generate_states_coordinates,
)
assert len(output) = len(instants)
- `compute_jacobian` renamed to `compute_state_transition_matrix`
- Removed `coordinate_dimension` parameter - now derived from `generate_states_coordinates`
- `compute_state_transition_matrix` now returns a list of state transition matrices with proper ordering, before it would return a single np.ndarray that had N columns for the first dimension, N columns for the second dimension etc. which was confusing to parse
Profile
python
Before
Profile.nadir_pointing(orbit=orbit, orbital_frame_type=Orbit.FrameType.VVLH)
Now
Profile.local_orbital_frame_pointing(orbit=orbit, orbital_frame_type=Orbit.FrameType.VVLH)
- `nadir_pointing` renamed to `local_orbital_frame_pointing` to reflect broader functionality
Local Orbital Frame Factory
python
Before
local_orbital_frame_factory.generate_frame(
instant=instant,
position_vector=position_vector,
velocity_vector=velocity_vector
)
Now
local_orbital_frame_factory.generate_frame(state=state)
- Consolidated parameters into single `state` object
Generator
python
Before
generator = Generator.aer_mask(
azimuth_elevation_mask=azimuth_elevation_mask,
range_range=range_range,
environment=environment
)
from_trajectory = ...
to_trajectory = ...
accesses = generator.compute_accesses(
interval=interval,
from_trajectory=from_trajectory,
to_trajectory=to_trajectory,
)
Now
from ostk.astrodynamics.access import Generator, VisibilityCriterion, AccessTarget
generator = Generator(environment=environment)
visibility_criterion = VisibilityCriterion.from_aer_mask(
azimuth_elevation_mask=azimuth_elevation_mask,
range_interval=range_interval,
)
access_target = AccessTarget.from_lla(
lla=LLA.vector(50.0, 30.0, 0.0),
visibility_criterion=visibility_criterion,
celestial=environment.access_celestial_object_with_name("Earth")
)
accesses = generator.compute_accesses(
interval=interval,
access_target=access_target,
to_trajectory=...
)
- Simplified generator creation
- Constraints were previously defined at the Generator level, they are now defined at an AccessTarget level, allowing us to compute accesses with multiple access targets for a single satellite in a more efficient way
- Please refer to the [access computation notebook](https://github.com/open-space-collective/open-space-toolkit/blob/main/notebooks/Astrodynamics/Flight%20Dynamics/Access%20Computation.ipynb) for in-depth examples
Maneuver
python
Before
maneuver = Maneuver(instants, Frame.GCRF(), acceleration_profile, mass_flow_rate_profile)
acceleration_profile = maneuver.get_acceleration_profile()
instants = maneuver.get_instants()
mass_flow_rate_profile = maneuver.get_mass_flow_rate_profile()
Now
coordinate_subsets = [
CartesianPosition.default(),
CartesianVelocity.default(),
CartesianAcceleration.thrust_acceleration(),
CoordinateSubset.mass_flow_rate(),
]
state_builder = StateBuilder(
frame=Frame.GCRF(),
coordinate_subsets=coordinate_subsets,
)
states = [state_builder.build(Instant.J2000(), coordinates), ...]
maneuver = Maneuver(states)
states = maneuver.get_states()
acceleration_profile = list(map(lambda state: state.extract_coordinate(CartesianAcceleration.thrust_acceleration()), states))
mass_flow_rate_profile = list(map(lambda state: state.extract_coordinate(CoordinateSubset.mass_flow_rate()), states))
instants = list(map(lambda state: state.get_instant(), states))
- Consolidated acceleration, and mass flow rate profiles into a State object, including the position and velocity so that we can conveniently convert to local orbital frame definitions
- New `CartesianAcceleration` subset to describe accelerations
New Features
- Added label annotation support in viewer:
python
viewer.add_label(
position=Position.meters([6671000.0, 0.0, 0.0], Frame.ITRF()),
text="Hello, World!",
size=1.0,
color="red",
)
- Added off-nadir angle computation:
python
from ostk.astrodynamics.data.provider import compute_off_nadir_angles
along_track, cross_track, off_nadir = compute_off_nadir_angles(
state=state,
target_position=target_position,
)
- Cartesian Acceleration subset
python
from ostk.astrodynamics.trajectory.state.coordinate_subsets import CartesianAcceleration
cartesian_acceleration = CartesianAcceleration.default()
thrust_acceleration = CartesianAcceleration.thrust_acceleration()
**Full Changelog**: https://github.com/open-space-collective/open-space-toolkit-astrodynamics/compare/13.1.0...14.0.0