Releases: duncaneddy/brahe
Releases · duncaneddy/brahe
Release list
Release v1.7.0
Important
This release adds support for arbitrary-central-body orbit propagation, extending Brahe support beyond Earth or other planets and interplanetary trajectories. As such it contains multiple breaking changes to the NumericalOrbitPropagator class.
There are also a number of other fun improvements added with this release:
- Native SPICE kernel support for planetary body positions and frames
- Support for cislunar and mars reference frames and trajectories
- Added Permenant Tide, Solid Earth Tide, and Ocean Tide force models
- Support for conversions to/from synodic reference frames
- API Clients for JPL Small Bodies Database and Horizons systems for SPICE kernel download
- Datasets to download and access FK5, Hipparcos, and Tycho2 star catalogs
- Overhaul MeanToOsculating orbital element conversions, adding support for numerical-averaging based conversions
- Added builder-pattern constructors for major, complex classes making them easier toconstruct andcustomize
- Review and improvement of error system in the package. Standardizing use of
Resultin Rust API, and improving Python errors
Added
- Native SPICE kernel support:
SPKandBPCKreaders (DAF container, SPK Type 2/3, binary PCK Type 2), usable standalone or via the global registry. @duncaneddy (#376) - Global multi-kernel registry:
load_kernel,unload_kernel,clear_kernels,loaded_kernels; kernels stay resident simultaneously with most-recently-loaded precedence and epoch-aware chain fallback. @duncaneddy (#376) NAIFIdenum (planets, planetary-system barycenters, major moons,Id(i32)catch-all) andFrameIdenum (MoonPaDe440= 31008 +Id(i32)); all query functions takeimpl Into<NAIFId>/impl Into<FrameId>, so raw integer IDs keep working. Python mirrors asNAIFId/FrameIdIntEnums. @duncaneddy (#376)SPICEKernelenum covering every downloadable kernel — DE (de430–de442s), JPL satellite ephemeris kernels (mar099,mar099s,jup365,sat441,ura184,nep097,plu060), and binary PCK (moon_pa_de440) — plusKernelSourcefor bring-your-own kernel paths. @duncaneddy (#376)load_common_kernels()(de440s + moon_pa_de440, ~46 MB) andload_all_kernels()(~2.5 GB) pre-initialization helpers. @duncaneddy (#376)- Generic NAIF-ID ephemeris queries:
spk_position,spk_velocity,spk_state(pooled, cross-kernel chaining) and kernel-scopedspk_position_from_kernel/spk_velocity_from_kernel/spk_state_from_kernel. @duncaneddy (#376) - Per-body kernel-backed accessors
{body}_{position,velocity,state}_spicefor Sun, Moon, Mercury, Venus, Mars, Jupiter, Saturn, Uranus, Neptune, and the SSB. The five outer planets return true body centers via a two-leg DE + satellite-ephemeris-kernel sum (kernel auto-downloaded on first use: mar099s ~68 MB, jup365 ~1.1 GB, sat441 ~662 MB, ura184 ~387 MB, nep097 ~105 MB);{planet}_barycenter_{position,velocity,state}_spicevariants provide the planetary-system barycenter from the DE kernel alone. @duncaneddy (#376) - PCK orientation queries with typed attitude returns:
pck_euler_angle(EulerAngle, ZXZ),pck_euler_angle_and_rates,pck_euler_rates,pck_quaternion(Quaternion),pck_rotation_matrix(RotationMatrix), plus the rawpck_euler_angles. @duncaneddy (#376) Epoch::spice_et()— SPICE ephemeris time (TDB seconds past J2000) convenience accessor;Epoch::seconds_past_j2000_as_time_systemfor other time systems. @duncaneddy (#376)datasets::naif::download_spice_kernelfor any known NAIF kernel (DE, satellite ephemeris, binary PCK), exposed in Python asdatasets.naif.download_spice_kernel. @duncaneddy (#376)- ANISE validation suite (mm-level matched-ET comparisons, network-gated lunar DCM validation) and native-vs-ANISE criterion benchmarks. @duncaneddy (#376)
- Learn/API documentation for the spice module and four standalone examples, enabled in CI with cached kernels. @duncaneddy (#376)
- Lunar reference frames
LCI/LFPA/LFMEand Mars framesMCI/MCMFwith{rotation|position|state}_{from}_to_{to}transformations, cross-centerstate_eci_to_lci/state_eci_to_mci, and automaticmoon_pa_de440PCK loading. @duncaneddy (#377) - Native IAU/WGCCRE 2015 body-rotation engine (
rotation_icrf_to_body_fixed_iau,iau_rotation_model_ids) with an embedded 17-body coefficient table transcribed frompck00011.tpcand validated against ANISE. @duncaneddy (#377) - Centralized
ReferenceFrameenum and frame router (rotation_frame_to_frame,position_frame_to_frame,state_frame_to_frame) with generic NAIF-ID variants (BodyCenteredICRF,BodyFixedIAU,BodyFixedPCK) and"ECI"/"ECEF"string aliases. @duncaneddy (#377) CentralBodyabstraction (Earth, Moon, Mars, EMB, SSB, Custom) withfrom_naif_id(), andForceModelConfig::for_body(),lunar_default()(GRGM660PRIM 50×50, Earth+Sun third bodies, Moon+Earth occultation),mars_default()(GMM-2B 50×50, exponential drag, Mars occultation), andcislunar_default()(EMB-centered) constructors. @duncaneddy (#377)- Barycentric (EMB/SSB) propagation with correct direct/differential third-body handling;
ThirdBodygainsEarth,Phobos,Deimos, andCustom { name, naif_id, gm }variants. @duncaneddy (#377) - Multi-body eclipse modeling via
occulting_bodieson the SRP configuration and newOccultingBodytype. @duncaneddy (#377) - Body-generic dynamics functions:
accel_third_body_for_body,eclipse_conical_for_body,eclipse_cylindrical_for_body,accel_relativity_for_body,accel_drag_for_body,state_eci_to_koe_for_body. @duncaneddy (#377) state_bci,state_bcbf, andstate_in_frame(frame, epoch)on the orbit state-provider traits (DOrbitStateProvider/SOrbitStateProvider), implemented on the numerical, Keplerian, and SGP propagators and both trajectory types. @duncaneddy (#377)OrbitFrame::BodyCenteredInertial(center): non-Earth propagator trajectories carry their center's NAIF ID, and trajectory Earth-frame conversions (point queries, batchto_*, covariance, CCSDS OEM export) re-center through the frame router;state_koe_oscreturns elements about the trajectory's own center using that body's GM. @duncaneddy (#377)- User-defined body-fixed frames:
register_custom_frame(key, rotation, omega=None)+ReferenceFrame::BodyFixedCustom{center, key}(epoch->DCM callback with optional angular-velocity callback; numeric transport-term fallback), with a runnable example. @duncaneddy (#377) state_koe_to_eci_for_body(inverse ofstate_eci_to_koe_for_body),ReferenceFrame::ECI/ECEFaliases,kernel_is_loaded(), and theSECONDS_PER_JULIAN_CENTURYconstant. @duncaneddy (#377)just setuprecipe for local development (uv venv, pre-commit hooks, and pre-downloading the de440s/moon_pa_de440/mar099s kernels tests expect cached). @duncaneddy (#377)- NAIF
mar099sMars satellite kernel support (download_satellite_kernel,load_kernel("mar099s")) for Phobos/Deimos ephemerides. @duncaneddy (#377) - Physical constants
R_MARS,OMEGA_MARS,OMEGA_MOON,GM_PHOBOS,GM_DEIMOS. @duncaneddy (#377) ForceModelConfig::validate()with clear errors for invalid central-body/force-model combinations, called automatically at propagator construction. @duncaneddy (#377)- Python bindings for all of the above (
ReferenceFrame,CentralBody,OccultingBody, extendedThirdBody, config constructors, frame functions,state_in_frame). @duncaneddy (#377) - CI caching of kernel and gravity-model downloads across jobs and workflow runs, with a weekly keep-warm workflow. @duncaneddy ([#377](https://github.com...
Latest Release (v1.7.0)
This is the latest stable release of Brahe.
Current version: v1.7.0 (v1.7.0)
For detailed release notes, see the versioned release.
Release v1.6.2
Added
- Added native Linux
arm64wheel builds to the latest and release workflows, with platform-specific wheel artifact names to avoid artifact collisions. @hectcastro (#372) CachingEOPProvider/CachingSpaceWeatherProvider(andinitialize_eop()/initialize_sw()) now seed a missing cache from the compiled-in bundled data, so EOP and space-weather initialization succeed offline without an immediate network download. @duncaneddy (#374)- EOP and space-weather downloads now retry transient failures (connection errors, timeouts, HTTP 429/5xx) with exponential backoff and jitter (up to 4 attempts). @duncaneddy (#374)
Changed
- Changed standard EOP product source to USNO finals2000A.all. @duncaneddy (#373)
- Changed C04 EOP product source to Paris Observatory C04 Product. @duncaneddy (#373)
- Download failure messages now include the attempted URL and number of attempts. @duncaneddy (#374)
- Consolidated EOP and space-weather download logic into a shared
utils::downloadhelper (internal refactor, no API change). @duncaneddy (#374)
Fixed
- Fix compilation issue due to transitive dependency breaking change in
ureq/timecrates. Pintimeuntil issue is resolved. @duncaneddy (#373) - Fixed issue with failing tests due to inability to update outdated EOP products. @duncaneddy (#373)
initialize_eop()/initialize_sw()no longer fail on a fresh/empty cache when the remote EOP or space-weather server is transiently unreachable (e.g.Standard EOP download request failed: io: Connection refusedin CI); bundled data is used instead. @duncaneddy (#374)
Release v1.6.1
Added
- Added "Getting Started" section to main documentation page. @duncaneddy (#356)
integrationflag to rust and python test suites, replacingci. @duncaneddy (#365)par_propagate_to(Python) now accepts a list that mixesKeplerianPropagator,SGPPropagator, andNumericalOrbitPropagatorinstances. Propagators are grouped by type and each group is propagated in parallel; results are written back to the original objects in place, preserving list order. @duncaneddy (#366)MANUALexample flag for examples that must never run automatically (scaffolding templates and credential-gated examples), so the--ignorelive-network run no longer sweeps them in. @duncaneddy (#366)
Changed
- Update C04 data source to point to currently updating data series. @duncaneddy (#356)
- Makes the
plotssubmodule of the python package an optional dependency installed withbrahe[plots]and not installed by default to avoid importing the heavy dependencies by default. @duncaneddy (#360) - Optimized the serial spherical-harmonic gravity evaluation (
GravityModel::compute_spherical_harmonics/compute_spherical_harmonics_with_workspace) by precomputing the V/W recurrence reciprocal coefficients and reading the recurrence and accumulation buffers through bounds-check-free column slices. The workspace path is ~1.7–1.8× faster at degree/order 20–80 (the range common to LEO propagation) and ~1.6× faster at 360×360, with results unchanged to within 1e-12 relative. Measured on a 10-core Apple M1 Max. @duncaneddy (#361) - Raised the
ParallelMode::Autoparallelization threshold for spherical-harmonic gravity from degree 150 to 210. The faster serial path moved the serial/parallel break-even point, soAutonow stays serial until parallel evaluation is at least as fast. @duncaneddy (#361) compute_spherical_harmonics,compute_spherical_harmonics_with_workspace,accel_gravity_spherical_harmonics, andaccel_gravity_spherical_harmonics_with_workspacenow take aparallel: ParallelModeargument;GravityConfiguration::SphericalHarmonicgained aparallelfield (defaults toAuto). @duncaneddy (#361)- Updated CI workflow to only run integration tests weekly and at release time to reduce frequent occurrence of CI tests failing due to external integration test failures. @duncaneddy (#365)
- Improved CI caching to large texture / basemap files to be updated with integration tests weekly and avoid redownload on most CI runs. @duncaneddy (#365)
- Updated
pyo3dependency version. @duncaneddy (#365) - Updated
uv.lock. @duncaneddy (#365) - Tagged
TEMPLATE.{py,rs}andgetting_started/clients_spacetrack.{py,rs}asMANUALso they are excluded from all automated example runs. @duncaneddy (#366) - Raised the per-example
TIMEOUTto 600s for thestarlink_propagation.pyexamples, which propagate the full live Starlink constellation and exceeded the default 180s limit during the weekly/release live-network run. @duncaneddy (#366)
Removed
ciflag from rust and python test suites. @duncaneddy (#365)
Fixed
- CSSI space weather data loader has been fixed to use the observed f107 rather than the adjusted f107. @jackyarndley (#362)
- The NRLMSISE-00 implementation has been updated to use the previous day observed f107 as is standard. @jackyarndley (#362)
- Fixed race condition in examples CI tests where two could download the same Natural Earth basemap and corrupt the file for both. @duncaneddy (#365)
- Fixed regression from lazy-impoting
brahe.plotsthat caused static-analyzers (griffee) to fail path-traversal. This causedbuild-docsto fail and slipped through due to other test-failure noise. @duncaneddy (#365) - Fixed
test-examplesflakyness on external integration dependencies. Ignore testing integration-based examples by default, but exercise them weekly in the integration tests to ensure continued coverage. @duncaneddy (#365) par_propagate_to(Python) no longer raisesTypeErrorwhen given a list containing more than one propagator type; mixed-type lists are now propagated correctly. @duncaneddy (#366)- Fixed the release
test-examplesintegration job failing on--ignore:IGNOREwas an overloaded bucket that mixed live-network examples with templates, credential-gated, slow, and broken examples, so opting into the live-network set pulled in examples that could never pass there. @duncaneddy (#366)
Release v1.6.0
Added
- Add
RKF78/RKF78Integratorsupport for high-order adaptive integration in Rust and Python. @Mtrya (#339) - Add RKF78 tests, examples, and API/reference documentation. @Mtrya (#339)
- Added GMAT baselines. @duncaneddy (#340)
- Added Basilisk baselines. @duncaneddy (#340)
profiles/subdirectory with short, standalone rust and python scripts for use with profiling tools. @duncaneddy (#341)- Added
justfilecommands to run profiling scripts. @duncaneddy (#341) - Add baselines against Nyx 2.4.0 / ANISE 0.10.1. @duncaneddy (#342)
- Added
datasets.icgemsubmodule to integrate with ICGEM gravity field model distribution network. Listing and downloading models uses the local brahe cache to minimize network traffic. @duncaneddy (#343) - Added brahe vs astrojax benchmarks. @duncaneddy (#344)
- Add
ci-successstage to enable gating CI auto-merge on completion. @duncaneddy (#350)
Changed
- Extend numerical propagation integrator selection and comparison examples to include RKF78. @Mtrya (#339)
- Split baselines into speed and accuracy tests. @duncaneddy (#340)
- Added
ICGEMModel(body, model_name)toGravityModelTypeenabling ICGEM models to be specified for numerical orbit propagators. @duncaneddy (#343) - Scaled back python-version test matrix on PRs to minimum supported python version. @duncaneddy (#345)
- Removed
anisedefault feature dependency to just pull in SPICE kernel features. @duncaneddy (#350)
Fixed
EulerAngleOrdersemantics now match what brahe's documentation always described and what the comparative benchmark expects. Prior to this fix,attitude.euler_angle_to_quaterniondisagreed with OreKit, GMAT, and Basilisk. The discrepancy was traced through to a convention mismatch between the per-order formulas (faithfully transcribed from Diebel 2006) and the aerospace rotation-sequence interpretation users (and the docs) assumed. @duncaneddy (#338)- Fixed issue with CHANGELOG parsing in PRs where a blank line after a section header would fail to validate. @duncaneddy (#338)
- Fixed issue with Orekit access baseline not properly inserting leap seconds in accuracy computation leading to in accurate error. @duncaneddy (#340)
- Fixed build breaking from conflicting
nalgebrarequired dependencies. @duncaneddy (#350) - Regression in use of custom python-based access constraints where they would give an error at use. @nkgotcode @duncaneddy (#354)
Release v1.5.2
Added
DNumericalOrbitPropagator::builder()- typestate builder that names required fields and lets optional fields be set by name or omitted.build()is only callable onceepoch,state, andforce_configare all set, enforced viaSet/Unsetmarker type parameters. @markusz (#321)- Added
states_ecefandstates_eme2000toSGPPropagator. @duncaneddy (#331) - Added
states_eme2000toKeplerianPropagator. @duncaneddy (#331) - Added
states_eci,states_ecef,states_gcrf,states_itrf, andstates_eme2000toNumericalOrbitPropagator. @duncaneddy (#331) - Added
statestoNumericalPropagator. @duncaneddy (#331) - New high-fidelity propagator benchmarks under
benchmarks/comparative/tasks/propagation_tasks.py:numerical_rk4_grav5x5,numerical_rk4_grav20x20_sun_moon,numerical_rk4_grav80x80_full. Each runs RK4 over one LEO revolution with matched force-model and frame settings on both sides (OreKit loads brahe'sEGM2008_360.gfcviaICGEMFormatReader, GCRF inertial frame, ITRF / IAU 2006/2000A body-fixed rotation, DE-440 third-body ephemerides, identical spacecraft mass / area / Cd / Cr). @duncaneddy (#332) - New function-level acceleration benchmarks under
benchmarks/comparative/tasks/force_model_tasks.pyfor point-mass gravity, 20×20 and 80×80 spherical-harmonic gravity, and third-body Sun/Moon. These evaluate a single acceleration at a fixed state and epoch, isolating force-model code from integrator behaviour. @duncaneddy (#332) - "Force Model" section in
docs/about/benchmarks.mddocumenting the new function-level comparisons. @duncaneddy (#332) GravityModel::load_uncached(model)— explicit cold-load primitive for users who need deterministic memory or want to profile the parse path. @duncaneddy (#332)GravityModel::compute_spherical_harmonics_with_workspace(...)andaccel_gravity_spherical_harmonics_with_workspace(...)— variants that accept caller-supplied V/W work matrices, letting hot-path callers (the numerical propagator's dynamics closure, batch orbit-determination residual code) amortize the per-callDMatrix::zeros((n_max + 2)²)allocation. At 80×80 the saved allocation+memset is ~15 µs per call. @duncaneddy (#332)clear_gravity_model_cache()— manual cache invalidation, useful after replacing aFromFile(path)source on disk or in tests. @duncaneddy (#332)mimallocas the global allocator for thebrahe-pyPython extension and the comparative-benchmark Rust binary. The brahe core library remains allocator-agnostic so downstream Rust consumers pick their own. @duncaneddy (#332)- Added
SECONDS_PER_DAYconstant. @duncaneddy (#333)
Changed
NumericalOrbitPropagatorandNumericalPropagatornow no longer store accelerations by default to save space and improve performance. @duncaneddy (#330)- The FD fallback for HermiteQuintic is removed. Previously, calling HermiteQuintic on a trajectory without stored accelerations would silently degrade to finite-difference acceleration estimation if 3+ points were available; now it errors. Combined with the earlier store_accelerations: false default flip, any code path that today uses HermiteQuintic either needs NumericalPropagationConfig::with_store_accelerations(true) (propagator path) or trajectory.enable_acceleration_storage() (direct path). @duncaneddy (#330)
- Performance, numerical propagator (no behaviour change): the
DNumericalOrbitPropagatorhot path now caches the ECI→body-fixed rotation across integrator stages, shares oneArc<GravityModel>across propagators with the same gravity config (no more 60 ms.gfcreload per construction), borrows the state vector instead of cloning it on every stage call, returns the orbital derivative as a stack-allocatedVector6<f64>instead of allocating a freshDVector, and reuses the spherical-harmonic V/W work matrices across stages. @duncaneddy (#332) GravityModel::from_model_typeis now process-wide cache-backed. Repeated calls for the sameGravityModelTypeparse the.gfcfile once (~60 ms cold), then return owned clones from the cachedArc(~1 ms each). The public signature is unchanged. Cache is documented as unbounded — see the# Cautionblock on the function for the growth caveat with many distinctFromFile(path)sources, and useclear_gravity_model_cache()as the escape hatch. @duncaneddy (#332)bias_precession_nutationswitched fromiauXys06a(full IAU 2000A nutation, ~1300 terms) toiauXys00b(truncated IAU 2000B, ~77 terms). Per-call cost dropped from ~150 µs to ~2.3 µs; agreement with the full series is sub-milliarcsecond, no regressions in tests. @duncaneddy (#332)- Refreshed benchmark plots and docs. @duncaneddy (#332)
- Changed how adding a flaot second time to an Epoch (
epc + 42.5) processes the internal addition. Previously, it would loop of remaining nanoseconds and convert them into integer seconds. For large second values, this would result in many loops for a single step, meaning that time addition, a frequent code hot-path, would grow linearly in time. Now it is an O(1) operation. @duncaneddy (#333)
Fixed
- Update urllib3 to mitigate security vulnerability. @duncaneddy (#326)
- Some estimation plots used unicode sigma instead of
$\sigma$. When latex is installed and defaults to pdfLaTeX compiler, this causes an error. Switch to$\sigma$everywhere. @duncaneddy (#331) DNumericalOrbitPropagator::propagate_tomay hang with fixed-step RK4. Atsrc/propagators/dnumerical_orbit_propagator.rs:2312the restore-dt_nextguard used>instead of>=. Withtarget_epoch = epc + N * step_sizeconstructed by repeated arithmetic, float drift could leavetarget_relslightly larger than the integer multiple; Fixed by changing the comparison to>=so the restore fires whenever the integrator returned its preferred step. @duncaneddy (#332)- Workspace mismatch in
benchmarks/comparative/implementations/rust/Cargo.toml: the crate predated the brahe repo-root workspace and would fail with "current package believes it's in a workspace when it's not". Added an empty[workspace]table so cargo treats the bench as its own workspace root. @duncaneddy (#332) - Fix issue with new release workflow
CHANGELOGgeneration that would result in an error causing the release to fail. Release notes now must be manually generated and committed prior to running the release action. @duncaneddy (#334)
Release v1.5.0
[1.5.0] - 2026-05-06
Added
- Added
accel_earth_zonal_gravity— a hand-rolled closed-form J2–J6 zonal acceleration that mirrorsaccel_gravity_spherical_harmonicswithm = 0but evaluates ~1.5–2x faster, with agreement to <3 km over a 24 h LEO propagation when both are driven in the same Earth-fixed frame. @markusz (#302) - Added
GravityConfiguration::EarthZonal { degree }variant and supportingZonalHarmonicsDegreeenum (J2..J6) so the numerical propagator can use the fast zonal path directly. @markusz (#302) - Added
FrameTransformationModel(variantsFullEarthRotation,EarthRotationOnly) and aframe_transformfield onForceModelConfig.EarthRotationOnlyskips precession, nutation, and polar motion for ~1.5x faster ECI↔ECEF rotations at the cost of ~0.07° pole-tilt accuracy;FullEarthRotation(default) preserves prior behavior. @markusz (#302) - Added
J3_EARTH,J4_EARTH,J5_EARTH, andJ6_EARTHconstants derived from EGM2008. @markusz (#302) - Added Python bindings for
accel_earth_zonal_gravity,ZonalHarmonicsDegree,FrameTransformationModel,GravityConfiguration.earth_zonal(...), and the newJ3_EARTH–J6_EARTHconstants. @markusz (#302) - Added coefficient-derivation tests verifying each
J_n_EARTHconstant matches-C_n,0 * sqrt(2n + 1)against the EGM2008 fully-normalized Stokes coefficients. @markusz (#302)
Changed
- Refined
J2_EARTHto be derived from the EGM2008C_2,0Stokes coefficient (1.0826261738522227e-3) instead of GGM05s. Downstream values change in the 5th significant digit. @markusz (#302) - Reused a single ECI→body-fixed rotation per dynamics step across gravity, NRLMSISE-00 density, and drag inside
DNumericalOrbitPropagatorrather than recomputing the rotation per force term. @markusz (#302) - Update package lockfile. @duncaneddy (#306)
- Migrate from
towncrierCHANGELOG workflow to self-built scripted extraction workflow to eliminate need fornews/*segments and generation. @duncaneddy (#320) - Removed the auto-approval/merge workflows. These generated a significant number of relatively useless PR's creating noise in PR history. Permissions are properly configured so these updates directly merge into main. @duncaneddy (#320)
- Contributor PRs directly run tests by default. @duncaneddy (#320)
Removed
- Removed rust artifact caching from CI since existing rust environment already provides (working) caching. @duncaneddy (#315)
Fixed
- Add missing
CHANGELOG.mdrelease entries. @duncaneddy (#306) - Fix error with release note generation step of release workflow. @duncaneddy (#306)
- Fix issue with awk-based release-note generation step of release workflow not populating release note contents. @duncaneddy (#306)
- Fixed Starlink examples and documentation prose that still referenced the removed
bh.datasets.celestrak/bh::datasets::celestrakAPI. @Mtrya (#310) - Fix 3rd party changes PRs not generating changelog fragments. @duncaneddy (#317)
Release v1.4.2
Release v1.4.0
[1.4.0] - 2026-04-17
Added
Changed
- Refactored repository structure to use a Rust workspace to breakup the python module from the core rust module. This pure-rust package consumers to avoid having to build the
cdylib, which is only needed for python module builds. #278 pyo3andnumpyare now optional dependencies, activated via thepythonfeature flag. Pure-Rust consumers that do not need the Python bindings no longer compile these crates.- Split the repository into a Cargo workspace so the PyO3 bindings live in a dedicated
brahe-pymember crate atcrates/brahe-py/. The publishedbrahecrate now builds only anrlib, eliminating the unnecessarycdylibartifact previously produced for every pure-Rust consumer. Rust downstream (use brahe::*) and Python downstream (import brahe) are unchanged.
Fixed
- Fixed issue that would cause tests and auto-merge to not run on dependabot PRs #278
Release v1.3.1
[1.3.1] - 2026-03-29
Added
- Added retry logic and exponential back-off to Celestrak client
Added process-based rate-limiting to Celestrak client #244 - Added python constructors for CCSDS OPM and OMM file types #225
- Added dedicated
celestrakandspacetracksubmodules to the brahe CLI for querying and interfacing with space track.
Addedto_dict()andto_json()methods for GPRecord python module to enable easy interoperability #227 - Added additional python test coverage #228
- Added
estimationmodule with support forEKF,UKF, andBLS(batched least-squares) filters
Added estimation plotting routines
Added implementations of magnetic field models. In particular the IGRF and WMMHR models.
Addedfrom_unix_timestampandunix_timestampmethods to support interoperability with native unix time systems
Added sponsor logo #241
Changed
- Set default celestrak client cache age to 2 hours. #244
- Bump version for
v1.3.1#248 - Added additional test coverage #225
- Renamed
MJD2000constant toMJD_J2000to align withJD_J2000naming #231 - Improved documentation code samples by auto-generating, capturing, and rendering script outputs so values are guaranteed to be kept up to date. #234
- Migrated to
properdocsfrommkdocsfor documentation due to instability in project. #241