Releases: nyx-space/anise
0.9.6: Fix transport theorem for orbit-centric frames (RIC, RCN, VNC)
Important: the transport theorem was not correctly applied exclusively in the case of computing the RCN, RIC, and VNC frames. There was a unit issue. This release fixes this bug.
What's Changed
- build(deps): update snafu requirement from 0.8.0 to 0.9.0 by @dependabot[bot] in #669
- Add getter and setter for Ephemeris degree and interpolation by @ChristopherRabotin in #673
- Fix transport theorem in orbit frames (RIC/RCN/VNC) by @ChristopherRabotin in #674
Full Changelog: 0.9.5...0.9.6
0.9.5: Fix python type hints + iterate over Ephemeris + fix Type2/3 for BSPs from spk_merge
New features
- feat: implement iterator on Ephemeris by @ChristopherRabotin in #664
- Add ASN.1 encoding support for CartesianState by @ChristopherRabotin in #658
- Python initializers for Mass, SRP, Drag by @ChristopherRabotin in #659
- Add ASN.1 Python bindings for core structs by @ChristopherRabotin in #660
Bug fixes
Improvements
- Use Gemini conductor to build type hints, checked with mypy by @ChristopherRabotin in #665
Dependencies
- build(deps): update arrow requirement from 57.1.0 to 58.0.0 by @dependabot[bot] in #667
- build(deps): update pyo3 requirement from 0.27 to 0.28 + hifitime 4.2.5 by @dependabot[bot] in #634
New Contributors
Full Changelog: 0.9.4...0.9.5
0.9.4: Support SPK Types 8/12 + export Quaternion/DCM multiplication to Python + Initial C++ bindings
What's Changed
- Update READMEs with supported SPK types table by @ChristopherRabotin in #641
- Add llms.txt for LLM context by @ChristopherRabotin in #645
- Support SPK Type 12 - Hermite Equal Time Steps by @ChristopherRabotin in #643
- Support SPK Type 8 - Lagrange Equal Time Steps by @ChristopherRabotin in #644
- Update readme by @ChristopherRabotin in #647
- Expose hifitime types to C++ via CXX by @ChristopherRabotin in #646
- build(deps): update rand requirement from 0.9.1 to 0.10.0 by @dependabot[bot] in #649
- Fix STK .e file interpolation degree calculation by @ChristopherRabotin in #653
- Export DCM and Quaternion multiplication to Python by @ChristopherRabotin in #654
Full Changelog: 0.9.3...0.9.4
0.9.3: Fix STK .e default units ; fix anise.time python type hint, update other type hints
What's Changed
- Fix STK .e file distance unit default to meters by @ChristopherRabotin in #638
- Export Ephemeris degree to Python by @ChristopherRabotin in #639
- Release/0.9.3: fix python type hints by @ChristopherRabotin in #640
Full Changelog: 0.9.2...0.9.3
0.9.2: Fix RIC/VNC sign error; add covariance parsing to STK .e files
What's Changed
- Optimize Lagrange evaluate using epoch registry by @google-labs-jules[bot] in #628
- Optimize DAF comments parsing and fix loop range by @google-labs-jules[bot] in #629
- Fix RIC/VNC state diff sign error by @ChristopherRabotin in #632
- Support parsing covariance from STK .e files by @ChristopherRabotin in #633
- Ensure to stop parsing state data when in covariance field by @ChristopherRabotin in #635
- Update python macos dist by @ChristopherRabotin in #636
Full Changelog: 0.9.1...0.9.2
0.9.1: CCSDS OEM exporting epoch fix + initialize ephem record from Python
0.9.0: Support CCSDS OEM and STK .e; Build covariance interpolation (PSD guaranteed) and orbital element uncertainty; add instrument kernel and Field of View calculations
🚀 Highlights
Version 0.9.0 introduces a dedicated instrument modeling module, significantly expands interoperability with industry-standard file formats (CCSDS OEM, Ansys STK), and adds "hot-swap" capabilities for kernel management.
🔭 Instrument & Field of View (Beta)
- New Module: Introduced
anise.instrumentcontainingInstrumentandFovShapeclasses. - Analysis: Added
FovMarginandFovMarginToLocationto the scalar expression engine for event finding and reporting. - Visual Validation: Added
tests/fov_plots.pydemonstrating FOV pyramid construction and projection in the Moon Principal Axis frame.
⚠️ Beta Notice: The FOV margin calculation and Almanac signatures are currently in Beta. Expect potential API changes in future minor releases as the instrument modeling fidelity evolves.
📡 Interoperability & Data Exchange
-
CCSDS OEM Support:
-
Added
Ephemeris.from_ccsds_oem_file()to load CCSDS Orbit Ephemeris Messages (OEM). -
Added
Almanac.load_ccsds_oem_file()to directly ingest OEMs into the frame system. -
Added
to_ccsds_oem_file()to export ephemerides. -
STK Support: Added
Ephemeris.from_stk_e_file()andAlmanac.load_stk_e_file()to ingest Ansys STK.eephemeris files. -
Covariance Interpolation: Ephemeris interpolation via Log-Euclidean Riemannian space for covariance matrices, ensuring positive definiteness and volume preservation during sampling.
🔄 Kernel Management
- Hot-Swapping: Added
spk_swap()andbpc_swap()to theAlmanac. - Allows in-place replacement of SPK/BPC files using a "high watermark" memory strategy (reusing existing buffers). Use this in embedded/flight software contexts.
- Unloading: Added
spk_unload()andbpc_unload().
📐 GNC & Frame Math
- TRIAD / Align-and-Clock: Added
DCM.from_align_and_clock()to construct rotation matrices based on primary/secondary vector alignment constraints. - Quaternion runtime frame checking: Fixed the Quaternion/Euler Parameter math to correctly use the Hamiltonian convention and use a passive rotation like the DCM.
- Solar Elongation: Updated
sun_angle_degdocumentation to explicitly define conjunction/opposition geometry and illumination phases. - Numpy Integration:
Orbitconstructors now accept nativenumpy.arrayinputs for state vectors.
Pull requests
New features
- feat: state spec is now a trait by @ChristopherRabotin in #586
- feat: implement visibility arcs by @ChristopherRabotin in #587
- Enable DAF kernel swapping by @ChristopherRabotin in #591
- List loaded kernels + export Almanac as MetaAlmanac for reloading + load many ANISE kernels at once with aliases by @ChristopherRabotin in #592
- Add NumPy array constructor for astro.Orbit by @google-labs-jules[bot] in #598
- Highly requested feature: support CCSDS OEM with covariances, and interpolation between covariance by @ChristopherRabotin in #601
- Add STK .e Ephemeris Parsing by @google-labs-jules[bot] in #612
- Feat/oem covar export by @ChristopherRabotin in #613
- Implement orbital element uncertainty for an EphemerisRecord by @ChristopherRabotin in #611
- Instrument kernel, field of view margin calculation, fix frame check with quaternions passive rotation, DCM TRIAD initialization by @ChristopherRabotin in #614
Fixes
- fix #577 by ensuring that specific scalars be treated as angles by @ChristopherRabotin in #579
- Silence Brouwer Warning for Small Errors by @google-labs-jules[bot] in #590
- Fix(python): Add missing comma to all by @google-labs-jules[bot] in #596
- Add readme to Python package by @ChristopherRabotin in #597
- Fix Continuous Event Arcs and Non-Equality Conditions by @google-labs-jules[bot] in #604
- Revert "Fix Continuous Event Arcs and Non-Equality Conditions" by @ChristopherRabotin in #605
- Fix #600 again since I accidentally fully reversed it by @ChristopherRabotin in #609
Miscellaneous
- Make Analysis Solvers Public by @google-labs-jules[bot] in #583
- Support multi summary blocks in DAF by @ChristopherRabotin in #584
- build(deps): update rfd requirement from 0.15.0 to 0.16.0 by @dependabot[bot] in #580
- build(deps): update criterion requirement from 0.7 to 0.8 by @dependabot[bot] in #588
- build(deps): update criterion requirement from 0.7 to 0.8 by @dependabot[bot] in #594
- Update main readme by @ChristopherRabotin in #599
- Use LFS for the PCA files by @ChristopherRabotin in #606
- Add tutorials for Analysis module and OEM support by @google-labs-jules[bot] in #607
- Various small changes to support porting Nyx over to ANISE 0.9.0 by @ChristopherRabotin in #610
- build(deps): update rfd requirement from 0.16.0 to 0.17.1 by @dependabot[bot] in #616
- Add tests for Quaternion implementation by @google-labs-jules[bot] in #617
Full Changelog: 0.8.0...0.9.0
0.8.0: Event finder rewrite for correctness and speed
Gemini summary
Here are the release notes for version 0.8.0.
🚀 Major Overhaul: Event Finder
The event finding system has been completely rewritten from the ground up. This new implementation is approximately 25 times faster and resolves several bugs related to missed or incorrectly identified events (like eclipses and sunsets).
The API for event finding has been redesigned for clarity and power:
- The
Eventclass no longer usesdesired_valueandvalue_precision. - It now uses a new
Conditionenum (e.g.,Condition.LessThan(90.0),Condition.Equals(0.0),Condition.Maximum()), which makes event definitions more intuitive. - The
report_eventsfunction is now used for finding specific moments (events matchingEquals,Minimum, orMaximumconditions). - The new
report_event_arcsfunction is used to find time spans (events matchingLessThan,GreaterThan, orBetweenconditions). - The
report_eventsfunction no longer requires aheuristicduration argument, as the new adaptive scanner handles this automatically.
✨ New Features
- Astrodynamics: Added support for Brouwer-Lyddane short mean elements and Equinoctial elements. These are accessible as new variants in the
OrbitalElementscalar enum and via new methods on theOrbitobject (e.g.,orbit.sma_brouwer_short_km(),orbit.equinoctial_h()). - Analysis: A new
anise.analysis.find_arc_intersectionsfunction is available to find common overlapping time windows from multipleEventArclists. - Analysis: The
report_scalars_flatfunction can now export results to a.csvfile. - Python API: The Python module now exposes
__version__,__author__, and__doc__attributes.
⚠️ Breaking API Changes
Orbit.from_latlongalt: This method's signature has changed. It no longer accepts an angular velocity and now creates a state with ZERO angular velocity in the specified frame.- To get the previous behavior (specifying an angular velocity), use the new
Orbit.from_latlongalt_omegamethod.
- To get the previous behavior (specifying an angular velocity), use the new
- Method Renames:
Event.above_horizon_from_location_idis nowEvent.visible_from_location_id.Almanac.frame_from_uidis nowAlmanac.frame_info.- All
angular_velocity_wtr...(with-respect-to) methods are renamed toangular_velocity_wrt....
🛠️ Improvements and Fixes
- AER Terrain Masks: Azimuth, Elevation, and Range (AER) calculations with terrain masks are improved. Instead of returning
NaNwhen obstructed, theAzElRangeobject now populates themask_degfield and provides a newelevation_above_mask_deg()method. - AER from Location: The logic for calculating AER from a location has been updated to use the new
Orbit.from_latlongaltimplementation, simplifying the internal logic. - Python API:
LocationDhallSetandMetaAlmanacnow havedumps/loadsaliases forto_dhall/from_dhall. - Dependencies: Updated
hifitime,pyo3, andnumpyversions. - CI: Updated CI data files, kernel checksums, and pinned the build to Python 3.12.
Pull request summary
New features
- Add Brouwer mean elements + equinoctial elements + fix python type hints by @ChristopherRabotin in #568
Bug fixes
- Fix incorrect NAIF ID constants for Mercury and Venus by @google-labs-jules[bot] in #571
- Lat/long/alt initializer incorrectly expected an angular velocity for fixed-points by @ChristopherRabotin in #573
- Add Newton step attempt in event finder by @ChristopherRabotin in #548
- Revamp event finding entirely: report_event is now very robust, enabling a robust event "arc" finder by @ChristopherRabotin in #570
- Fix visibility arcs with terrain masks enabled by @ChristopherRabotin in #575
Miscellaneous
- Fix release of PyPI package by @ChristopherRabotin in #544
- fix(docs): align :rtype: with rust return types in python.rs files by @google-labs-jules[bot] in #545
- Fix CRC32 + variety of python docs by @ChristopherRabotin in #547
- fix: JPL removed the MRO file we were using in validation by @ChristopherRabotin in #560
- Upgrade dependencies in Cargo.toml by @ChristopherRabotin in #562
- Fix typo "wtr" to "wrt" by @google-labs-jules[bot] in #554
Full Changelog: 0.7.0...0.8.0
ANISE v0.7.0: The Analysis Engine
This release is a massive step forward, evolving ANISE from a SPICE replacement into a comprehensive mission analysis toolkit. The centerpiece is the brand-new Analysis Engine, a powerful, expression-based framework for defining, computing, and reporting on complex astrodynamical events and values.
The highlights of this new engine include:
- Expression-Based Reporting: Define what you want to compute—from simple orbital elements to complex vector projections—using StateSpec, ScalarExpr, and VectorExpr. The ReportScalars functionality then computes these values over any time series.
- Robust Event Finding: Locate precise moments in time when specific conditions are met. Find every apoapsis, periapsis, eclipse, or even when an elevation angle from a ground station crosses the horizon using the new Event system.
- First-Class Location Kernels: You can now define ground stations and other points of interest in new ANISE Location Kernel (.lka) files. These can be loaded directly into the Almanac to support azimuth, elevation, and range calculations with terrain masks.
Beyond the new engine, this release is packed with significant API improvements and internal refactors:
- Dynamic Kernel Management: You can now load SPK and BPC kernels with aliases and unload them on the fly (spk_unload, bpc_unload), offering much greater flexibility for complex simulations. This is powered by a significant internal refactor of the Almanac.
- Quaternions in Python: The rotation.Quaternion is now a first-class object in the Python API, providing a complete and robust interface for attitude dynamics.
- Upgraded Time Engine: A major update to the underlying hifitime library brings a cleaner, more powerful anise.time API and a host of new functionalities.
New features
- Analysis module to generate reports + Location Almanac datatype and its elevation mask by @ChristopherRabotin in #515
- docs: Add detailed documentation to complex code sections by @ChristopherRabotin in #518
- Feat/export quat python by @ChristopherRabotin in #517
- Event finding from scalar expressions by @ChristopherRabotin in #519
- Add local time of ascending/descending node calculation by @ChristopherRabotin in #534
- Expose Expression tree to Python by @ChristopherRabotin in #536
- ANISE kernels' Lookup table use dynamic memory allocation + Almanac supports unloading by @ChristopherRabotin in #530
Dependencies
- Update serde_dhall requirement from 0.12 to 0.13 by @dependabot[bot] in #512
- Update nalgebra requirement from 0.33 to 0.34 by @dependabot[bot] in #505
Miscellaneous
- Publish the wheels packages by @ChristopherRabotin in #508
- Fix Python typing (hopefully) by @translunar in #528
- Update egui_logger requirement from 0.8.0 to 0.9.0 by @dependabot[bot] in #533
Full Changelog: 0.6.8...0.7.0
0.6.9: Fix Python module import
Full Changelog: 0.6.8...0.6.9