diff --git a/docs/anise/explanation/frame-safety.md b/docs/anise/explanation/frame-safety.md index 84deb6c..66ca6a5 100644 --- a/docs/anise/explanation/frame-safety.md +++ b/docs/anise/explanation/frame-safety.md @@ -9,6 +9,7 @@ ANISE introduces the concept of **Frame Safety** to eliminate these errors. In the SPICE toolkit, frames are often referred to by integer IDs. While ANISE maintains compatibility with NAIF IDs, it treats Frames as rich objects. Every Frame in ANISE has an `ephemeris_id` and an `orientation_id`, which store the central object identifier and the reference frame orientation identifier. Each frame may also set properties related to the central object, notably: + - **`mu_km3_s2`**: the gravitational parameter in km^3/s^2 - **`shape`**: the tri-axial ellipsoid shape of the central object, defined by its semi major and semi minor axes and its polar axis. @@ -30,6 +31,7 @@ Before any computation: ANISE represents the relationship between frames as a tree. When transforming from Frame A to Frame B: + - **Translation Path**: Finds the common ephemeris ancestor (e.g., the Solar System Barycenter) and sums the vectors along the branches. - **Rotation Path**: Finds the common orientation ancestor and composes the Direction Cosine Matrices (DCMs) or Quaternions. diff --git a/docs/anise/reference/almanac.md b/docs/anise/reference/almanac.md index 1af968f..893e751 100644 --- a/docs/anise/reference/almanac.md +++ b/docs/anise/reference/almanac.md @@ -15,12 +15,16 @@ The following is a _small subset_ of all the functions available in the Almanac. The `Almanac` supports loading various kernel types. You can load files directly or allow ANISE to "guess" the file type. ### `load` + Loads any supported ANISE or SPICE file. + - **Rust**: `almanac.load("path/to/file")?` - **Python**: `almanac.load("path/to/file")` ### Specialized Loaders + If you know the file type, you can use specialized loaders for better performance or specific configuration: + - `with_spk(spk)`: Add SPK (ephemeris) data. - `with_bpc(bpc)`: Add BPC (high-precision orientation) data. - `with_planetary_data(pca)`: Add an ANISE planetary constant data kernel (gravity and tri-axial ellipsoid constants and low-fidelity orientation). @@ -32,17 +36,23 @@ If you know the file type, you can use specialized loaders for better performanc The most common use of the `Almanac` is to transform positions and velocities between frames. ### `transform_to` + Transforms an `Orbit` (state vector) into a different frame at its own epoch. + - **Parameters**: `orbit`, `target_frame`, `aberration`. - **Returns**: A new `Orbit` in the target frame. ### `translate` + Calculates the relative position and velocity between two frames. + - **Parameters**: `target`, `observer`, `epoch`, `aberration`. - **Returns**: A `StateVector` (Position + Velocity). ### `rotate` + Calculates the rotation (DCM) from one orientation frame to another. + - **Parameters**: `target`, `observer`, `epoch`. - **Returns**: A 3x3 Direction Cosine Matrix. @@ -51,10 +61,13 @@ Calculates the rotation (DCM) from one orientation frame to another. The `Almanac` also stores physical data for bodies defined in the kernels. ### `frame_info` + Retrieves a `Frame` object containing metadata for a given NAIF ID. + - **Includes**: Gravitational parameter ($\mu$), body radii, and frame type. ### `angular_velocity_deg_s` + Returns the angular velocity vector in deg/s of the from_frame wrt to the to_frame. ## Built-in Constants diff --git a/docs/anise/reference/analysis-api.md b/docs/anise/reference/analysis-api.md index bd25ca8..311a1c9 100644 --- a/docs/anise/reference/analysis-api.md +++ b/docs/anise/reference/analysis-api.md @@ -11,12 +11,14 @@ Use `report_scalars` to generate time-series data for analysis or plotting. Expects a `ReportScalars` object containing a list of expressions and a `StateSpec`. **Parameters:** + - `report`: A `ReportScalars` instance defined with: - `state_spec`: The context (Target, Observer, Frame) to evaluate against. - `scalars`: A list of `ScalarExpr` items. - `time_series`: A `hifitime::TimeSeries` defining the start, end, and step. **Returns:** + A dictionary (or map) where keys are Epochs and values are maps of `{ "Alias": Value }`. ```python @@ -61,12 +63,15 @@ Use `report_events` to find specific instants (points in time). ### `almanac.report_events(state, event, start, end)` Finds discrete events such as: + - **Orbital Events**: Apoapsis, Periapsis. - **Min/Max**: Time of maximum elevation, minimum range. - **Crossings**: Time when altitude crosses 100km. **Returns:** + A list of `EventDetails` objects, each containing: + - `epoch`: The precise time of the event. - `value`: The value of the scalar at that time. - `orbit`: The full spacecraft state at that time. @@ -95,12 +100,15 @@ Use `report_event_arcs` to find durations. ### `almanac.report_event_arcs(state, event, start, end)` Finds time intervals where a condition is continuously true. + - **Visibility**: "When can I see the station?" - **Battery**: "When am I in sunlight?" - **Geometry**: "When is the Earth-Sun-Probe angle < 90?" **Returns:** + A list of `EventArc` objects, each containing: + - `start`: The `EventDetails` of the start (Rising edge). - `end`: The `EventDetails` of the end (Falling edge). @@ -118,11 +126,14 @@ A list of `EventArc` objects, each containing: ``` **Returns:** + A list of `EventArc` objects, each containing: + - `start`: The `EventDetails` of the start (Rising edge). - `end`: The `EventDetails` of the end (Falling edge). The [`EventArc`](https://docs.rs/anise/latest/anise/analysis/event/struct.EventArc.html#impl-EventArc) provides the following helpers: + - `duration`: the duration of the event, as a hifitime Duration - `start_epoch`, `end_epoch`: the epochs of the start and end of the event - `midpoint_epoch`: the half-way point in the event, useful if you need to check for some calculation that happens undoubtedly during the event itself. diff --git a/docs/anise/reference/azimuth-elevation-range.md b/docs/anise/reference/azimuth-elevation-range.md index c90f413..33b56dc 100644 --- a/docs/anise/reference/azimuth-elevation-range.md +++ b/docs/anise/reference/azimuth-elevation-range.md @@ -39,7 +39,9 @@ ANISE follows the algorithm described in **Vallado, Section 4.4.3** for SEZ (Sou If an `obstructing_body` is provided, ANISE first performs an ellipsoid intersection test. A line segment is drawn from the transmitter to the receiver. If this segment intersects the body's tri-axial ellipsoid, the `obstructed_by` field is populated, and the calculation reflects the obstruction. ### 2. SEZ Frame Transformation + The transmitter's state is used to define a local **SEZ frame**: + - **Zenith (Z)**: Normal to the reference ellipsoid at the transmitter's location. - **South (S)**: Points toward the South pole of the central body. - **East (E)**: Completes the right-handed system ($E = Z \times S$). @@ -49,6 +51,7 @@ Both the transmitter ($\mathbf{r}_{tx}$) and receiver ($\mathbf{r}_{rx}$) positi $$\boldsymbol{\rho}_{sez} = \mathbf{r}_{rx\_sez} - \mathbf{r}_{tx\_sez}$$ ### 4. Angle Computation + - **Range**: $\rho = \|\boldsymbol{\rho}_{sez}\|$ - **Elevation**: $\phi = \arcsin\left(\frac{\rho_z}{\rho}\right)$ - **Azimuth**: $A = \operatorname{atan2}(\rho_y, -\rho_x)$ diff --git a/docs/anise/reference/frame.md b/docs/anise/reference/frame.md index 6360292..b678711 100644 --- a/docs/anise/reference/frame.md +++ b/docs/anise/reference/frame.md @@ -5,6 +5,7 @@ Frames define the coordinate systems used for all calculations in ANISE. Every p ## Frame Identification ANISE is compatible with the standard NAIF ID system. You can refer to frames using: + 1. **Integer IDs**: e.g., `399` for Earth. 2. **Predefined Constants**: e.g., `anise::constants::frames::EARTH_J2000`. 3. **Names**: In some interfaces (like Python), strings can be used if they have been registered in the `Almanac`. @@ -19,10 +20,12 @@ let orbit = Orbit::cartesian(x, y, z, vx, vy, vz, epoch, frame); ``` If you attempt to perform a math operation between two orbits in different frames, ANISE will either: + - **Automatic Transform**: Some APIs will automatically transform the state to a common frame if the `Almanac` is provided. - **Error**: If no `Almanac` is provided to resolve the relationship, ANISE will refuse to perform the operation to prevent physical errors. ## Metadata + A `Frame` object retrieved via `almanac.frame_info()` contains data retrieved from the loaded datasets (SPK, PCK, BPC): - **`mu_km3_s2`**: The gravitational parameter ($GM$) of the center body in $km^3/s^2$. @@ -31,7 +34,9 @@ A `Frame` object retrieved via `almanac.frame_info()` contains data retrieved fr - **`orientation_id`**: The NAIF ID used for rotation lookups. ### Orientation and Phase Angles + For planetocentric (body-fixed) frames, ANISE uses the loaded PCK or BPC data to determine the body's orientation. This is defined by three key phase angles: + 1. **Right Ascension (RA)** of the body's north pole. 2. **Declination (Dec)** of the body's north pole. 3. **Prime Meridian (W)** location at the given epoch. diff --git a/docs/anise/reference/instrument.md b/docs/anise/reference/instrument.md index d6323f3..7930cce 100644 --- a/docs/anise/reference/instrument.md +++ b/docs/anise/reference/instrument.md @@ -7,19 +7,25 @@ Instrument Kernels allow you to define sensors, cameras, and antennas attached t An `Instrument` defines the sensor's geometry relative to the spacecraft bus. ### Mounting + The mounting is defined by a rigid transformation from the **Spacecraft Body Frame** to the **Instrument Frame**. + - **`q_to_i`**: A quaternion (rotation) describing the orientation. - **`offset_i`**: A translation vector (lever arm) from the spacecraft center of mass to the sensor origin. ### Field of View (FOV) + The FOV defines the sensitive volume of the instrument. + - **Conical**: Circular FOV (e.g., dish antennas, LIDARs). Defined by a `half_angle_deg`. - **Rectangular**: Box FOV (e.g., camera sensors). Defined by `x_half_angle_deg` (Width) and `y_half_angle_deg` (Height). Assumes the boresight is +Z. ## Functionality ### FOV Margin + ANISE can compute the **FOV Margin**, which is the angle between the target and the nearest FOV boundary. + - **Positive**: Target is inside. - **Negative**: Target is outside. - **Zero**: Target is exactly on the edge. diff --git a/docs/anise/reference/location.md b/docs/anise/reference/location.md index c9a21de..6851111 100644 --- a/docs/anise/reference/location.md +++ b/docs/anise/reference/location.md @@ -17,6 +17,7 @@ Real-world ground stations do not have a perfect 0-degree horizon. Mountains or ANISE supports **Terrain Masks** to account for this. A `TerrainMask` is a list of Azimuth/Elevation pairs. + - **Azimuth**: The start of the mask segment. - **Elevation**: The minimum elevation required for visibility in that segment. diff --git a/docs/anise/reference/mathspec/interpolation/covariance.md b/docs/anise/reference/mathspec/interpolation/covariance.md new file mode 100644 index 0000000..b89fe6e --- /dev/null +++ b/docs/anise/reference/mathspec/interpolation/covariance.md @@ -0,0 +1,70 @@ +Covariances are matrices of expected values, e.g., the square of standard deviations, and are therefore positive semi-definite (PSD) matrices. +In the case of the CCSDS OEM files, they represent the uncertainty of a Cartesian position and velocity, in either an inertial frame or an orbit-local frame like the [RIC frame](nyxspace/MathSpec/celestial/coord_systems/#ric-frame). + +## Foundation + +ANISE 0.9.0 introduced covariance interpolation using a **Log-Euclidean Riemannian Interpolation** method, which might be novel in the astrodynamics community. Unlike standard linear element-wise interpolation, this approach +respects the geometric manifold of Symmetric Positive Definite (SPD) matrices. This guarantees: + +1. **Positive Definiteness:** The interpolated covariance matrix is always mathematically valid (all eigenvalues are strictly positive) + +2. **Volume Preservation:** It prevents the artificial "swelling" (determinant increase) of uncertainty that occurs when linearly interpolating between two valid matrices. The interpolation follows the "geodesic" (shortest path) on the curved surface of covariance matrices. + + +## Algorithm + +_Note:_ While covariances only need to be PSD, this method only works for positive definite matrices, i.e. none of the eigenvalues of the matrix may be zero due to the use of the natural logarithm. + +1. Find the nearest covariance before and after the requested epoch, storing the epochs $t_0$ and $t_1$ of the nearest records +2. Rotate each of these covariances into the desired frame (e.g. if the user wants the interpolated matrix in the RIC frame, rotate both covariances into the RIC frame before proceeding as they are _stable_ points of the interpolation) +3. For each matrix: + 1. Compute the Eigendecomposition of the matrix, building a matrix with the eigenvectors and a diagonal matrix of the associated eigenvalues: + + $$ P = Q \Lambda Q^T $$ + + 1. Ensure all eigenvalues are positive, else this is not a valid covariance because the matrix is not PSD + 1. Compute the matrix natural logarithm of diagonal matrix, which is simply the natural log of each diagonal element: + + $$ \Lambda ' = diag(\ln(\lambda_i)) $$ + + 1. Reconstruct the matrix logarithm by mapping the diagonal log-eigenvalues back using the original eigenvectors: + + $$ \ln(P) = Q \Lambda ' Q^T $$ + +4. Linearly interpolate in the natural logarithm domain after computing the blending factor for the requested epoch: + + $$ \ln(P_k) = (1 - \alpha) \ln(P) + \alpha \ln(P_1) $$ + +5. Compute the Eigendecomposition of the interpolated matrix, note that $Q_k$ and $\Lambda_k$ are the new eigenvectors and eigenvalues from the previous step: + + $$ ln(P_k) = Q_k \Lambda_k Q_k^T $$ + +6. Compute the _exponential_ of the diagonal matrix of eigenvalues to map this covariance back into the original manifold: + + $$ P_k = Q_k~diag(\exp(\lambda_{k_i}))~Q_k^T $$ + + +## Scalar example + +Let $P(0) = \sigma^2_0 = 1$ and $P(1) = \sigma^2_1 = 100$. + +With a basic linear interpolation, we would find the half-way covariance to be: + +$$ P(0.5) = \frac{\sigma^2_0 + \sigma^2_1}{2} = 50.5 $$ + +Which leads to a variance of: + +$$ sigma_{0.5} = \sqrt{50.5} \simeq 7.10 $$ + +At the halfway mark, the standard deviation should not be 70% of the final standard deviation. +Since uncertainty grows geometrically, the halfway point should be between 1 and 10. + +**In other words, the uncertainty swells artificially, creating a larger volume than physically warranted.** + +Let's compute the same covariance with the Log-Euclidean interpolation method. + +$$ P(0.5) = \exp(0.5 \ln(1) + 0.5 \ln(100)) = 10 $$ + +Which leads to a standard deviation of $sigma_{0.5} \simeq 3.16$. + +When considering that a covariance represents a volume, we note that the Log-Euclidean method interpolates the volume log-linearly, preventing the artificial volume inflation seen in linear interpolation. diff --git a/docs/anise/reference/mathspec/interpolation/index.md b/docs/anise/reference/mathspec/interpolation/index.md index ada894d..c11c367 100644 --- a/docs/anise/reference/mathspec/interpolation/index.md +++ b/docs/anise/reference/mathspec/interpolation/index.md @@ -1,5 +1,6 @@ ANISE, like SPICE, heavily relies on interpolation for ephemeris and attitude trajectories. This section details each of the algorithms used in ANISE. +- [Covariance](./covariance.md) - [Chebyshev](./chebyshev.md) - [Hermite](./hermite.md) -- [Lagrange](./lagrange.md) \ No newline at end of file +- [Lagrange](./lagrange.md) diff --git a/docs/anise/reference/orbit.md b/docs/anise/reference/orbit.md index 72bec0c..8dcaad1 100644 --- a/docs/anise/reference/orbit.md +++ b/docs/anise/reference/orbit.md @@ -5,6 +5,7 @@ In ANISE, an `Orbit` represents the full state of an object at a specific time w ## The `Orbit` Struct An `Orbit` consists of: + - **State Vector**: Position and Velocity ($\mathbf{r}, \mathbf{v}$). - **Epoch**: The time at which the state is defined (using `hifitime`). - **Frame**: The reference frame in which the vectors are expressed. @@ -33,7 +34,9 @@ Defines a state relative to a body's surface. Useful for ground stations. Returns a new `Orbit` expressed in the `target_frame`. This accounts for both translation and rotation of the frames. ### Orbital Elements + You can extract orbital elements from an `Orbit` object: + - `sma_km()`, `ecc()`, `inc_deg()`, `raan_deg()`, `aop_deg()`, `ta_deg()` - **Other Anomalies**: `ma_deg()` (Mean Anomaly), `ea_deg()` (Eccentric Anomaly). - **Other Parameters**: `periapsis_km()`, `apoapsis_km()`, `hmag()` (Specific Angular Momentum). @@ -41,6 +44,8 @@ You can extract orbital elements from an `Orbit` object: ### Propagation (Two-Body) + ANISE provides basic two-body propagation for quick estimates: + - `at_epoch(new_epoch)`: Propagates the orbit to a new time using Keplerian motion. - **Warning**: For high-fidelity propagation including J2, solar radiation pressure, etc., use a dedicated propagator like those found in the `Nyx` library. diff --git a/docs/anise/tutorials/Tutorial 07 - Analysis.ipynb b/docs/anise/tutorials/Tutorial 07 - Analysis.ipynb new file mode 100644 index 0000000..15e9ac7 --- /dev/null +++ b/docs/anise/tutorials/Tutorial 07 - Analysis.ipynb @@ -0,0 +1,1629 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e4f3a8b2-1c4d-4e5f-9a1b-0e8c7d6a5b3a", + "metadata": {}, + "source": [ + "# Tutorial 07 - Analysis Module\n", + "\n", + "This tutorial covers the new analysis module introduced in ANISE version 0.8.0. We will explore:\n", + "1. **Report Building:** Creating complex scalar reports, generating data, and visualizing it with Polars and Plotly.\n", + "2. **Event Finding:** Finding discrete events like apoapsis, periapsis, and eclipse entry/exit.\n", + "3. **Event Arc Finding:** Detecting continuous events (arcs) like eclipses and sunset periods.\n", + "4. **Ground Contact Finders:** Using `LocationDhallSet` to define ground stations and finding visibility/communication arcs." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== SPK #0: `../../data/lro.bsp` ===\n", + "┌───────────────┬────────────────┬────────────┬───────────────────────────────────┬───────────────────────────────────┬──────────┬──────────────────────┐\n", + "│ Name │ Target │ Center │ Start epoch │ End epoch │ Duration │ Interpolation kind │\n", + "├───────────────┼────────────────┼────────────┼───────────────────────────────────┼───────────────────────────────────┼──────────┼──────────────────────┤\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-15T00:01:09.183418531 TDB │ 2023-12-16T00:01:09.183445764 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-16T00:01:09.183445766 TDB │ 2023-12-17T00:01:09.183473001 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-17T00:01:09.183473003 TDB │ 2023-12-18T00:01:09.183500753 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-18T00:01:09.183500755 TDB │ 2023-12-19T00:01:09.183528378 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-19T00:01:09.183528380 TDB │ 2023-12-20T00:01:09.183556262 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-20T00:01:09.183556264 TDB │ 2023-12-21T00:01:09.183584149 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-21T00:01:09.183584151 TDB │ 2023-12-22T00:01:09.183612293 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-22T00:01:09.183612295 TDB │ 2023-12-23T00:01:09.183640567 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-23T00:01:09.183640569 TDB │ 2023-12-24T00:01:09.183668972 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-24T00:01:09.183668974 TDB │ 2023-12-25T00:01:09.183697379 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-25T00:01:09.183697381 TDB │ 2023-12-26T00:01:09.183725917 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-26T00:01:09.183725919 TDB │ 2023-12-27T00:01:09.183754585 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-27T00:01:09.183754587 TDB │ 2023-12-28T00:01:09.183783255 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-28T00:01:09.183783257 TDB │ 2023-12-29T00:01:09.183812055 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-29T00:01:09.183812057 TDB │ 2023-12-30T00:01:09.183840858 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-30T00:01:09.183840860 TDB │ 2023-12-31T00:01:09.183869791 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2023-12-31T00:01:09.183869793 TDB │ 2024-01-01T00:01:09.183898599 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-01T00:01:09.183898601 TDB │ 2024-01-02T00:01:09.183927664 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-02T00:01:09.183927666 TDB │ 2024-01-03T00:01:09.183956604 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-03T00:01:09.183956606 TDB │ 2024-01-04T00:01:09.183985547 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-04T00:01:09.183985549 TDB │ 2024-01-05T00:01:09.184014491 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-05T00:01:09.184014493 TDB │ 2024-01-06T00:01:09.184043565 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-06T00:01:09.184043567 TDB │ 2024-01-07T00:01:09.184072515 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-07T00:01:09.184072517 TDB │ 2024-01-08T00:01:09.184101466 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-08T00:01:09.184101468 TDB │ 2024-01-09T00:01:09.184130420 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-09T00:01:09.184130422 TDB │ 2024-01-10T00:01:09.184159376 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-10T00:01:09.184159378 TDB │ 2024-01-11T00:01:09.184188206 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-11T00:01:09.184188208 TDB │ 2024-01-12T00:01:09.184216912 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-12T00:01:09.184216914 TDB │ 2024-01-13T00:01:09.184245618 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-13T00:01:09.184245620 TDB │ 2024-01-14T00:01:09.184274327 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-14T00:01:09.184274329 TDB │ 2024-01-15T00:01:09.184302911 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-15T00:01:09.184302913 TDB │ 2024-01-16T00:01:09.184331240 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-16T00:01:09.184331242 TDB │ 2024-01-17T00:01:09.184359700 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-17T00:01:09.184359702 TDB │ 2024-01-18T00:01:09.184387905 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-18T00:01:09.184387907 TDB │ 2024-01-19T00:01:09.184415986 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-19T00:01:09.184415988 TDB │ 2024-01-20T00:01:09.184443940 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-20T00:01:09.184443942 TDB │ 2024-01-21T00:01:09.184471769 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-21T00:01:09.184471771 TDB │ 2024-01-22T00:01:09.184499470 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-22T00:01:09.184499472 TDB │ 2024-01-23T00:01:09.184527175 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-23T00:01:09.184527177 TDB │ 2024-01-24T00:01:09.184554497 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-24T00:01:09.184554499 TDB │ 2024-01-25T00:01:09.184581694 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-25T00:01:09.184581696 TDB │ 2024-01-26T00:01:09.184608766 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-26T00:01:09.184608768 TDB │ 2024-01-27T00:01:09.184635583 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-27T00:01:09.184635585 TDB │ 2024-01-28T00:01:09.184662273 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-28T00:01:09.184662275 TDB │ 2024-01-29T00:01:09.184688710 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-29T00:01:09.184688712 TDB │ 2024-01-30T00:01:09.184714892 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 ��� 2024-01-30T00:01:09.184714894 TDB │ 2024-01-31T00:01:09.184740949 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-01-31T00:01:09.184740951 TDB │ 2024-02-01T00:01:09.184766751 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-01T00:01:09.184766753 TDB │ 2024-02-02T00:01:09.184792172 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-02T00:01:09.184792174 TDB │ 2024-02-03T00:01:09.184817595 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-03T00:01:09.184817597 TDB │ 2024-02-04T00:01:09.184842507 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-04T00:01:09.184842509 TDB │ 2024-02-05T00:01:09.184867292 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-05T00:01:09.184867294 TDB │ 2024-02-06T00:01:09.184891825 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-06T00:01:09.184891827 TDB │ 2024-02-07T00:01:09.184916102 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-07T00:01:09.184916104 TDB │ 2024-02-08T00:01:09.184939997 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-08T00:01:09.184939999 TDB │ 2024-02-09T00:01:09.184963766 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-09T00:01:09.184963768 TDB │ 2024-02-10T00:01:09.184987025 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-10T00:01:09.184987027 TDB │ 2024-02-11T00:01:09.185010157 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-11T00:01:09.185010159 TDB │ 2024-02-12T00:01:09.185032906 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-12T00:01:09.185032908 TDB │ 2024-02-13T00:01:09.185055402 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-13T00:01:09.185055404 TDB │ 2024-02-14T00:01:09.185077515 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-14T00:01:09.185077517 TDB │ 2024-02-15T00:01:09.185099245 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-15T00:01:09.185099247 TDB │ 2024-02-16T00:01:09.185120850 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-16T00:01:09.185120852 TDB │ 2024-02-17T00:01:09.185141943 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-17T00:01:09.185141945 TDB │ 2024-02-18T00:01:09.185162653 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-18T00:01:09.185162655 TDB │ 2024-02-19T00:01:09.185182982 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-19T00:01:09.185182984 TDB │ 2024-02-20T00:01:09.185203056 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-20T00:01:09.185203058 TDB │ 2024-02-21T00:01:09.185222746 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-21T00:01:09.185222748 TDB │ 2024-02-22T00:01:09.185241926 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-22T00:01:09.185241928 TDB │ 2024-02-23T00:01:09.185260851 TDB │ 1 day �� Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-23T00:01:09.185260853 TDB │ 2024-02-24T00:01:09.185279522 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-24T00:01:09.185279524 TDB │ 2024-02-25T00:01:09.185297554 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-25T00:01:09.185297556 TDB │ 2024-02-26T00:01:09.185315331 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-26T00:01:09.185315333 TDB │ 2024-02-27T00:01:09.185332596 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-27T00:01:09.185332598 TDB │ 2024-02-28T00:01:09.185349607 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-28T00:01:09.185349609 TDB │ 2024-02-29T00:01:09.185366107 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-02-29T00:01:09.185366109 TDB │ 2024-03-01T00:01:09.185382224 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-01T00:01:09.185382226 TDB │ 2024-03-02T00:01:09.185397958 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-02T00:01:09.185397960 TDB │ 2024-03-03T00:01:09.185413181 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-03T00:01:09.185413183 TDB │ 2024-03-04T00:01:09.185428021 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-04T00:01:09.185428023 TDB │ 2024-03-05T00:01:09.185442478 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-05T00:01:09.185442480 TDB │ 2024-03-06T00:01:09.185456422 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-06T00:01:09.185456424 TDB │ 2024-03-07T00:01:09.185469985 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-07T00:01:09.185469987 TDB │ 2024-03-08T00:01:09.185482908 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-08T00:01:09.185482910 TDB │ 2024-03-09T00:01:09.185495575 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-09T00:01:09.185495577 TDB │ 2024-03-10T00:01:09.185507731 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-10T00:01:09.185507733 TDB │ 2024-03-11T00:01:09.185519632 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-11T00:01:09.185519634 TDB │ 2024-03-12T00:01:09.185530765 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-12T00:01:09.185530767 TDB │ 2024-03-13T00:01:09.185541515 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-13T00:01:09.185541517 TDB │ 2024-03-14T00:01:09.185551881 TDB │ 1 day │ Hermite Unequal Step │\n", + "│ SPK_STATES_13 │ body -85 J2000 │ Moon J2000 │ 2024-03-14T00:01:09.185551883 TDB │ 2024-03-15T00:01:09.185561735 TDB │ 1 day │ Hermite Unequal Step │\n", + "└───────────────┴────────────────┴────────────┴───────────────────────────────────┴───────────────────────────────────┴──────────┴────���─────────────────┘\n", + "=== SPK #1: `../../data/de440s.bsp` ===\n", + "┌────────────────┬─────────────────────────────┬───────────────────────────────┬───────────────────────────────────┬───────────────────────────────────┬─────────────┬────────────────────┐\n", + "│ Name │ Target │ Center │ Start epoch │ End epoch │ Duration │ Interpolation kind │\n", + "├────────────────┼───────────────────────────��─┼───────────────────────────────┼───────────────────────────────────┼───────────────────────────────────┼─────────────┼────────────────────┤\n", + "│ DE-0440LE-0440 │ Mercury Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Venus Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Earth-Moon Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Mars Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Jupiter Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Saturn Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Uranus Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Neptune Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Pluto Barycenter J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Sun J2000 │ Solar System Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Moon J2000 │ Earth-Moon Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Earth J2000 │ Earth-Moon Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Mercury J2000 │ Mercury Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "│ DE-0440LE-0440 │ Venus J2000 │ Venus Barycenter J2000 │ 1849-12-26T00:00:00.000046619 TDB │ 2150-01-21T23:59:59.999955184 TDB │ 109600 days │ Chebyshev Triplet │\n", + "└────────────────┴─────────────────────────────┴───────────────────────────────┴───────────────────────────────────┴───────────────────────────────────┴─────────────┴────────────────────┘\n" + ] + } + ], + "source": [ + "import polars as pl\n", + "import plotly.express as px\n", + "from anise import (\n", + " Almanac,\n", + " Aberration,\n", + " LocationDhallSet,\n", + " LocationDhallSetEntry,\n", + " LocationDataSet,\n", + ")\n", + "from anise.astro import Location, TerrainMask, FrameUid, Frame\n", + "from anise.analysis import Event, Condition\n", + "import anise.analysis as analysis\n", + "from anise.time import Duration, Epoch, TimeSeries, Unit\n", + "from anise.constants import Frames, Orientations\n", + "\n", + "# Load the Almanac with necessary kernels\n", + "almanac = (\n", + " Almanac(\"../../data/de440s.bsp\")\n", + " .load(\"../../data/pck08.pca\")\n", + " .load(\"../../data/lro.bsp\")\n", + ")\n", + "almanac.describe(spk=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b2c3d4e5-f678-9012-3456-7890abcdef12", + "metadata": {}, + "source": [ + "## 1. Report Building\n", + "\n", + "We can define complex scalar expressions and generate reports over a time series. This is useful for analyzing orbital elements, geometric conditions, and custom calculations." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c3d4e5f6-7890-1234-5678-90abcdef1234", + "metadata": {}, + "outputs": [], + "source": [ + "target_frame = analysis.FrameSpec.Loaded(Frame(-85, Orientations.J2000))\n", + "observer_frame = analysis.FrameSpec.Loaded(Frames.MOON_J2000)\n", + "\n", + "state = analysis.StateSpec(\n", + " target_frame=target_frame,\n", + " observer_frame=observer_frame,\n", + " ab_corr=None,\n", + ")\n", + "\n", + "# Define a VNC (Velocity-Normal-Co-normal) Frame\n", + "vnc = analysis.OrthogonalFrame.XY(\n", + " x=analysis.VectorExpr.Unit(analysis.VectorExpr.Velocity(state)),\n", + " y=analysis.VectorExpr.Unit(analysis.VectorExpr.OrbitalMomentum(state)),\n", + ")\n", + "\n", + "sun_state = analysis.StateSpec(\n", + " target_frame=target_frame,\n", + " observer_frame=analysis.FrameSpec.Loaded(Frames.SUN_J2000),\n", + " ab_corr=Aberration(\"LT\"),\n", + ")\n", + "\n", + "# Project the Earth->Sun vector onto the VNC frame\n", + "proj = analysis.VectorExpr.Project(\n", + " v=analysis.VectorExpr.Negate(\n", + " analysis.VectorExpr.Unit(analysis.VectorExpr.Radius(sun_state))\n", + " ),\n", + " frame=vnc,\n", + " plane=analysis.Plane.XY,\n", + ")\n", + "\n", + "# Custom Local Solar Time (LST) Calculation using fundamental expressions\n", + "earth_sun = analysis.StateSpec(\n", + " target_frame=analysis.FrameSpec.Loaded(Frames.SUN_J2000),\n", + " observer_frame=observer_frame,\n", + " ab_corr=Aberration(\"LT\"),\n", + ")\n", + "u = analysis.VectorExpr.Unit(\n", + " analysis.VectorExpr.CrossProduct(\n", + " a=analysis.VectorExpr.Unit(analysis.VectorExpr.Radius(earth_sun)),\n", + " b=analysis.VectorExpr.Unit(analysis.VectorExpr.OrbitalMomentum(state)),\n", + " )\n", + ")\n", + "v = analysis.VectorExpr.CrossProduct(\n", + " a=analysis.VectorExpr.Unit(analysis.VectorExpr.OrbitalMomentum(state)), b=u\n", + ")\n", + "r = analysis.VectorExpr.Radius(state)\n", + "sin_theta = analysis.ScalarExpr.DotProduct(a=v, b=r)\n", + "cos_theta = analysis.ScalarExpr.DotProduct(a=u, b=r)\n", + "theta = analysis.ScalarExpr.Atan2(y=sin_theta, x=cos_theta)\n", + "lst_prod = analysis.ScalarExpr.Mul(\n", + " a=analysis.ScalarExpr.Mul(a=theta, b=analysis.ScalarExpr.Constant(1.0 / 180.0)),\n", + " b=analysis.ScalarExpr.Constant(12.0),\n", + ")\n", + "lst_add = analysis.ScalarExpr.Add(a=lst_prod, b=analysis.ScalarExpr.Constant(6.0))\n", + "lst = analysis.ScalarExpr.Modulo(v=lst_add, m=analysis.ScalarExpr.Constant(24.0))\n", + "\n", + "# Define scalars to report\n", + "scalars = [\n", + " analysis.ScalarExpr.Element(analysis.OrbitalElement.SemiMajorAxis),\n", + " analysis.ScalarExpr.Element(analysis.OrbitalElement.Eccentricity),\n", + " analysis.ScalarExpr.SolarEclipsePercentage(eclipsing_frame=Frames.VENUS_J2000),\n", + " analysis.ScalarExpr.VectorX(proj),\n", + " analysis.ScalarExpr.VectorY(proj),\n", + " analysis.ScalarExpr.VectorZ(proj),\n", + " analysis.ScalarExpr.LocalSolarTime(),\n", + " lst,\n", + "]\n", + "\n", + "# Set aliases for readable columns\n", + "scalars_with_aliases = [(s, None) for s in scalars]\n", + "scalars_with_aliases[3] = (scalars_with_aliases[3][0], \"proj VNC X\")\n", + "scalars_with_aliases[4] = (scalars_with_aliases[4][0], \"proj VNC Y\")\n", + "scalars_with_aliases[5] = (scalars_with_aliases[5][0], \"proj VNC Z\")\n", + "scalars_with_aliases[7] = (scalars_with_aliases[7][0], \"Custom LST (h)\")\n", + "\n", + "report = analysis.ReportScalars(scalars_with_aliases, state)" + ] + }, + { + "cell_type": "markdown", + "id": "d4e5f678-9012-3456-7890-abcdef123456", + "metadata": {}, + "source": [ + "Now we generate the data over a time series and convert it to a Polars DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e5f67890-1234-5678-90ab-cdef12345678", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "LRO valid from 2023-12-15T00:01:09.183425793 ET to 2024-03-15T00:01:09.185563263 ET\n", + "shape: (5, 9)\n", + "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", + "│ Epoch ┆ proj VNC ┆ local ┆ solar ┆ … ┆ Custom ┆ proj VNC ┆ SemiMajor ┆ proj VNC │\n", + "│ --- ┆ X ┆ solar ┆ eclipse ┆ ┆ LST (h) ┆ Y ┆ Axis (km) ┆ Z │\n", + "│ datetime[ ┆ --- ┆ time (h) ┆ due to ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", + "│ μs] ┆ f64 ┆ --- ┆ Venus ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", + "│ ┆ ┆ f64 ┆ Bar… ┆ ┆ ┆ ┆ ┆ │\n", + "│ ┆ ┆ ┆ --- ┆ ┆ ┆ ┆ ┆ │\n", + "│ ┆ ┆ ┆ f64 ┆ ┆ ┆ ┆ ┆ │\n", + "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", + "│ 2024-03-1 ┆ -0.382568 ┆ 21.345665 ┆ 0.0 ┆ … ┆ 21.345665 ┆ 0.753565 ┆ 1827.7867 ┆ -0.53235 │\n", + "│ 3 12:01:0 ┆ ┆ ┆ ┆ ┆ ┆ ┆ 98 ┆ 5 │\n", + "│ 9.185563 ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", + "│ 2024-03-1 ┆ -0.055965 ┆ 23.400991 ┆ 0.0 ┆ … ┆ 23.400991 ┆ 0.75363 ┆ 1828.0145 ┆ -0.65309 │\n", + "│ 3 12:11:0 ┆ ┆ ┆ ┆ ┆ ┆ ┆ 17 ┆ 6 │\n", + "│ 9.185563 ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", + "│ 2024-03-1 ┆ 0.287843 ┆ 1.474358 ┆ 0.0 ┆ … ┆ 1.474358 ┆ 0.753692 ┆ 1827.7419 ┆ -0.58883 │\n", + "│ 3 12:21:0 ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 ┆ 2 │\n", + "│ 9.185563 ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", + "│ 2024-03-1 ┆ 0.550096 ┆ 3.559474 ┆ 0.0 ┆ … ┆ 3.559474 ┆ 0.753795 ┆ 1827.3555 ┆ -0.35611 │\n", + "│ 3 12:31:0 ┆ ┆ ┆ ┆ ┆ ┆ ┆ 14 ┆ 7 │\n", + "│ 9.185563 ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", + "│ 2024-03-1 ┆ 0.654768 ┆ 5.647546 ┆ 0.0 ┆ … ┆ 5.647546 ┆ 0.753964 ┆ 1827.3668 ┆ -0.02131 │\n", + "│ 3 12:41:0 ┆ ┆ ┆ ┆ ┆ ┆ ┆ 86 ┆ │\n", + "│ 9.185563 ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ │\n", + "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n" + ] + } + ], + "source": [ + "lro_start, lro_stop = almanac.spk_domain(-85)\n", + "print(f\"LRO valid from {lro_start} to {lro_stop}\")\n", + "series = TimeSeries(\n", + " lro_stop - Unit.Day * 1.5,\n", + " lro_stop,\n", + " Unit.Minute * 10, # Higher resolution for plotting\n", + " inclusive=True,\n", + ")\n", + "\n", + "data = almanac.report_scalars(report, series)\n", + "\n", + "# Convert to Polars DataFrame\n", + "rows = []\n", + "for epoch_str, val_dict in data.items():\n", + " row = {\"Epoch\": epoch_str}\n", + " row.update(val_dict)\n", + " rows.append(row)\n", + "\n", + "df = pl.DataFrame(rows)\n", + "# Convert Epoch string to datetime for better plotting\n", + "df = df.with_columns(pl.col(\"Epoch\").str.to_datetime()).sort(\"Epoch\")\n", + "print(df.head())" + ] + }, + { + "cell_type": "markdown", + "id": "f6789012-3456-7890-abcd-ef1234567890", + "metadata": {}, + "source": [ + "Let's visualize the Custom LST vs Time." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "78901234-5678-90ab-cdef-1234567890ab", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "Epoch=%{x}
Custom LST (h)=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + "2024-03-13T12:01:09.185563", + "2024-03-13T12:11:09.185563", + "2024-03-13T12:21:09.185563", + "2024-03-13T12:31:09.185563", + "2024-03-13T12:41:09.185563", + "2024-03-13T12:51:09.185563", + "2024-03-13T13:01:09.185563", + "2024-03-13T13:11:09.185563", + "2024-03-13T13:21:09.185563", + "2024-03-13T13:31:09.185563", + "2024-03-13T13:41:09.185563", + "2024-03-13T13:51:09.185563", + "2024-03-13T14:01:09.185563", + "2024-03-13T14:11:09.185563", + "2024-03-13T14:21:09.185563", + "2024-03-13T14:31:09.185563", + "2024-03-13T14:41:09.185563", + "2024-03-13T14:51:09.185563", + "2024-03-13T15:01:09.185563", + "2024-03-13T15:11:09.185563", + "2024-03-13T15:21:09.185563", + "2024-03-13T15:31:09.185563", + "2024-03-13T15:41:09.185563", + "2024-03-13T15:51:09.185563", + "2024-03-13T16:01:09.185563", + "2024-03-13T16:11:09.185563", + "2024-03-13T16:21:09.185563", + "2024-03-13T16:31:09.185563", + "2024-03-13T16:41:09.185563", + "2024-03-13T16:51:09.185563", + "2024-03-13T17:01:09.185563", + "2024-03-13T17:11:09.185563", + "2024-03-13T17:21:09.185563", + "2024-03-13T17:31:09.185563", + "2024-03-13T17:41:09.185563", + "2024-03-13T17:51:09.185563", + "2024-03-13T18:01:09.185563", + "2024-03-13T18:11:09.185563", + "2024-03-13T18:21:09.185563", + "2024-03-13T18:31:09.185563", + "2024-03-13T18:41:09.185563", + "2024-03-13T18:51:09.185563", + "2024-03-13T19:01:09.185563", + "2024-03-13T19:11:09.185563", + "2024-03-13T19:21:09.185563", + "2024-03-13T19:31:09.185563", + "2024-03-13T19:41:09.185563", + "2024-03-13T19:51:09.185563", + "2024-03-13T20:01:09.185563", + "2024-03-13T20:11:09.185563", + "2024-03-13T20:21:09.185563", + "2024-03-13T20:31:09.185563", + "2024-03-13T20:41:09.185563", + "2024-03-13T20:51:09.185563", + "2024-03-13T21:01:09.185563", + "2024-03-13T21:11:09.185563", + "2024-03-13T21:21:09.185563", + "2024-03-13T21:31:09.185563", + "2024-03-13T21:41:09.185563", + "2024-03-13T21:51:09.185563", + "2024-03-13T22:01:09.185563", + "2024-03-13T22:11:09.185563", + "2024-03-13T22:21:09.185563", + "2024-03-13T22:31:09.185563", + "2024-03-13T22:41:09.185563", + "2024-03-13T22:51:09.185563", + "2024-03-13T23:01:09.185563", + "2024-03-13T23:11:09.185563", + "2024-03-13T23:21:09.185563", + "2024-03-13T23:31:09.185563", + "2024-03-13T23:41:09.185563", + "2024-03-13T23:51:09.185563", + "2024-03-14T00:01:09.185563", + "2024-03-14T00:11:09.185563", + "2024-03-14T00:21:09.185563", + "2024-03-14T00:31:09.185563", + "2024-03-14T00:41:09.185563", + "2024-03-14T00:51:09.185563", + "2024-03-14T01:01:09.185563", + "2024-03-14T01:11:09.185563", + "2024-03-14T01:21:09.185563", + "2024-03-14T01:31:09.185563", + "2024-03-14T01:41:09.185563", + "2024-03-14T01:51:09.185563", + "2024-03-14T02:01:09.185563", + "2024-03-14T02:11:09.185563", + "2024-03-14T02:21:09.185563", + "2024-03-14T02:31:09.185563", + "2024-03-14T02:41:09.185563", + "2024-03-14T02:51:09.185563", + "2024-03-14T03:01:09.185563", + "2024-03-14T03:11:09.185563", + "2024-03-14T03:21:09.185563", + "2024-03-14T03:31:09.185563", + "2024-03-14T03:41:09.185563", + "2024-03-14T03:51:09.185563", + "2024-03-14T04:01:09.185563", + "2024-03-14T04:11:09.185563", + "2024-03-14T04:21:09.185563", + "2024-03-14T04:31:09.185563", + "2024-03-14T04:41:09.185563", + "2024-03-14T04:51:09.185563", + "2024-03-14T05:01:09.185563", + "2024-03-14T05:11:09.185563", + "2024-03-14T05:21:09.185563", + "2024-03-14T05:31:09.185563", + "2024-03-14T05:41:09.185563", + "2024-03-14T05:51:09.185563", + "2024-03-14T06:01:09.185563", + "2024-03-14T06:11:09.185563", + "2024-03-14T06:21:09.185563", + "2024-03-14T06:31:09.185563", + "2024-03-14T06:41:09.185563", + "2024-03-14T06:51:09.185563", + "2024-03-14T07:01:09.185563", + "2024-03-14T07:11:09.185563", + "2024-03-14T07:21:09.185563", + "2024-03-14T07:31:09.185563", + "2024-03-14T07:41:09.185563", + "2024-03-14T07:51:09.185563", + "2024-03-14T08:01:09.185563", + "2024-03-14T08:11:09.185563", + "2024-03-14T08:21:09.185563", + "2024-03-14T08:31:09.185563", + "2024-03-14T08:41:09.185563", + "2024-03-14T08:51:09.185563", + "2024-03-14T09:01:09.185563", + "2024-03-14T09:11:09.185563", + "2024-03-14T09:21:09.185563", + "2024-03-14T09:31:09.185563", + "2024-03-14T09:41:09.185563", + "2024-03-14T09:51:09.185563", + "2024-03-14T10:01:09.185563", + "2024-03-14T10:11:09.185563", + "2024-03-14T10:21:09.185563", + "2024-03-14T10:31:09.185563", + "2024-03-14T10:41:09.185563", + "2024-03-14T10:51:09.185563", + "2024-03-14T11:01:09.185563", + "2024-03-14T11:11:09.185563", + "2024-03-14T11:21:09.185563", + "2024-03-14T11:31:09.185563", + "2024-03-14T11:41:09.185563", + "2024-03-14T11:51:09.185563", + "2024-03-14T12:01:09.185563", + "2024-03-14T12:11:09.185563", + "2024-03-14T12:21:09.185563", + "2024-03-14T12:31:09.185563", + "2024-03-14T12:41:09.185563", + "2024-03-14T12:51:09.185563", + "2024-03-14T13:01:09.185563", + "2024-03-14T13:11:09.185563", + "2024-03-14T13:21:09.185563", + "2024-03-14T13:31:09.185563", + "2024-03-14T13:41:09.185563", + "2024-03-14T13:51:09.185563", + "2024-03-14T14:01:09.185563", + "2024-03-14T14:11:09.185563", + "2024-03-14T14:21:09.185563", + "2024-03-14T14:31:09.185563", + "2024-03-14T14:41:09.185563", + "2024-03-14T14:51:09.185563", + "2024-03-14T15:01:09.185563", + "2024-03-14T15:11:09.185563", + "2024-03-14T15:21:09.185563", + "2024-03-14T15:31:09.185563", + "2024-03-14T15:41:09.185563", + "2024-03-14T15:51:09.185563", + "2024-03-14T16:01:09.185563", + "2024-03-14T16:11:09.185563", + "2024-03-14T16:21:09.185563", + "2024-03-14T16:31:09.185563", + "2024-03-14T16:41:09.185563", + "2024-03-14T16:51:09.185563", + "2024-03-14T17:01:09.185563", + "2024-03-14T17:11:09.185563", + "2024-03-14T17:21:09.185563", + "2024-03-14T17:31:09.185563", + "2024-03-14T17:41:09.185563", + "2024-03-14T17:51:09.185563", + "2024-03-14T18:01:09.185563", + "2024-03-14T18:11:09.185563", + "2024-03-14T18:21:09.185563", + "2024-03-14T18:31:09.185563", + "2024-03-14T18:41:09.185563", + "2024-03-14T18:51:09.185563", + "2024-03-14T19:01:09.185563", + "2024-03-14T19:11:09.185563", + "2024-03-14T19:21:09.185563", + "2024-03-14T19:31:09.185563", + "2024-03-14T19:41:09.185563", + "2024-03-14T19:51:09.185563", + "2024-03-14T20:01:09.185563", + "2024-03-14T20:11:09.185563", + "2024-03-14T20:21:09.185563", + "2024-03-14T20:31:09.185563", + "2024-03-14T20:41:09.185563", + "2024-03-14T20:51:09.185563", + "2024-03-14T21:01:09.185563", + "2024-03-14T21:11:09.185563", + "2024-03-14T21:21:09.185563", + "2024-03-14T21:31:09.185563", + "2024-03-14T21:41:09.185563", + "2024-03-14T21:51:09.185563", + "2024-03-14T22:01:09.185563", + "2024-03-14T22:11:09.185563", + "2024-03-14T22:21:09.185563", + "2024-03-14T22:31:09.185563", + "2024-03-14T22:41:09.185563", + "2024-03-14T22:51:09.185563", + "2024-03-14T23:01:09.185563", + "2024-03-14T23:11:09.185563", + "2024-03-14T23:21:09.185563", + "2024-03-14T23:31:09.185563", + "2024-03-14T23:41:09.185563", + "2024-03-14T23:51:09.185563", + "2024-03-15T00:01:09.185563" + ], + "xaxis": "x", + "y": { + "bdata": "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", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Custom Local Solar Time over Time" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Epoch" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Custom LST (h)" + } + } + } + }, + "image/png": "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qSZAo0iqQ4DvJwESyAQC1JEESIAESIAESIAESIAESCCABGgUCWCgUCQSMJsApScBEiABEiABEiABEiABEiABMwjQKGJGOFHKoBKgXCRAAiRAAiRAAiRAAiRAAiRAAsYSoFHE2KCrfcH5RhIgARIgARIgARIgARIgARIgARJIJwI0iiQOTZ4lARIgARIgARIgARIgARIgARIgARJIcwJZImmuIdUjARIgARIgARIgARIgARIgARIgARIQEUKIJ8CRIvFEeEwCJEACJEACJEACJEACJEACJGA+AWpAAhUgQKNIBSDxEhIgARIgARIgARIgARIgARIIMgHKRgIkUDUCNIpUjRvvIgESIAESIAESIAESIAESSA0BvpUESIAEqo0AjSLVhpIPIgESIAESIAESIAESIIHqJsDnkQAJkAAJ1CQBGkVqki6fTQIkQAIkQAIkQAIkUHECvJIESIAESIAEapkAjSK1DJyvIwESIAESIAES2D0Cp4+eKO9++OXuPSQAd1MEEiABEiABEiCB1BOgUST1YUAJSIAESIAESMAoAstWrpGefYfv5J55eUp5evA8CZAACZAACZAACQSSAI0igQwWCkUCJEACJGAugcyR/Nupj8msj5723HmnD8gc5akpCZAACZAACZBAWhCgUSQtgpFKkAAJkECKCPC1JJCAwJ0PPS8YNTL55Sky6LdXSd9hl8p9j70i0WiJd/XaXzbK+Il/lcOGXCCDz71abnvwOdm46VfPHztTPvpKxlx5j/QZNFbOvfhWmTFnEU7bDveff9ntcuCA0XLy+dfJv979r32ePyRAAiRAAiRAAiRQGQI0ilSGFq8lARLIaAJUngRIoOIEHn7mddm+o1ief/gGuXfihTLloy/l2Ven2g8oLS2VUX+8Sxrm1pN/PXWL/OWWSwRGjrFX32v742eKZRC5edJkOePEY+WDlyfJiLNOkL32bAQv2z3x/Fvym5P7yQevTJLzzzxBrrv9cflx+Wrbjz8kQAIkQAIkQAIkUFECNIpUlBSvI4HMIkBtSYAESGCXBHofPypmXZH5i5Z593Tt2EZGnTNEGjdsIL336Sajf3ui/OsdZzTH/76ZJT+vWS/XX/o7adF8T+nUvpXcfOUImbvgR5k5b7H9jL9bBpThZw6Ufkf1ltwG9eTYww+QNi2b2X74GdC3jwzoe7D9/FMGHil5XdrJF9Nnw4uOBEiABEiABEiABCpMgEaRCqPihelLgJqRAAmQAAlUhcAjd1wuT066ynNtWzX3HtOhbQtvEMuPaQAABShJREFUHzs9uneUn1Y4IzkwoqNb57aSE86Gl+3q16srHdq0kIVLVtjHC5eukF55nez9RD/drfv959tb924t2u4/xX0SIAESIAESIAES2CUBGkV2iSjNLqA6JEACJEACJFBNBPockC+HHFDgufr19vCeHIlEvX3sYMqMuuLiCE4ldDnhsH2+tKTU3pb3AyNKeX48TwIkQAIkQAIkQAIVJZDWRpGKQuB1JEACJEACJEAC1Utg0Y8rYx44p3CpYCRJKBSSju1aSuGiZVLsM5xsLdomS5atkk7tW9r3dbCumV24xN7nDwmQAAmQAAmQAAnsikBV/WkUqSo53kcCJEACJEACJFAugUVLV8iTL7xtf1Fmy69F8tQL78iwIcfY1x96YE9p0jhX/nzfZHttkcWWAWXCnU/Kfj26SEG3DvY1Z5/az77n4/99L7h/+sxCwXW2J39IgARIgARIILMJUPtqJECjSDXC5KNIgARIgARIIJMIxC+0is/wqv4nDzxSvv2hUA4/6UI58bxrpP/RB8pvh/6f7Z0Tzpan77tGMJ3mjDETZfilt0udnBy5/6aLbX/8nHT8EXLpqNMFX5k54qSLZOxV98r6jVvgRUcCJEACJJBRBKgsCdQsARpFapYvn04CJEACJEACaUcA02BmffS0xLvzTh/g6VpaUiJ/ufUS+5oPX7lPxo0cJtnZZdWOvZs1kZuuGCEfv3a/7W67dpQ9esR7gLUzbPDRMvmBa+X795+QL9562P6KjXVaXn50ogw8tg92PXffTReJ//2eB3dIgARIwCQClJUESKDWCWTV+hv5QhIgARIgARIggbQnUJp8ndS0158KkgAJ7JoAryABEiCBIBCgUSQIoUAZSIAESIAESIAESIAE0pkAdSMBEiABEggoARpFAhowFIsESIAESIAESIAEzCRAqUmABEiABEjAHAI0ipgTVpSUBEiABEiABIwgcOWFZ8nEPw43QtbdFpIPIAESIAESIAESMJoAjSJGBx+FJwESIAESIIHaI8A3kQAJkAAJkAAJkEC6EaBRJN1ClPqQAAmQAAlUBwE+gwRIgARIgARIgARIIAMI0CiSAYFMFUmABEggOQH6kgAJkAAJkAAJkAAJkEBmEqBRJDPDnVqTQOYSoOYkQAIkQAIkQAIkQAIkQAIk4BKgUcQFwQ0JpCMB6kQCJEACJEACJEACJEACJEACJFA+ARpFymdDH7MIUFoSIAESIAESIAESIAESIAESIAESqBQBGkUqhSsoF1MOEiABEiABEiABEiABEiABEiABEiCB3SUQfKPI7mrI+0mABEiABEiABEiABEiABEiABEiABIJPIAUS0iiSAuh8JQmQAAmQAAmQAAmQAAmQAAmQQGYToPbBIECjSDDCgVKQAAmQAAmQAAmQAAmQAAmQQLoSoF4kEFgCNIoENmgoGAmQAAmQAAmQAAmQAAmQgHkEKDEJkIBJBGgUMSm0KCsJkAAJkAAJkAAJkAAJBIkAZSEBEiABwwnQKGJ4AFJ8EiABEiABEiABEiCB2iHAt5AACZAACaQfARpF0i9MqREJkAAJkAAJkAAJ7C4B3k8CJEACJEACGUGARpGMCGYqSQIkQAIkQAIkUD4B+pAACZAACZAACWQqARpFMjXkqTcJkAAJkEBmEqDWJEACJEACJEACJEACHgEaRTwU3CEBEiABEkg3AtSHBEiABEiABEiABEiABJIRoFEkGR36kQAJkIA5BCgpCZAACZAACZAACZAACZBAJQn8PwAAAP//hdP6RwAAAAZJREFUAwBBTMqwFj6s2gAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = px.line(df, x=\"Epoch\", y=\"Custom LST (h)\", title=\"Custom Local Solar Time over Time\")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "89012345-6789-0abc-def1-234567890abc", + "metadata": {}, + "source": [ + "## 2. Event Finding\n", + "\n", + "We can search for discrete events such as apoapsis, periapsis, or specific geometric conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "90123456-7890-abcd-ef12-34567890abcd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Searching events from 2023-12-15T00:01:09.183425793 ET to 2023-12-17T00:01:09.183425793 ET\n", + "Found 25 apoapsis events.\n", + "Found 24 periapsis events.\n", + "Apoapsis 1: 2023-12-15T00:07:04.599486254 ET\n", + "Apoapsis 2: 2023-12-15T02:05:09.311922236 ET\n", + "Apoapsis 3: 2023-12-15T04:03:14.118872647 ET\n" + ] + } + ], + "source": [ + "lro_frame = Frame(-85, 1) # LRO NAIF ID\n", + "lro_state_spec = analysis.StateSpec(\n", + " target_frame=analysis.FrameSpec.Loaded(lro_frame),\n", + " observer_frame=analysis.FrameSpec.Loaded(Frames.MOON_J2000),\n", + " ab_corr=None,\n", + ")\n", + "\n", + "apolune = Event.apoapsis()\n", + "perilune = Event.periapsis()\n", + "\n", + "start_epoch, end_epoch = almanac.spk_domain(-85)\n", + "# Search over a shorter window\n", + "search_end = start_epoch + Unit.Day * 2\n", + "\n", + "print(f\"Searching events from {start_epoch} to {search_end}\")\n", + "\n", + "apo_events = almanac.report_events(lro_state_spec, apolune, start_epoch, search_end)\n", + "print(f\"Found {len(apo_events)} apoapsis events.\")\n", + "\n", + "peri_events = almanac.report_events(lro_state_spec, perilune, start_epoch, search_end)\n", + "print(f\"Found {len(peri_events)} periapsis events.\")\n", + "\n", + "# Print first few events\n", + "for i, event in enumerate(apo_events[:3]):\n", + " print(f\"Apoapsis {i+1}: {event.orbit.epoch}\")" + ] + }, + { + "cell_type": "markdown", + "id": "01234567-890a-bcde-f123-4567890abcde", + "metadata": {}, + "source": [ + "## 3. Event Arc Finding\n", + "\n", + "Event arcs represent continuous periods where a condition is met, such as being in eclipse or having the sun set." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "12345678-90ab-cdef-1234-567890abcdef", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 11 sunset arcs.\n", + "Found 25 eclipse arcs.\n", + "First eclipse duration: 39 min 12 s 806 ms 171 μs 252 ns\n" + ] + } + ], + "source": [ + "sun_has_set = analysis.Event(\n", + " analysis.ScalarExpr.SunAngle(observer_id=-85),\n", + " Condition.LessThan(90.0),\n", + " Unit.Second * 0.5,\n", + " ab_corr=None,\n", + ")\n", + "eclipse = Event.total_eclipse(Frames.MOON_J2000)\n", + "\n", + "sunset_arcs = almanac.report_event_arcs(lro_state_spec, sun_has_set, start_epoch, search_end)\n", + "print(f\"Found {len(sunset_arcs)} sunset arcs.\")\n", + "\n", + "eclipse_arcs = almanac.report_event_arcs(lro_state_spec, eclipse, start_epoch, search_end)\n", + "print(f\"Found {len(eclipse_arcs)} eclipse arcs.\")\n", + "\n", + "if eclipse_arcs:\n", + " print(f\"First eclipse duration: {eclipse_arcs[0].duration()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "23456789-0abc-def1-2345-67890abcdef1", + "metadata": {}, + "source": [ + "## 4. Ground Contact Finders\n", + "\n", + "We can simulate ground station visibility by defining locations and masks." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "34567890-abcd-ef12-3456-7890abcdef12", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[save_as] overwriting tutorial_loc_kernel.lka\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1 Comm arcs (1 day).\n", + "First pass duration: 8 h 56 min 55 s 251 ms 300 μs 749 ns\n", + "Pass location: DSS65 (#1)\n", + "Number of AER data points: 54\n" + ] + } + ], + "source": [ + "# Define a ground station (DSS65)\n", + "mask = [TerrainMask(0.0, 5.0), TerrainMask(35.0, 10.0), TerrainMask(270.0, 3.0)]\n", + "dss65 = Location(\n", + " 40.427_222,\n", + " 4.250_556,\n", + " 0.834_939,\n", + " FrameUid(399, 399),\n", + " mask,\n", + " terrain_mask_ignored=True,\n", + ")\n", + "\n", + "# Create and save an LKA (Location Kernel Anise) file\n", + "entry = LocationDhallSetEntry(dss65, id=1, alias=\"DSS65\")\n", + "dhallset = LocationDhallSet([entry])\n", + "dataset = dhallset.to_dataset()\n", + "lka_path = \"tutorial_loc_kernel.lka\"\n", + "dataset.save_as(lka_path, True)\n", + "\n", + "# Load the LKA into the Almanac\n", + "almanac = almanac.load(lka_path)\n", + "\n", + "# Find visibility arcs\n", + "horizon = Event.visible_from_location_id(1)\n", + "\n", + "comm_arcs = almanac.report_event_arcs(\n", + " lro_state_spec, horizon, start_epoch, start_epoch + Unit.Day * 1\n", + ")\n", + "print(f\"Found {len(comm_arcs)} Comm arcs (1 day).\")\n", + "\n", + "# More detailed visibility report\n", + "visibility_arcs = almanac.report_visibility_arcs(\n", + " lro_state_spec, 1, start_epoch, start_epoch + Unit.Day * 1, Unit.Minute * 10, None\n", + ")\n", + "\n", + "if visibility_arcs:\n", + " first_pass = visibility_arcs[0]\n", + " print(f\"First pass duration: {first_pass.duration()}\")\n", + " print(f\"Pass location: {first_pass.location_ref}\")\n", + " \n", + " # Access AER (Azimuth, Elevation, Range) data\n", + " print(f\"Number of AER data points: {len(first_pass.aer_data)}\")\n", + "else:\n", + " print(\"No visibility arcs found.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ce5aa82-06cf-4a13-8f33-198f652a7e18", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/anise/tutorials/Tutorial 08 - OEM and Covariance.ipynb b/docs/anise/tutorials/Tutorial 08 - OEM and Covariance.ipynb new file mode 100644 index 0000000..9fa1bd6 --- /dev/null +++ b/docs/anise/tutorials/Tutorial 08 - OEM and Covariance.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1a2b3c4d-5e6f-7890-1234-567890abcdef", + "metadata": {}, + "source": [ + "# Tutorial 08 - OEM Files and Covariance\n", + "\n", + "In version 0.9.0, ANISE introduces the ability to read CCSDS OEM (Orbit Ephemeris Message) files and interpolate them, including covariance data. This tutorial demonstrates:\n", + "\n", + "1. **Reading an OEM File:** Loading an OEM file into an `Ephemeris` object.\n", + "2. **Interpolation:** Querying state and covariance at arbitrary times.\n", + "3. **Covariance Frames:** Accessing covariance in different frames (RIC, Inertial, etc.).\n", + "4. **Event Integration:** Combining OEM data with event finding to query covariance at specific event times." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "2b3c4d5e-6f78-9012-3456-7890abcdef12", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "=== PLANETARY DATA #0: `../../data/pck08.pca` ===\n", + "┌───────┬─────────┬──────────────────────────┬─────────────────┬─────────────────┬─────────────────┬───────────────────────┬─────────────────────┬────────────────────────────────────────────────────────┐\n", + "│ Name │ ID │ Gravity param (km^3/s^2) │ Major axis (km) │ Minor axis (km) │ Polar axis (km) │ Pole right asc. │ Pole declination │ Prime meridian │\n", + "├───────┼─────────┼───────────────────��──────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 1 │ 22031.78000000002 │ 2439.7 │ 2439.7 │ 2439.7 │ 281.01 + -0.033 t │ 61.45 + -0.005 t │ 329.548 + 6.1385025 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 2 │ 324858.59200000006 │ 6051.8 │ 6051.8 │ 6051.8 │ 272.76 + 0 t │ 67.16 + 0 t │ 160.2 + -1.4813688 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼───���────────────────────────────────────────────────────┤\n", + "│ Unset │ 3 │ 403503.2355022598 │ Unset │ Unset │ Unset │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 4 │ 42828.37521400002 │ Unset │ Unset │ Unset │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 5 │ 126712764.8000002 │ Unset │ Unset │ Unset │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 6 │ 37940585.2 │ Unset │ Unset │ Unset │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────���───────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 7 │ 5794548.600000008 │ Unset │ Unset │ Unset │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼──────────��──────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 8 │ 6836527.100580024 │ Unset │ Unset │ Unset │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 10 │ 132712440041.93938 │ 696000 │ 696000 │ 696000 │ 286.13 + 0 t │ 63.87 + 0 t │ 84.1 + 14.1844 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 301 │ 4902.800066163796 │ 1737.4 │ 1737.4 │ 1737.4 │ 269.9949 + 0.0031 t │ 66.5392 + 0.013 t │ 38.3213 + 13.17635815 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 399 │ 398600.435436096 │ 6378.14 │ 6378.14 │ 6356.75 │ 0 + -0.641 t │ 90 + -0.557 t │ 190.147 + 360.9856235 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 401 │ 0.0007087546066894452 │ 13.4 │ 11.2 │ 9.2 │ 317.68 + -0.108 t │ 52.9 + -0.061 t │ 35.06 + 1128.844585 t + 0.000000006644300993056522 t^2 │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 402 │ 0.00009615569648120313 │ 7.5 │ 6.1 │ 5.2 │ 316.65 + -0.108 t │ 53.52 + -0.061 t │ 79.41 + 285.161897 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────���───────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 499 │ 42828.37362069909 │ 3396.19 │ 3396.19 │ 3376.2 │ 317.68143 + -0.1061 t │ 52.8865 + -0.0609 t │ 176.63 + 350.89198226 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼��───────────────────────────────────────────────────────┤\n", + "│ Unset │ 501 │ 5959.916033410404 │ 1829.4 │ 1819.3 │ 1815.7 │ 268.05 + -0.009 t │ 64.5 + 0.003 t │ 200.39 + 203.4889538 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 502 │ 3202.738774922892 │ 1564.13 │ 1561.23 │ 1560.93 │ 268.08 + -0.009 t │ 64.51 + 0.003 t │ 36.022 + 101.3747235 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 503 │ 9887.834453334144 │ 2632.4 │ 2632.29 │ 2632.35 │ 268.2 + -0.009 t │ 64.57 + 0.003 t ��� 44.064 + 50.3176081 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 504 │ 7179.28936139727 │ 2409.4 │ 2409.2 │ 2409.3 │ 268.72 + -0.009 t │ 64.83 + 0.003 t │ 259.51 + 21.5710715 t │\n", + "├───────┼─────────┼───────────────��──────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 505 │ 0.1378480571202615 │ 125 │ 73 │ 64 │ 268.05 + -0.009 t │ 64.49 + 0.003 t │ 231.67 + 722.631456 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 599 │ 126686534.9218008 │ 71492 │ 71492 │ 66854 │ 268.05 + -0.009 t │ 64.49 + 0.003 t │ 284.95 + 870.536642 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────���────────────────────────────────────────────────────────┤\n", + "│ Unset │ 601 │ 2.503522884661795 │ 209.1 │ 196.2 │ 191.4 │ 40.66 + -0.036 t │ 83.52 + -0.004 t │ 337.46 + 381.994555 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼──────────────────────────────────────────────────────��─┤\n", + "│ Unset │ 602 │ 7.211292085479989 │ 256.3 │ 247.3 │ 244.6 │ 40.66 + -0.036 t │ 83.52 + -0.004 t │ 2.82 + 262.7318996 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 603 │ 41.21117207701302 │ 535.6 │ 528.2 │ 525.8 │ 40.66 + -0.036 t │ 83.52 + -0.004 t │ 10.45 + 190.6979085 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 604 │ 73.11635322923193 │ 560 │ 560 │ 560 │ 40.66 + -0.036 t │ 83.52 + -0.004 t │ 357 + 131.5349316 t │\n", + "├───────┼─────────┼──────────────���───────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 605 │ 153.9422045545342 │ 764 │ 764 │ 764 │ 40.38 + -0.036 t │ 83.55 + -0.004 t │ 235.16 + 79.6900478 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼──────��──────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 606 │ 8978.138845307376 │ 2575 │ 2575 │ 2575 │ 36.41 + -0.036 t │ 83.94 + -0.004 t │ 189.64 + 22.5769768 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 607 │ 0.3718791714191668 │ 164 │ 130 │ 107 │ Unset │ Unset │ Unset │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼─────────────────────────────────────────────────────���──┤\n", + "│ Unset │ 608 │ 120.5134781724041 │ 718 │ 718 │ 718 │ 318.16 + -3.949 t │ 75.03 + -1.143 t │ 350.2 + 4.5379572 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 609 │ 0.5531110414633374 │ 115 │ 110 │ 105 │ 355 + 0 t │ 68.7 + 0 t │ 304.7 + 930.833872 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 610 │ 0.1266231296945636 │ 97 │ 95 │ 77 │ 40.58 + -0.036 t │ 83.52 + -0.004 t │ 58.83 + 518.2359876 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────────────────┼───────────────────────┼─────────────────────┼────────────────────────────────────────────────────────┤\n", + "│ Unset │ 611 │ 0.03513977490568457 │ 69 │ 55 │ 55 │ 40.58 + -0.036 t │ 83.52 + -0.004 t │ 293.87 + 518.4907239 t │\n", + "├───────┼─────────┼──────────────────────────┼─────────────────┼─────────────────┼─────�" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "from anise import Almanac\n", + "from anise.astro import Ephemeris, LocalFrame, DataType, Orbit, Frame\n", + "from anise.constants import Frames\n", + "from anise.time import Epoch, Unit\n", + "from anise.analysis import Event, StateSpec, FrameSpec\n", + "\n", + "# Load a base Almanac (for frame definitions)\n", + "almanac = Almanac(\"../../data/pck08.pca\")\n", + "almanac.describe()" + ] + }, + { + "cell_type": "markdown", + "id": "3c4d5e6f-7890-1234-5678-90abcdef1234", + "metadata": {}, + "source": [ + "## 1. Reading an OEM File\n", + "\n", + "We can load an OEM file directly into an `Ephemeris` object. This object holds the interpolated data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4d5e6f78-9012-3456-7890-abcdef123456", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading OEM from ../../data/tests/ccsds/oem/LRO_Nyx.oem\n", + "Ephemeris loaded:\n", + "2010-LRO ephem from 2024-01-01T00:00:00 UTC to 2024-01-01T00:03:00 UTC (4 states, spans 3 min)\n", + "Domain: 2024-01-01T00:00:00 UTC to 2024-01-01T00:03:00 UTC\n" + ] + } + ], + "source": [ + "oem_path = \"../../data/tests/ccsds/oem/LRO_Nyx.oem\"\n", + "print(f\"Loading OEM from {oem_path}\")\n", + "\n", + "ephem = Ephemeris.from_ccsds_oem_file(oem_path)\n", + "print(\"Ephemeris loaded:\")\n", + "print(ephem)\n", + "\n", + "(start, end) = ephem.domain()\n", + "print(f\"Domain: {start} to {end}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5e6f7890-1234-5678-90ab-cdef12345678", + "metadata": {}, + "source": [ + "## 2. Interpolation and Covariance\n", + "\n", + "We can query the covariance at any time within the domain. ANISE supports transforming the covariance into various local frames:\n", + "- **RIC (Radial, In-track, Cross-track):** Also known as RTN.\n", + "- **Inertial:** The frame in which the data is defined (usually J2000).\n", + "- **VNC (Velocity, Normal, Co-normal):** Useful for maneuver planning.\n", + "- **RCN:** Radial, Cross-track, Normal." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "6f789012-3456-7890-abcd-ef1234567890", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Querying covariance at 2024-01-01T00:01:30 UTC\n", + "\n", + "Covariance (RIC):\n", + "Covariance in RIC\n", + " ┌ ┐\n", + " │ 0.962697 0.417577 -0.432062 0.004468 0.002043 -0.001881 │\n", + " │ 0.417577 0.672621 0.372849 0.002017 0.003435 0.001994 │\n", + " │ -0.432062 0.372849 0.832859 -0.001914 0.001990 0.004048 │\n", + " │ 0.004468 0.002017 -0.001914 0.000059 0.000024 -0.000022 │\n", + " │ 0.002043 0.003435 0.001990 0.000024 0.000036 0.000020 │\n", + " │ -0.001881 0.001994 0.004048 -0.000022 0.000020 0.000044 │\n", + " └ ┘\n", + "\n", + "\n", + "\n", + "Covariance (Inertial):\n", + "Covariance in Inertial\n", + " ┌ ┐\n", + " │ 0.221927 0.425854 0.264891 0.001022 0.001972 0.001206 │\n", + " │ 0.425854 1.115708 0.013385 0.001966 0.005345 -0.000217 │\n", + " │ 0.264891 0.013385 1.138789 0.001213 -0.000234 0.005647 │\n", + " │ 0.001022 0.001966 0.001213 0.000011 0.000022 0.000013 │\n", + " │ 0.001972 0.005345 -0.000234 0.000022 0.000062 0.000004 │\n", + " │ 0.001206 -0.000217 0.005647 0.000013 0.000004 0.000067 │\n", + " └ ┘\n", + "\n", + "\n" + ] + } + ], + "source": [ + "query_time = start + (end - start) * 0.5\n", + "print(f\"Querying covariance at {query_time}\")\n", + "\n", + "# Covariance in RIC frame\n", + "covar_ric = ephem.covar_at(query_time, LocalFrame.RIC, almanac)\n", + "print(\"\\nCovariance (RIC):\")\n", + "print(covar_ric)\n", + "\n", + "# Covariance in Inertial frame\n", + "covar_inertial = ephem.covar_at(query_time, LocalFrame.Inertial, almanac)\n", + "print(\"\\nCovariance (Inertial):\")\n", + "print(covar_inertial)" + ] + }, + { + "cell_type": "markdown", + "id": "78901234-5678-90ab-cdef-1234567890ab", + "metadata": {}, + "source": [ + "## 3. Combining with Event Finding\n", + "\n", + "A powerful workflow is to find events using the `Almanac` and then inspect the covariance at those specific times.\n", + "\n", + "First, we load the OEM into an `Almanac`. We must provide a NAIF ID for the object in the OEM file (e.g., LRO is -85)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "89012345-6789-0abc-def1-234567890abc", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ephemeris contains covariance, which is NOT copied to the SPICE BSP file\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Almanac created from OEM:\n", + "=== SPK #0: `2025-12-29T21:07:33.292829705 UTC` ===\n", + "┌─────────────────────────────────────────┬────────────────┬────────────┬───────────────────────────────────┬───────────────────────────────────┬──────────┬──────────────────────┐\n", + "│ Name │ Target │ Center │ Start epoch │ End epoch │ Duration │ Interpolation kind │\n", + "├─────────────────────────────────────────┼────────────────┼───────────���┼───────────────────────────────────┼───────────────────────────────────┼──────────┼──────────────────────┤\n", + "│ 2010-LRO (converted by Nyx Space ANISE) │ body -85 J2000 │ Moon J2000 │ 2024-01-01T00:01:09.183898601 TDB │ 2024-01-01T00:04:09.183898727 TDB │ 3 min │ Hermite Unequal Step │\n", + "└─────────────────────────────────────────┴────────────────┴────────────┴───────────────────────────────────┴───────────────────────────────────┴──────────┴──────────────────────┘\n" + ] + } + ], + "source": [ + "lro_id = -85\n", + "# Load OEM into a new Almanac, assigning it the LRO ID\n", + "almanac_oem = Almanac.from_ccsds_oem_file(oem_path, lro_id)\n", + "# Load PCK for frame definitions (needed for event finding involving other bodies or frames)\n", + "almanac_oem = almanac_oem.load(\"../../data/pck08.pca\")\n", + "\n", + "print(\"Almanac created from OEM:\")\n", + "almanac_oem.describe(spk=True)" + ] + }, + { + "cell_type": "markdown", + "id": "90123456-7890-abcd-ef12-34567890abcd", + "metadata": {}, + "source": [ + "Now we define an event, for example, finding apoapsis events... of which there are none because there is only 3 min of data in this ephem" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "01234567-890a-bcde-f123-4567890abcde", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Searching for apoapsis events...\n", + "Found 0 apoapsis events.\n" + ] + } + ], + "source": [ + "lro_frame = Frame(lro_id, 1) # Assuming J2000 orientation\n", + "moon_frame = Frames.MOON_J2000\n", + "\n", + "lro_state_spec = StateSpec(\n", + " target_frame=FrameSpec.Loaded(lro_frame),\n", + " observer_frame=FrameSpec.Loaded(moon_frame),\n", + " ab_corr=None,\n", + ")\n", + "\n", + "apolune = Event.apoapsis()\n", + "\n", + "print(f\"Searching for apoapsis events...\")\n", + "apo_events = almanac_oem.report_events(lro_state_spec, apolune, start, end)\n", + "print(f\"Found {len(apo_events)} apoapsis events.\")" + ] + }, + { + "cell_type": "markdown", + "id": "12345678-90ab-cdef-1234-567890abcdef", + "metadata": {}, + "source": [ + "Finally, we iterate through the found events and query the covariance from the original `Ephemeris` object at each event time." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "23456789-0abc-def1-2345-67890abcdef1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Querying covariance at event times:\n" + ] + } + ], + "source": [ + "print(\"Querying covariance at event times:\")\n", + "for i, event in enumerate(apo_events):\n", + " event_time = event.orbit.epoch\n", + " \n", + " # Query covariance in RIC frame\n", + " cov = ephem.covar_at(event_time, LocalFrame.RIC, almanac_oem)\n", + " \n", + " print(f\"\\nEvent {i+1} at {event_time}:\")\n", + " print(cov)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e037b68-6298-4ba6-b226-eea5d258cbef", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/blog/posts/2026.01.14-anise-0.9.0.md b/docs/blog/posts/2026.01.14-anise-0.9.0.md new file mode 100644 index 0000000..14dea71 --- /dev/null +++ b/docs/blog/posts/2026.01.14-anise-0.9.0.md @@ -0,0 +1,45 @@ +--- +authors: + - me +date: 2026-01-14 +categories: + - Astrodynamics + - ANISE +readtime: 2 +--- + +# 🚀 ANISE 0.9.0: Support CCSDS OEM; STK .e; Covariance interpolation; Instrument Field of View + +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. + +_Covariance interpolation MathSpec available [here](../../anise/reference/mathspec/interpolation/covariance.md)._ + +## 🔭 Instrument & Field of View (Beta) + +* **New Module:** Introduced `anise.instrument` containing `Instrument` and `FovShape` classes. +* **Analysis:** Added `FovMargin` and `FovMarginToLocation` to the scalar expression engine for event finding and reporting. +* **Visual Validation:** Added `tests/fov_plots.py` demonstrating 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()` and `Almanac.load_stk_e_file()` to ingest Ansys STK `.e` ephemeris 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()` and `bpc_swap()` to the `Almanac`. +* 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()` and `bpc_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_deg` documentation to explicitly define conjunction/opposition geometry and illumination phases. +* **Numpy Integration:** `Orbit` constructors now accept native `numpy.array` inputs for state vectors. diff --git a/docs/stylesheets/extras.css b/docs/stylesheets/extras.css index 4f2b1de..ea49d7e 100644 --- a/docs/stylesheets/extras.css +++ b/docs/stylesheets/extras.css @@ -40,7 +40,7 @@ .md-main::before { content: ""; - background-color: rgba(256, 256, 256, 0.93); + background-color: rgba(255, 255, 255, 0.95); /* Adjust the alpha value to control the tint intensity */ position: fixed; top: 0; diff --git a/mkdocs.yml b/mkdocs.yml index e45cb89..97dfb8b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -97,6 +97,8 @@ nav: - Planetary constant kernels (PCK): anise/tutorials/Tutorial 05 - Using frame kernels and text planetary kernels.ipynb - Custom Plantary and Euler Parameter (Quaternion) Kernels (PCK & EPA): anise/tutorials/Tutorial 05 - Using frame kernels and text planetary kernels.ipynb - Sun Probe Earth angle (SPE): anise/tutorials/Tutorial 06 - Sun probe Earth angle.ipynb + - Analysis engine: anise/tutorials/Tutorial 07 - Analysis.ipynb + - OEM and Covariance: anise/tutorials/Tutorial 08 - OEM and Covariance.ipynb - Explanation: - Explanation index: anise/explanation/index.md - Why ANISE?: anise/explanation/why-anise.md @@ -119,6 +121,7 @@ nav: - Orbital elements: anise/reference/mathspec/orbital_elements.md - Interpolation methods: - Interpolation index: anise/reference/mathspec/interpolation/index.md + - Covariance interpolation: anise/reference/mathspec/interpolation/covariance.md - Chebyshev interpolation: anise/reference/mathspec/interpolation/chebyshev.md - Hermite interpolation: anise/reference/mathspec/interpolation/hermite.md - Lagrange interpolation: anise/reference/mathspec/interpolation/lagrange.md @@ -148,6 +151,7 @@ plugins: "hifitime/intro.md": "hifitime/index.md" "anise/intro.md": "anise/index.md" "nyxspace/MathSpec/celestial/orbital_elements.md": "anise/reference/mathspec/orbital_elements.md" + "nyxspace/MathSpec/celestial/interpolation.md": "anise/reference/mathspec/interpolation/index.md" copyright: Copyright © 2024 - Christopher Rabotin