brahe/lib.rs
1/*!
2# Brahe
3Brahe is a modern satellite dynamics library for research and engineering
4applications. It is designed to be easy-to-learn, high-performance, and quick-to-deploy.
5The north-star of the development is enabling users to solve meaningful problems
6and answer questions quickly, easily, and correctly.
7
8The key features of the library are:
9
10- **Intuitive API**: API designed to be easily composable, making it easy to
11 solve complex problems correctly by building on core functionality.
12- **Easy-to-Learn**: Designed to be easy to use and learn. The objective is
13 to provide clear documentation and visibility into what the software is doing
14 so that users don't need to spend time reverse engineering internal routines
15 and more time solving their own problems.
16- **High-Performance**: Brahe provides a Python 3.6+ wrapper that is
17 auto-generated from a core Rust library. This provides fast core implementation,
18 while allowing users to take advantage of Python's rich scientific ecosystem
19 if they so choose.
20- **Answer Questions Quickly**: Brahe is designed to make it easy to code up
21 solutions to meaningful problems. High-fidelity, high-performance APIs are not
22 the end-objective, but helping users solve their problems.
23
24Brahe gets its name from the combination of Rust and astrodynamics (Rust +
25astrodynamics = Brahe). The library specifically focuses on satellite astrodynamics
26and space mission analysis. While the underlying concepts have been studied and known since
27Kepler wrote down his three laws, there are few modern software
28libraries that make these concepts easily accessible. While extremely well tested,
29other astrodynamics and mission analysis software can have an extremely steep
30learning curve, making it difficult to quickly run simple analysis that is known
31to be correct.
32
33Because of this, students, researchers, and engineers frequently end up
34reimplementing common astrodynamics and mission analysis tools with unfortunately
35frequent regularity. While reimplementation of common code can be a good learning
36mechanisms, in most cases it is both error-prone and costs time better spent
37on other endeavours. This project seeks to providing an easy-to-use,
38well-tested library, to enable everyone to more easily, and quickly
39perform astrodynamics and space mission analysis without sacrificing performance
40or correctness. The software built in Rust for performance with bindings to
41Python for ease of use.
42
43The implementation approach is opinionated, the objective is to provide an
44easy-to-use and accurate astrodynamics library to enable users to quickly
45and correctly solve most common problem types. it is not practical to try to
46implement _every_ aerodynamics model and function utilized in practice or historically.
47Since Brahe is open source, if a specific function is not present, or a different
48implementation is required, users can modify the code to address their specific
49use case. This means that Brahe, while we want to continue expanding the
50capabilities of the module over time, the immediate goal is to provide a well-tested,
51flexible, composable API to quickly address modern problems in astrodynamics.
52
53One example of this in practice is that the built-in Earth reference frame transformation
54utilizes the IAU 2006/2000A precession-nutation model, CIO-based transformation.
55Even through there are multiple ways to construct this transformation, Brahe
56only implements one. Another example, is that the geodetic and geocentric
57transformations use the latest NIMA technical report definitions for Earth's radius and flatness.
58If a desired model isn't implemented users are free to extend the software to
59address and functionality or modeling gaps that exist to address their specific application.
60
61## Documentation
62
63You can find the package documentation [here](https://duncaneddy.github.io/brahe).
64This documentation is meant to provide a human-friendly walk through of the
65software and package. Brahe is currently in the early stages of development so
66the documentation will likely not be complete. Sections marked **[WIP]**
67will have some software functionality implemented but not be considered
68documented.
69
70The most complete API reference guide will always be the Rust crate API
71reference, found on [crates.io](https://docs.rs/brahe/). This is always up-to-date with the latest release
72since it is autogenerated at build time during the release process.
73
74## Software Usage and License
75
76The Brahe package is licensed and distributed under an [MIT License](https://github.com/duncaneddy/brahe/blob/main/LICENSE) to
77encourage adoption and to make it easy to integrate with other tools.
78
79The only thing asked is that if you do use the package in your work, or
80appreciate the project, either send a message or star the project. Knowing
81that the project is being actively used is a large motivator for continued
82development.
83
84## Support and Acknowledgement
85
86Brahe is currently being developed primarily for my own enjoyment and
87because I find having these tools helpful in professional and hobby work. I plan to
88continue developing it for the time being regardless of greater adoption as time permitting.
89
90That being said, it's incredibly encouraging and useful to know if the
91software is being adopted or found useful in wider practice. If you're
92using Brahe for school, research, or a commercial endeavour, I'd
93love to know about it! Tweet me [@duncaneddy](https://twitter.com/DuncanEddy) or
94email me at duncan.eddy (at) gmail.com.
95 */
96
97// TODO: Remove when BTreeCursor is stabilized
98// See: https://github.com/rust-lang/rust/issues/107540
99#![feature(btree_cursors)]
100// This enables the use of the coverage attribute which turns
101// off erroneous coverage miss reporting in test blocks
102#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
103
104// Re-export commonly used types
105pub use access::*;
106pub use attitude::*;
107pub use constants::*;
108pub use coordinates::*;
109pub use datasets::*;
110pub use earth_models::*;
111pub use eop::*;
112pub use frames::*;
113pub use integrators::*;
114pub use math::*;
115pub use orbit_dynamics::*;
116pub use orbits::*;
117pub use propagators::*;
118pub use relative_motion::*;
119pub use space_weather::*;
120pub use time::conversions::*;
121pub use time::*;
122pub use trajectories::*;
123
124// Module declarations
125pub mod access;
126pub mod attitude;
127pub mod constants;
128pub mod coordinates;
129pub mod datasets;
130pub mod earth_models;
131pub mod eop;
132pub mod events;
133pub mod frames;
134pub mod integrators;
135pub mod math;
136pub mod orbit_dynamics;
137pub mod orbits;
138pub mod propagators;
139pub mod relative_motion;
140pub mod space_weather;
141pub mod time;
142pub mod trajectories;
143pub mod utils;
144// Centralized traits module - re-exports all public traits
145pub mod traits;
146
147#[cfg(feature = "python")]
148mod pymodule;