{"id":50256631,"url":"https://github.com/ssmichael1/satkit","last_synced_at":"2026-06-12T22:00:50.798Z","repository":{"id":225696732,"uuid":"766613368","full_name":"ssmichael1/satkit","owner":"ssmichael1","description":"Satellite and Orbital Dynamics Toolkit","archived":false,"fork":false,"pushed_at":"2026-06-10T01:59:20.000Z","size":1959,"stargazers_count":76,"open_issues_count":9,"forks_count":10,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-06-10T03:19:49.244Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://satkit.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ssmichael1.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-03T18:35:01.000Z","updated_at":"2026-06-03T01:11:26.000Z","dependencies_parsed_at":"2024-03-19T02:45:46.983Z","dependency_job_id":"229a6a20-863f-4fdb-844a-c099ac6eff1e","html_url":"https://github.com/ssmichael1/satkit","commit_stats":null,"previous_names":["ssmichael1/satkit"],"tags_count":77,"template":false,"template_full_name":null,"purl":"pkg:github/ssmichael1/satkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssmichael1%2Fsatkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssmichael1%2Fsatkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssmichael1%2Fsatkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssmichael1%2Fsatkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ssmichael1","download_url":"https://codeload.github.com/ssmichael1/satkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssmichael1%2Fsatkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34263874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-27T06:31:27.810Z","updated_at":"2026-06-12T22:00:50.791Z","avatar_url":"https://github.com/ssmichael1.png","language":"Rust","funding_links":[],"categories":["Bioinformatics \u0026 Astronomy"],"sub_categories":[],"readme":"# satkit\n\n**Satellite astrodynamics in Rust, with full Python bindings.**\n\n![Build](https://github.com/ssmichael1/satkit/actions/workflows/build.yml/badge.svg)\n![Release](https://github.com/ssmichael1/satkit/actions/workflows/release.yml/badge.svg)\n![License: MIT OR Apache-2.0](https://img.shields.io/github/license/ssmichael1/satkit)\n\n[![Crates.io](https://img.shields.io/crates/v/satkit)](https://crates.io/crates/satkit)\n[![Crates.io Downloads](https://img.shields.io/crates/dr/satkit)](https://crates.io/crates/satkit)\n[![PyPI](https://img.shields.io/pypi/v/satkit)](https://pypi.org/project/satkit/)\n[![PyPI Downloads](https://img.shields.io/pypi/dm/satkit)](https://pypi.org/project/satkit/)\n[![Python](https://img.shields.io/pypi/pyversions/satkit)](https://pypi.org/project/satkit/)\n\n---\n\nSatkit is a high-performance orbital mechanics library written in Rust with complete Python bindings via PyO3. It handles coordinate transforms, orbit propagation, time systems, gravity models, atmospheric density, and JPL ephemerides -- everything needed for satellite astrodynamics work.\n\n**[Documentation and tutorials](https://satkit.dev/)** (Python examples, but the concepts and API apply equally to Rust) | **[Rust API reference](https://docs.rs/satkit/)**\n\n\u003e [!NOTE]\n\u003e **Version 0.16.0** introduces several breaking changes: `Frame::RIC` is renamed to the canonical `Frame::RTN` (with `RIC` / `RSW` remaining as aliases, so existing code still compiles); a new `Frame::NTW` (velocity-aligned) is added; `LVLH` is now accepted as a maneuver/thrust frame; the uncertainty API is unified into `set_pos_uncertainty(sigma, frame)` / `set_vel_uncertainty(sigma, frame)` (the four old per-frame methods are removed, not deprecated); `PropSettings::default()` now uses `GravityModel::EGM96` instead of `JGM3`; the **Gauss-Jackson 8** fixed-step multistep integrator is available for long-duration propagation; and `PropSettings::max_steps` is now configurable. See `CHANGELOG.md` for the full list.\n\n## Installation\n\n**Rust:**\n```bash\ncargo add satkit\n```\n\n**Python:**\n```bash\npip install satkit\n```\n\nPre-built wheels are available for Linux, macOS, and Windows on Python 3.10--3.14.\n\nAfter installing, download the required data files (gravity models, ephemerides, Earth orientation parameters):\n\n```python\nimport satkit as sk\nsk.utils.update_datafiles()  # one-time download; re-run periodically for fresh EOP/space weather\n```\n\n## Quick Examples\n\n### SGP4 propagation (Python)\n\n```python\nimport satkit as sk\n\ntle = sk.TLE.from_lines([\n    \"ISS (ZARYA)\",\n    \"1 25544U 98067A   24001.50000000  .00016717  00000-0  10270-3 0  9003\",\n    \"2 25544  51.6432 351.4697 0007417 130.5364 329.6482 15.48915330299357\"\n])\n\npos, vel = sk.sgp4(tle, sk.time(2024, 1, 2))\n```\n\n### High-precision propagation (Python)\n\n```python\nimport satkit as sk\nimport numpy as np\n\nr0 = 6378e3 + 500e3  # 500 km altitude\nv0 = np.sqrt(sk.consts.mu_earth / r0)\n\nsettings = sk.propsettings(\n    gravity_model=sk.gravmodel.egm96,  # default; also jgm3, jgm2, itugrace16\n    gravity_degree=8,\n    integrator=sk.integrator.rkv98,    # default; also rkv87, rkv65, rkts54,\n                                       # gauss_jackson8 (fixed-step multistep)\n)\n\nresult = sk.propagate(\n    np.array([r0, 0, 0, 0, v0, 0]),\n    sk.time(2024, 1, 1),\n    end=sk.time(2024, 1, 1) + sk.duration.from_days(1),\n    propsettings=settings,\n)\n\nstate = result.interp(sk.time(2024, 1, 1) + sk.duration.from_hours(6))\n```\n\n### Coordinate transforms (Python)\n\n```python\nimport satkit as sk\n\ntime = sk.time(2024, 1, 1, 12, 0, 0)\ncoord = sk.itrfcoord(latitude_deg=42.0, longitude_deg=-71.0, altitude=100.0)\n\nq = sk.frametransform.qitrf2gcrf(time)\ngcrf_pos = q * coord.vector\n```\n\n### Planetary ephemerides (Rust)\n\n```rust\nuse satkit::{Instant, SolarSystem, jplephem};\n\nlet time = Instant::from_datetime(2024, 1, 1, 0, 0, 0.0)?;\nlet (pos, vel) = jplephem::geocentric_state(SolarSystem::Moon, \u0026time)?;\n```\n\n## Features\n\n### Coordinate Frames\n\nFull IERS 2010 Conventions reduction (IAU 2006/2000A precession-nutation) with Earth orientation parameters:\n\n| Frame | Description |\n|-------|-------------|\n| ITRF | International Terrestrial Reference Frame (Earth-fixed) |\n| GCRF | Geocentric Celestial Reference Frame (inertial) |\n| TEME | True Equator Mean Equinox (SGP4 output frame) |\n| CIRS | Celestial Intermediate Reference System |\n| TIRS | Terrestrial Intermediate Reference System |\n| Geodetic | Latitude / longitude / altitude (WGS-84) |\n\nPlus ENU, NED, and geodesic distance (Vincenty) utilities.\n\n### Orbit Propagation\n\n- **Numerical** -- Selectable adaptive Runge-Kutta integrators (9(8), 8(7), 6(5), 5(4)) plus RODAS4 (stiff) and Gauss-Jackson 8 (fixed-step multistep for high-precision long-duration propagation), with dense output, state transition matrix, and configurable force models\n- **SGP4** -- Standard TLE/OMM propagator with TLE fitting from precision states\n- **Keplerian** -- Analytical two-body propagation\n\n### Orbit Maneuvers\n\n- **Impulsive maneuvers** -- Instantaneous delta-v applied at a scheduled time during propagation. Supported frames: GCRF (inertial), RTN (radial/tangential/normal — the CCSDS OEM convention, also exposed as `RSW` and `RIC` aliases), NTW (velocity-aligned — natural for prograde burns on eccentric orbits, where a pure +T delta-v adds exactly Δv to |v|), and LVLH (Local Vertical / Local Horizontal). Ergonomic helpers `add_prograde` / `add_retrograde` / `add_radial` / `add_normal` for common scalar-magnitude burns.\n- **Continuous thrust** -- Constant-acceleration thrust arcs over time windows in any of the frames above, integrated directly into the force model\n- **Automatic segmentation** -- Propagation through maneuver sequences is handled transparently, including backward propagation\n\n### Force Models\n\n- **Earth gravity**: JGM2, JGM3, EGM96, ITU GRACE16 (spherical harmonics up to degree/order 360)\n- **Third-body gravity**: Sun and Moon via JPL DE440/441 ephemerides\n- **Atmospheric drag**: NRLMSISE-00 with automatic space weather data\n- **Solar radiation pressure**: Cannonball model with shadow function\n\n### Time Systems\n\nSeamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with full leap-second handling.\n\n### Solar System\n\n- JPL DE440/DE441 ephemerides for all planets, Sun, Moon, and barycenters\n- Fast analytical Sun/Moon models for lower-precision work\n- Sunrise/sunset and Moon phase calculations\n\n### Linear Algebra\n\nSatKit uses [numeris](https://crates.io/crates/numeris) for all linear algebra (vectors, matrices, quaternions, ODE integration). If you also use nalgebra in your project, enable the `nalgebra` feature on numeris for zero-cost `From`/`Into` conversions between types:\n\n```toml\nnumeris = { version = \"0.5.7\", features = [\"nalgebra\"] }\n```\n\n### Cargo Features\n\n| Feature | Default | Description |\n|---------|---------|-------------|\n| `omm-xml` | yes | XML OMM deserialization via `quick-xml` |\n| `chrono` | no | `TimeLike` impl for `chrono::DateTime` |\n\n## Data Files\n\nSatkit needs external data for gravity models, ephemerides, and Earth orientation. Call `update_datafiles()` to download them automatically.\n\n**Downloaded once:** JPL DE440/441 (~100 MB), gravity model coefficients, IERS nutation tables\n\n**Update periodically:** Space weather indices (F10.7, Ap) and Earth orientation parameters (polar motion, UT1-UTC) -- both sourced from [Celestrak](https://celestrak.org/SpaceData/).\n\n## Testing and Validation\n\nThe library is validated against:\n\n- **Vallado** test cases for SGP4, coordinate transforms, and Keplerian elements\n- **JPL** test vectors for DE440/441 ephemeris interpolation (10,000+ cases)\n- **ICGEM** reference values for gravity field calculations\n- **GPS SP3** precise ephemerides for multi-day numerical propagation\n\n157 Rust tests and 81 Python tests run on every commit across Linux, macOS, and Windows.\n\n### Running Tests Locally\n\nTests require two sets of external data: the **astro-data** files (gravity models, ephemerides, etc.) and the **test vectors** (reference outputs for validation). Download both before running:\n\n```bash\n# Install the download helper\npip install requests\n\n# Download test vectors\npython python/test/download_testvecs.py\n```\n\nThen run tests with the environment variables pointing to the downloaded directories:\n\n```bash\n# Rust tests\nSATKIT_DATA=astro-data SATKIT_TESTVEC_ROOT=satkit-testvecs cargo test\n\n# Python tests\nSATKIT_DATA=astro-data SATKIT_TESTVEC_ROOT=satkit-testvecs pytest python/test/\n```\n\n## Documentation\n\n- **Rust**: [docs.rs/satkit](https://docs.rs/satkit/)\n- **Python**: [satkit.dev](https://satkit.dev/) -- tutorials, Jupyter notebooks, and API reference\n\n## References\n\n- D. Vallado, *Fundamentals of Astrodynamics and Applications*, 4th ed., 2013\n- O. Montenbruck \u0026 E. Gill, *Satellite Orbits: Models, Methods, Applications*, 2000\n- J. Verner, [Runge-Kutta integration coefficients](https://www.sfu.ca/~jverner/)\n\n## License\n\nLicensed under either of\n\n- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or \u003chttp://www.apache.org/licenses/LICENSE-2.0\u003e)\n- MIT license ([LICENSE-MIT](LICENSE-MIT) or \u003chttp://opensource.org/licenses/MIT\u003e)\n\nat your option.\n\n### Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssmichael1%2Fsatkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fssmichael1%2Fsatkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssmichael1%2Fsatkit/lists"}