AstroStates
The AstroStates module provides models, structs, utilities, and conversions for orbital state representations. A state representation is a set of quantities that uniquely define an orbit. Supported forms include Cartesian, Keplerian, Modified Equinoctial, and others.
The module offers multiple interfaces for transforming and storing states. Low‑level conversion functions (e.g., cart_to_kep.jl) can be used directly. A type system automatically provides concrete structs for each representation (e.g., CartesianState) and converts between all supported permutations. The OrbitState utility preserves type stability when the representation may change by storing the numeric state and a type tag in separate fields. The library supports automatic differentiation with ForwardDiff.jl and Zygote.jl.
AstroStates is tested against output from the General Mission Analysis Tool (GMAT) R2022a.
References:
- Vallado, D. A. (2013), Fundamentals of Astrodynamics and Applications, 4th ed., Microcosm Press / Springer.
- GMAT Development Team (2022), General Mission Analysis Tool (GMAT) Mathematical Specification, Version R2022a, NASA Goddard Space Flight Center.
Quick Start
The example below illustrates how to create a state struct, perform conversions, inspect elements of a state, and how to view all supported types.
using AstroStates
# Define a Cartesian state
cart = CartesianState([7000.0, 0.0, 100.0, 0.0, 7.5, 2.5])
# Convert to Keplerian then back to Cartesian
mu = 398600.4418
kep = KeplerianState(cart, mu)
cart2 = CartesianState(kep, mu)
# Display some state elements
kep.sma
kep.raan
# Generate a vector containing the state struct data
to_vector(kep)
# See a list of all supported representations
subtypes(AbstractOrbitState)The API is documented with docstrings; external references are intentionally omitted to avoid duplication. In the REPL, type ? to enter help mode, then enter a name to view its documentation. For example, ?IncomingAsymptoteState displays the incoming hyperbolic asymptote state, and ?cart_to_sphradec shows the spherical RA/Dec conversion helper.
State Overview
AstroStates provides a library of state structs to create, store, and convert orbit states. These structs derive from AbstractOrbitState. You can create states from numeric vectors or by converting from another state struct; conversions are performed automatically via overloaded constructors. State structs print readably and expose elements as fields. To list supported representations, run subtypes(AbstractOrbitState). Kinematic conversions (e.g., Cartesian, Spherical) do not require mu, while conic element conversions (e.g., Keplerian, Modified Equinoctial) do.
using AstroStates
# Create a Cartesian state from position and velocity vectors
c = CartesianState([7000.0, 0.0, 100.0] , [0.0, 7.5, 2.5])
# Create a Keplerian state from individual elements.
k = KeplerianState(-98000.0, 2.6, pi/4, deg2rad(145), pi/8, 0.0 )
# Create a Keplerian state from a Cartesian State performing conversion automatically
mu = 398600.4415
k2 = KeplerianState(c, mu)
# Convert the Keplerian state to outgoing asymptote representation
h = OutGoingAsymptoteState(k, mu)
# Inspect elements of the states we just created. Use "?" to see fields on a struct.
c.position
c.velocity
k.sma
c.posvel
h.c3OrbitState Container
The OrbitState struct provides a type-stable container when the representation may change during a simulation but type stability is still required. For example, Epicycle’s Spacecraft uses OrbitState to accept different input representations and to switch state types during a run. OrbitState stores (1) the state data and (2) a tag that describes the representation. The tag is a state-type marker that parallels the concrete state struct names (e.g., Keplerian, Cartesian, etc.).
using AstroStates
# Create an OrbitState struct that stores the state and state type.
os = OrbitState([-98000.0, 2.6, pi/4, deg2rad(145), pi/8, 0.0 ],Keplerian())
# Print the state and type
println(os.state)
println(os.statetype)
# Create an OrbitState struct from a concrete type struct.
c = CartesianState([7000.0, 0.0, 100.0, 0.0, 7.5, 2.5])
os = OrbitState(c)
# See all available types
subtypes(AbstractOrbitStateType)Conversions Overview
The conversion functions in AstroStates are contained in individual files with function names like cart_to_kep.jl. These functions can be used directly without the struct-based interfaces above when appropriate and when that is easier to integrate into other applications.
using AstroStates
# Bypass structs and work directly with vectors, etc.
mu = 398600.4415
k = cart_to_kep([7000.0, 0.0, 100.0, 0.0, 7.5, 2.5], mu)
# Convert an equinoctial state to alternate equinoctial state
ae = equinoctial_to_alt_equinoctial([7758.763,-0.0047,0.09769,-0.00695,0.16227, 6.2762])The conversions are written to resemble astrodynamics textbooks with the intention that the code can serve as its own math spec. Here is an example from kep_to_cart.jl:
using LinearAlgebra
"""
kep_to_cart(state::Vector{<:Real}, μ::Real; tol::Float64=1e-12)
Convert a Keplerian state vector to a Cartesian state vector.
# Arguments
- `state::Vector{<:Real}`: Keplerian elements `[a, e, i, Ω, ω, ν]`
- `μ`: Gravitational parameter
- `tol`: Tolerance for singularities like p ≈ 0 (default: 1e-12)
- `a`: semi-major axis
- `e`: eccentricity
- `i`: inclination
- `Ω`: right ascension of ascending node
- `ω`: argument of periapsis
- `ν`: true anomaly
# Returns
A 6-element vector `[x, y, z, vx, vy, vz]` representing Cartesian position and velocity.
# Example
cart = kep_to_cart([7000.0, 0.01, pi/4, 0.0, 0.0, pi/3], 398600.4418)
# Notes
- Angles must be in radians.
- Dimensional quantities must be consistent units with μ.
- Returns a vector of `NaN`s if conversion is undefined.
"""
function kep_to_cart(state::Vector{<:Real}, μ::Real; tol::Float64=1e-12)
if length(state) != 6
error("Input vector must have exactly six elements: a, e, i, Ω, ω, ν.")
end
if μ < tol
@warn "Conversion Failed: μ < tolerance."
return fill(NaN, 6)
end
# Unpack the elements
a, e, i, Ω, ω, ν = state
# Compute semi-latus rectum: p = a * (1 - e²)
p = a * (1.0 - e^2)
# Check for degenerate orbit (e.g., parabolic or collapsed)
if p < tol || abs(1-e) < tol
@warn "Conversion Failed: Orbit is parabolic or singular."
return fill(NaN, 6)
end
# Compute radial distance: r = p / (1 + e * cos(ν))
r = p / (1.0 + e * cos(ν))
# Position and velocity in perifocal frame
factor = sqrt(μ / p)
r̄ₚ = [r * cos(ν), r * sin(ν), 0.0]
v̄ₚ = [-factor * sin(ν), factor * (e + cos(ν)), 0.0]
# Precompute sines and cosines for rotation matrix
cos_Ω, sin_Ω = cos(Ω), sin(Ω)
cos_ω, sin_ω = cos(ω), sin(ω)
cos_i, sin_i = cos(i), sin(i)
# Rotation matrix from perifocal to inertial
R = [
cos_ω * cos_Ω - sin_ω * cos_i * sin_Ω -sin_ω * cos_Ω - cos_ω * cos_i * sin_Ω sin_i * sin_Ω;
cos_ω * sin_Ω + sin_ω * cos_i * cos_Ω -sin_ω * sin_Ω + cos_ω * cos_i * cos_Ω -sin_i * cos_Ω;
sin_ω * sin_i cos_ω * sin_i cos_i
]
# Rotate position and velocity from perifocal to inertial frame
pos = R * r̄ₚ
vel = R * v̄ₚ
return vcat(pos, vel)
endAutomatic Differentiation
All functions and conversions in AstroStates are fully differentiable using Julia's automatic differentation libraries ForwardDiff and Zygote. Examples for computing Jacobians are shown below.
Note: The time to precompile AD interfaces is substantial, but those times are only incurred on the first execution and when included in loops or functions the times are orders of magnitude faster. REPL peformance for these examples is poor for that reason.
using ForwardDiff
using AstroStates
# Define the state vector and mu
x = [7000.0, 0.0, 100.0, 0.0, 7.5, 2.5]
mu = 398600.4418
# Define a function closure that returns a vector
f(x) = to_vector(KeplerianState(CartesianState(x, mu), mu))
# Compute the Jacobian of Keplerian state w/r/t Cartesian State at x
J = ForwardDiff.jacobian(f, x)using Zygote
using AstroStates
# State vector and mu
x = [7000.0, 0.0, 100.0, 0.0, 7.5, 2.5]
mu = 398600.4418
# Define a function closure that returns a vector
f(x) = to_vector(ModifiedEquinoctialState(CartesianState(x, mu), mu))
# Compute the Jacobian of Modified Equinoctial elements w/r/t Cartesian
J = first(Zygote.jacobian(f, x)) State Types Reference
AstroStates.AlternateEquinoctialState — Type
AlternateEquinoctialState(a, h, k, altp, altq, λ)Alternate equinoctial elements representation.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
a: Semi-major axis. Defines orbit size and energy.- Range: a ≠ 0. If a > 0: elliptic orbit. If a < 0: hyperbolic orbit.
h: Eccentricity vector h-component. h = e⋅sin(ω + Ω).- Range: Any real value. Related to eccentricity and orientation.
k: Eccentricity vector k-component. k = e⋅cos(ω + Ω).- Range: Any real value. Related to eccentricity and orientation.
altp: Alternate inclination vector p-component. altp = sin(i/2)⋅cos(Ω).- Range: Any real value. Alternative inclination parameterization.
altq: Alternate inclination vector q-component. altq = sin(i/2)⋅sin(Ω).- Range: Any real value. Alternative inclination parameterization.
mlong: Mean longitude (rad). Combined angle measure.- Range: [0, 2π). Normalized mean longitude.
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Alternative to standard equinoctial elements using sin(i/2) instead of tan(i/2).
- Singularities reduced compared to classical elements.
Examples
alteq = AlternateEquinoctialState(7000.0, 0.01, 0.0, 0.05, 0.0, π/4)AstroStates.CartesianState — Type
CartesianState(posvel)
CartesianState(pos, vel)Cartesian position and velocity state representation.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation.
Fields
position::SVector{3,T}: Position vector [x, y, z]- Range: Any real values.
velocity::SVector{3,T}: Velocity vector [vx, vy, vz]- Range: Any real values.
Properties
posvel: Backward-compatible property returning combined state as Vector{Float64}
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Internal storage uses StaticArrays for efficient coordinate transformations.
- The
posvelproperty provides backward compatibility with code expecting a 6-element vector. - See docstrings for other constructor options for flexibility.
Examples
# From 6-element vector
cart = CartesianState([6778.0, 0.0, 0.0, 0.0, 7.66, 0.0])
# From separate position and velocity
using StaticArrays
pos = SVector(6778.0, 0.0, 0.0)
vel = SVector(0.0, 7.66, 0.0)
cart = CartesianState(pos, vel)
# Access fields
x, y, z = cart.position
vx, vy, vz = cart.velocity
posvel_vec = cart.posvel # Returns Vector{Float64}AstroStates.CartesianState — Method
CartesianState(data::AbstractVector)Construct CartesianState from 6-element vector [x, y, z, vx, vy, vz].
AstroStates.CartesianState — Method
CartesianState(data::SVector{6})Construct CartesianState from 6-element static vector [x, y, z, vx, vy, vz].
AstroStates.CartesianState — Method
CartesianState(pos::AbstractVector, vel::AbstractVector)Construct CartesianState from separate 3-element position and velocity vectors.
AstroStates.CartesianState — Method
CartesianState(pos::SVector{3}, vel::SVector{3})Construct CartesianState from separate position and velocity static vectors.
AstroStates.EquinoctialState — Type
EquinoctialState(a, h, k, p, q, λ)Equinoctial orbital elements representation.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
a: Semi-major axis. Defines orbit size and energy.- Range: a ≠ 0. If a > 0: elliptic orbit. If a < 0: hyperbolic orbit.
h: Eccentricity vector h-component. h = e⋅sin(ω + Ω).- Range: Any real value. Related to eccentricity and orientation.
k: Eccentricity vector k-component. k = e⋅cos(ω + Ω).- Range: Any real value. Related to eccentricity and orientation.
p: Inclination vector p-component. p = tan(i/2)⋅cos(Ω).- Range: Any real value. Related to inclination and node orientation.
q: Inclination vector q-component. q = tan(i/2)⋅sin(Ω).- Range: Any real value. Related to inclination and node orientation.
mlong: Mean longitude (rad). Ω + ω + ν combined angle measure.- Range: [0, 2π). Normalized mean longitude.
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Singularities are reduced compared to classical elements but still exist for retrograde equatorial orbits.
Examples
eq = EquinoctialState(7000.0, 0.01, 0.0, 0.1, 0.0, π/4)AstroStates.IncomingAsymptoteState — Type
IncomingAsymptoteState(rp, c3, rla, dla, bpa, ta)Incoming asymptote parameters for hyperbolic trajectories.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
rp: Periapsis radius.- Range: rp > 0.
c3: Characteristic energy. Specific energy at infinity (v∞²).- -∞ < c3 < ∞, c3 > 0 for hyperbolic trajectories.
rla: Right ascension of incoming asymptote (rad).- Range: [0, 2π).
dla: Declination of incoming asymptote (rad).- Range: [-π/2, π/2].
bpa: B-plane angle (rad).- Range: [0, 2π).
ta: True anomaly at asymptote (rad).- Range: [0, 2π).
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Singularities exist when trajectory becomes parabolic (c3 ≈ 0).
- Singularities exist when e ≈ 0. Note for elliptic orbits the apsides vector is used in place of the asymptote direction.
- Singular when asymptote direction is aligned with the reference z-axis (dla = ±π/2).
Examples
inasym = IncomingAsymptoteState(6778.0, 5.0, 0.0, π/4, π/2, π/2)AstroStates.KeplerianState — Type
KeplerianState(a, e, i, raan, aop, ta)Keplerian orbital elements representation using classical osculating elements.
Units
- Distance/time units must be consistent with the gravitational parameter
μused in conversions. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
sma: Semi-major axis (must be nonzero). Defines orbit size and energy.- If sma > 0: elliptic orbit (bound). If sma < 0: hyperbolic orbit (unbound).
- For elliptic orbits, sma is half the major axis length.
ecc: Eccentricity. Defines orbit shape.- ecc = 0: circular orbit. 0 < ecc < 1: elliptical orbit.
- ecc = 1: parabolic orbit. ecc > 1: hyperbolic orbit.
- Valid range: [0, ∞), but ecc ≈ 1 results in infinite sma.
inc: Inclination (rad). Angle between orbit plane and reference xy-plane.- Range: [0, π]. If inc < π/2: prograde orbit. If inc > π/2: retrograde orbit.
raan: Right ascension of ascending node (rad). Orients the orbit plane.- Range: [0, 2π). Angle from +x axis to ascending node, measured in xy-plane.
- Defines where orbit plane intersects reference plane (ascending crossing).
- Undefined for equatorial orbits (inc ≈ 0 or π).
aop: Argument of periapsis (rad). Orients the orbit within its plane.- Range: [0, 2π). Angle from ascending node to periapsis point.
- Defines orientation of orbit ellipse within the orbital plane.
- Undefined for circular orbits (ecc ≈ 0).
ta: True anomaly (rad). Spacecraft position within the orbit.- Range: [0, 2π). Angle from periapsis to current spacecraft position.
- ta = 0: at periapsis. ta = π: at apoapsis (for elliptic orbits).
- Undefined for circular orbits (ecc ≈ 0).
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Classical Keplerian elements have well-known singularities for special cases.
Examples
k = KeplerianState(7000.0, 0.01, π/4, 0.0, 0.0, π/3)AstroStates.ModifiedEquinoctialState — Type
ModifiedEquinoctialState(p, f, g, h, k, L)Modified equinoctial elements representation.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
p: Semi-latus rectum. Parameter defining orbit size and shape.- Range: p > 0. Related to semi-major axis and eccentricity: p = a(1-e²).
f: Eccentricity vector f-component. f = e⋅cos(ω + Ω).- Range: Any real value. Eccentricity component in perifocal frame.
g: Eccentricity vector g-component. g = e⋅sin(ω + Ω).- Range: Any real value. Eccentricity component in perifocal frame.
h: Inclination vector h-component. h = tan(i/2)⋅cos(Ω).- Range: Any real value. Inclination component related to ascending node.
k: Inclination vector k-component. k = tan(i/2)⋅sin(Ω).- Range: Any real value. Inclination component related to ascending node.
L: True longitude (rad). Ω + ω + ν combined angle measure.- Range: [0, 2π). True longitude from reference direction.
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Singularities reduced compared to classical elements, but still exist for retrograde equatorial orbits.
Examples
mee = ModifiedEquinoctialState(7000.0, 0.01, 0.0, 0.1, 0.0, π/4)AstroStates.ModifiedKeplerianState — Type
ModifiedKeplerianState(rp, ra, inc, raan, aop, ta)Modified Keplerian orbital elements using periapsis and apoapsis radii instead of semi-major axis and eccentricity.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
rp: Radius of periapsis. Closest approach distance to central body.- Range: rp > 0. Typically rp > central body radius for physical orbits.
ra: Radius of apoapsis. Farthest distance from central body (elliptic orbits only).- Range: ra ≥ rp for elliptic orbits. For hyperbolic orbits: ra = ∞ (not used).
inc: Inclination (rad). Angle between orbit plane and reference xy-plane.- Range: [0, π]. If inc < π/2: prograde orbit. If inc > π/2: retrograde orbit.
- inc = 0: equatorial orbit in xy-plane. inc = π/2: polar orbit.
raan: Right ascension of ascending node (rad). Orients the orbit plane.- Range: [0, 2π). Angle from +x axis to ascending node, measured in xy-plane.
- Defines where orbit plane intersects reference plane (ascending crossing).
- Undefined for equatorial orbits (inc ≈ 0 or π).
aop: Argument of periapsis (rad). Orients the orbit within its plane.- Range: [0, 2π). Angle from ascending node to periapsis point.
- Defines orientation of orbit ellipse within the orbital plane.
- Undefined for circular orbits (rp ≈ ra).
ta: True anomaly (rad). Spacecraft position within the orbit.- Range: [0, 2π). Angle from periapsis to current spacecraft position.
- ta = 0: at periapsis. ta = π: at apoapsis (for elliptic orbits).
- Undefined for circular orbits (rp ≈ ra).
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Alternative to classical Keplerian elements using radius parameters instead of sma/ecc.
- Shares same singularities as classical Keplerian elements for circular and equatorial orbits.
Examples
# 400 km x 35,786 km orbit (GTO-like)
modkep = ModifiedKeplerianState(6778.0, 42164.0, π/6, 0.0, 0.0, 0.0)AstroStates.OrbitState — Type
OrbitState(state::AbstractVector, statetype::AbstractOrbitStateType)A generic wrapper for orbital state vectors and their associated metadata.
Arguments
state: The numerical state vector (e.g., position/velocity, orbital elements). Must be a vector of real numbers.statetype: Marker instance indicating the state representation (e.g.,Cartesian(),Keplerian(), etc.).- to see all state types, use `subtypes(AbstractOrbitStateType)`.
Example
state_vec = [7000.0, 0.0, 0.0, 0.0, 7.5, 0.0] # Cartesian position and velocity
os = OrbitState(state_vec, Cartesian())Notes
- Allows easy switching between different state representations without type instability.
- The struct is internally parameterized for performance, and type safety, and differentiation, but users should construct it using the outer constructor as shown above.
AstroStates.OutGoingAsymptoteState — Type
OutGoingAsymptoteState(rp, c3, rla, dla, bpa, ta)Outgoing asymptote parameters for hyperbolic trajectories.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
rp: Periapsis radius.- Range: rp > 0.
c3: Characteristic energy. Specific energy at infinity (v∞²).- -∞ < c3 < ∞, c3 > 0 for hyperbolic trajectories.
rla: Right ascension of asymptote (rad).- Range: [0, 2π).
dla: Declination of asymptote (rad).- Range: [-π/2, π/2].
bpa: B-plane angle (rad).- Range: [0, 2π).
ta: True anomaly at asymptote (rad).- Range: [0, 2π).
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Singularities exist when trajectory becomes parabolic (c3 ≈ 0).
- Singularities exist when e ≈ 0. Note for elliptic orbits the apsides vector is used in place of the asymptote direction.
- Singular when asymptote direction is aligned with the reference z-axis (dla = ±π/2).
Examples
outasym = OutGoingAsymptoteState(6778.0, 5.0, 0.0, π/4, π/2, π/2)AstroStates.SphericalAZIFPAState — Type
SphericalAZIFPAState(r, ra, dec, v, vazi, fpa)Spherical coordinates with azimuth and flight path angle velocity representation.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
r: Radial distance from central body center. Magnitude of position vector.- Range: r > 0.
ra: Right ascension (rad). Azimuthal angle of position in xy-plane.- Range: [0, 2π). Measured counterclockwise from +x axis.
dec: Declination (rad). Elevation angle of position above/below xy-plane.- Range: [-π/2, π/2]. dec = 0: position in xy-plane. dec = ±π/2: at poles.
v: Magnitude of velocity vector.- Range: v ≥ 0.
vazi: Velocity azimuth (rad). Horizontal direction of velocity vector.- Range: [0, 2π). Angle east of north in local horizontal plane.
- vazi = 0: northward velocity. vazi = π/2: eastward velocity.
fpa: Flight path angle (rad). Elevation of velocity above local horizontal.- Range: [-π/2, π/2]. fpa = 0: horizontal flight. fpa > 0: climbing.
- fpa < 0: descending flight. fpa = ±π/2: purely radial motion.
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Singularities exist at r = 0 or v = 0 due to undefined angles.
- Flight path angle and azimuth provide intuitive velocity direction description.
Examples
sph = SphericalAZIFPAState(6478.0, 0.0, π/4, 7.5, π/4, π/4)AstroStates.SphericalRADECState — Type
SphericalRADECState(r, dec, ra, v, decv, rav)Spherical coordinates state with right ascension and declination components.
Units
- Distance and time units must be consistent with the gravitational parameter
μused in the simulation. - All angular quantities are in radians.
Fields (all ::T where T<:Real)
r: Radial distance from central body center.- Range: r > 0.
dec: Declination (rad). Elevation angle of position above/below xy-plane.- Range: [-π/2, π/2]. dec = 0: equatorial. dec = ±π/2: polar.
ra: Right ascension (rad). Azimuthal angle of position in xy-plane.- Range: [0, 2π). Measured counterclockwise from +x axis.
v: Velocity magnitude.- Range: v ≥ 0.
decv: Declination of velocity (rad). Elevation angle of velocity vector.- Range: [-π/2, π/2]. Angle between velocity vector and xy-plane.
rav: Right ascension of velocity (rad). Azimuthal angle of velocity.- Range: [0, 2π). Direction of velocity in xy-plane.
Notes
- Parametric so automatic differentiation and high-precision types are supported.
- Singularities exist at r = 0 or v = 0 due to undefined angles.
Examples
radec = SphericalRADECState(6778.0, π/4, 0.0, 7.5, 0.0, π/2)Conversions Reference
AstroStates.alt_equinoctial_to_equinoctial — Method
alt_equinoctial_to_equinoctial(alt::Vector{<:Real}; tol::Float64 = 1e-12)Convert alternate equinoctial elements to standard equinoctial elements.
Arguments
alt::Vector{<:Real}: Alternate equinoctial state[a, h, k, altp, altq, λ]a: semi-major axis [length]h: e⋅g component of eccentricity vectork: e⋅f component of eccentricity vectoraltp: sin(i/2)⋅cos(Ω)altq: sin(i/2)⋅sin(Ω)λ: mean longitude [rad]
tol::Float64: tolerance for inclination singularity (default = 1e-12)
Returns
Standard equinoctial state [a, h, k, p, q, λ] - a : semi-major axis [length] - h : e⋅g component of eccentricity vector - k : e⋅f component of eccentricity vector - p : tan(i/2)⋅cos(Ω) - q : tan(i/2)⋅sin(Ω) - λ : mean longitude [rad]
Notes
- Fails if inclination approaches 180°.
- All angles in radians. Units consistent with
μ.
Examples
alt_eq = [7000.0, 0.01, 0.0, 0.05, 0.0, π/4]
std_eq = alt_equinoctial_to_equinoctial(alt_eq)AstroStates.cart_to_equinoctial — Method
cart_to_equinoctial(cart::Vector{<:Real}, μ::Real; tol::Float64 = 1e-12)Convert a Cartesian state vector to equinoctial orbital elements.
Arguments
cart::Vector{<:Real}: Cartesian state[x, y, z, vx, vy, vz]μ::Real: gravitational parameter [length³/time²]tol::Float64: tolerance for singularity detection (default = 1e-12)
Returns
Equinoctial state [a, h, k, p, q, λ]:
a: semi-major axis [length]h: e⋅g component of eccentricity vectork: e⋅f component of eccentricity vectorp: tan(i/2)⋅cos(Ω)q: tan(i/2)⋅sin(Ω)λ: mean longitude [rad]
Notes
- Fails gracefully with
NaNif orbit is hyperbolic, singular, or edge-case unsupported. - All angles are in radians. Units consistent with
μ. - Note that in most cases in states, h is the magnitude of angular momentum. But, not for equinoctial elements.
Examples
cart = [6778.0, 0.0, 0.0, 0.0, 7.66, 0.0]
equinoctial = cart_to_equinoctial(cart, 398600.4418)AstroStates.cart_to_inasymptote — Method
cart_to_inasymptote(cart::Vector{<:Real}, μ::Real; tol::Float64 = 1e-12)Convert a Cartesian state to incoming asymptote parameters.
Arguments
cart::Vector{<:Real}: Cartesian state[x, y, z, vx, vy, vz]μ::Real: gravitational parametertol::Real: tolerance for detecting singularities
Returns
A 6-element vector: [rₚ, C₃, λₐ, δₐ, θᵦ, ν]
- rₚ : radius of periapsis
- C₃ : characteristic energy
- λₐ : right ascension of incoming asymptote
- δₐ : declination of incoming asymptote
- θᵦ : B-plane angle
- ν : true anomaly
Notes
- Angles are in radians.
- Dimensional quantities are consistent units with μ.
Examples
cart = [10000.0, 0.0, 0.0, 0.0, 12.0, 0.0] # Hyperbolic trajectory
inasym = cart_to_inasymptote(cart, 398600.4418)AstroStates.cart_to_kep — Method
function cart_to_kep(cart::Vector{<:Real}, μ::Real; tol::Float64=1e-12)Convert a Cartesian state vector to Keplerian orbital elements.
Arguments
cart::Vector{Float64}: Cartesian state[x, y, z, vx, vy, vz]μ::Real: Gravitational parametertol::Float64: Tolerance for detecting circular or equatorial orbits (default:1e-12)
Returns
A vector [a, e, i, Ω, ω, ν] where:
a: semi-major axise: eccentricityi: inclinationΩ: right ascension of ascending node (RAAN)ω: argument of periapsisν: true anomaly
Notes
- Angles must be in radians.
- Dimensional quantities must use consistent units with μ.
Examples
cart = [6778.0, 0.0, 0.0, 0.0, 7.66, 0.0]
kep = cart_to_kep(cart, 398600.4418)AstroStates.cart_to_mee — Method
cart_to_mee(cart::Vector{<:Real}, μ::Real; j::Float64 = 1.0)Convert Cartesian state to Modified Equinoctial Elements (MEE).
Arguments
cart::Vector{<:Real}: 6-element vector[x, y, z, vx, vy, vz]μ::Real: Gravitational parameterj::Float64=1.0: Optional constant (1 for prograde, -1 for retrograde), defaults to1.0tol::Float64: Optional tolerance for singularity checking
Returns
- A 6-element vector
[p, f, g, h, k, L]representing the modified equinoctial elements.
Examples
cart = [6778.0, 0.0, 0.0, 0.0, 7.66, 0.0]
mee = cart_to_mee(cart, 398600.4418)AstroStates.cart_to_outasymptote — Method
cart_to_outasymptote(cart::Vector{<:Real}, μ::Real; tol::Float64 = 1e-12) -> Vector{Float64}Convert a Cartesian state to outgoing asymptote parameters.
Arguments
cart::Vector{<:Real}: Cartesian state[x, y, z, vx, vy, vz]μ::Real: gravitational parametertol::Float64: tolerance for detecting singularities
Returns
A 6-element vector: [rₚ, C₃, λₐ, δₐ, θᵦ, ν]
- rₚ : radius of periapsis
- C₃ : characteristic energy
- λₐ : right ascension of outgoing asymptote
- δₐ : declination of outgoing asymptote
- θᵦ : B-plane angle
- ν : true anomaly
Notes
- Angles are in radians.
- Dimensional quantities are consistent with units of μ
Examples
cart = [10000.0, 0.0, 0.0, 0.0, 12.0, 0.0] # Hyperbolic trajectory
outasym = cart_to_outasymptote(cart, 398600.4418)AstroStates.cart_to_sphazfpa — Method
cart_to_sphazfpa(cart::Vector{<:Real}; tol::Float64 = 1e-12)Convert a Cartesian state to Spherical AZ-FPA representation.
Arguments
cart::Vector{<:Real}: Cartesian state[x, y, z, vx, vy, vz]tol::Float64: Numerical tolerance for singularity checks (default:1e-12)
Returns
A 6-element Spherical AZ-FPA state [r, λ, δ, v, αₚ, ψ]:
r: radial distance [length]λ: right ascension [rad]δ: declination [rad]v: velocity magnitude [length/time]αₚ: flight path azimuth [rad]ψ: flight path angle [rad]
Notes
- Returns
fill(NaN, 6)ifrorvare near zero or orbit is singular - All angles are in radians.
Examples
cart = [6778.0, 0.0, 0.0, 0.0, 7.66, 0.0]
sphazfpa = cart_to_sphazfpa(cart)AstroStates.cart_to_sphradec — Method
cart_to_sphradec(state::Vector{<:Real}; tol::Float64=1e-12)Convert a Cartesian state vector to a spherical RA/DEC state vector.
Arguments
state::Vector{<:Real}: A 6-element vector[x, y, z, vx, vy, vz]representing Cartesian position and velocity.
Returns
A 6-element vector [r, ra, dec, v, vra, vdec] where:
r: magnitude of position vectorλᵣ: right ascension (radians)δᵣ: declination (radians)v: magnitude of velocityλᵥ: azimuthal direction of velocity (radians)δᵥ: elevation direction of velocity (radians)
Notes
- Assumes all angles are in radians.
- Units must be consistent between position and velocity components.
Examples
cart = [6778.0, 0.0, 0.0, 0.0, 7.66, 0.0]
sphradec = cart_to_sphradec(cart)AstroStates.equinoctial_to_alt_equinoctial — Method
equinoctial_to_alt_equinoctial(eq::Vector{<:Real}; tol::Float64 = 1e-12)Convert equinoctial elements to alternate equinoctial elements.
Arguments
eq::Vector{<:Real}: Equinoctial state[a, h, k, p, q, λ]a: semi-major axis [length]h: e⋅g component of eccentricity vectork: e⋅f component of eccentricity vectorp: tan(i/2)⋅cos(Ω)q: tan(i/2)⋅sin(Ω)λ: mean longitude [rad]
tol::Float64: tolerance for inclination singularity detection (default: 1e-12)
Returns
Alternate equinoctial state [a, h, k, altp, altq, λ] - a : semi-major axis [length] - h : e⋅g component of eccentricity vector - k : e⋅f component of eccentricity vector - altp : sin(i/2)⋅cos(Ω) - altq : sin(i/2)⋅sin(Ω) - λ : mean longitude [rad]
Notes
- Singular when inclination is near 180°, returns
fill(NaN, 6)in that case. - Units and angles must be consistent; λ in radians.
Examples
eq = [7000.0, 0.01, 0.0, 0.1, 0.0, π/4]
alt_eq = equinoctial_to_alt_equinoctial(eq)AstroStates.equinoctial_to_cart — Method
equinoctial_to_cart(eq::Vector{<:Real}, μ::Real; tol::Float64 = 1e-12)Convert equinoctial elements to Cartesian state.
Arguments
eq::Vector{<:Real}: Equinoctial state[a, h, k, p, q, λ]a: semi-major axis [length]h: e⋅g component of eccentricity vectork: e⋅f component of eccentricity vectorp: tan(i/2)⋅cos(Ω)q: tan(i/2)⋅sin(Ω)λ: mean longitude [rad]
μ::Real: gravitational parameter [length³/time²]tol::Float64: numerical tolerance (default: 1e-12)
Returns
Cartesian state [x, y, z, vx, vy, vz]
Notes
- Returns
fill(NaN, 6)if eccentricity is too high or radius becomes non-physical. - Assumes all angles are in radians and other units are consistent with μ.
Examples
eq = [7000.0, 0.01, 0.0, 0.1, 0.0, π/4]
cart = equinoctial_to_cart(eq, 398600.4418)AstroStates.inasymptote_to_kep — Method
inasymptote_to_kep(outasym::Vector{<:Real}, μ::Real; tol::Float64=1e-12)Convert incoming asymptote elements to Keplerian elements.
Arguments
outasym: Vector{<:Real} of outgoing asymptote elements:rₚ: periapsis radius [length]C₃: characteristic energy [length²/time²]λₐ: right ascension of the asymptote [rad]δₐ: declination of the asymptote [rad]θᵦ: B-plane angle [rad]ν: true anomaly [rad]
μ: Gravitational parameter [length³/time²]tol: Singularity tolerance (default = 1e-12)
Returns
- Keplerian state vector
[a, e, i, Ω, ω, ν]
Notes
- Returns
fill(NaN, 6)if singularity is detected. - Angles in radians. Units consistent with
μ.
Examples
inasym = [6778.0, 5.0, 0.0, π/4, π/2, π/2]
kep = inasymptote_to_kep(inasym, 398600.4418)AstroStates.kep_to_cart — Method
kep_to_cart(state::Vector{<:Real}, μ::Real; tol::Float64=1e-12)Convert a Keplerian state vector to a Cartesian state vector.
Arguments
state::Vector{<:Real}: Keplerian elements[a, e, i, Ω, ω, ν]μ: Gravitational parametertol: Tolerance for singularities like p ≈ 0 (default: 1e-12)a: semi-major axise: eccentricityi: inclinationΩ: right ascension of ascending nodeω: argument of periapsisν: true anomaly
Returns
A 6-element vector [x, y, z, vx, vy, vz] representing Cartesian position and velocity.
Examples
kep = [7000.0, 0.01, π/4, 0.0, 0.0, π/3]
cart = kep_to_cart(kep, 398600.4418)Notes
- Angles must be in radians.
- Dimensional quantities must be consistent units with μ.
- Returns a vector of
NaNs if conversion is undefined.
AstroStates.kep_to_modkep — Method
kep_to_modkep(kep::Vector{<:Real}; tol::Float64 = 1e-12)Convert a classical Keplerian state to a Modified Keplerian state.
Arguments
kep::Vector{<:Real}: Keplerian state vector[a, e, i, Ω, ω, ν]a: semi-major axise: eccentricityi: inclinationΩ: right ascension of ascending nodeω: argument of periapsisν: true anomaly
tol::Float64: tolerance for singularity and consistency checks (default = 1e-12)
Returns
Modified Keplerian state [rₚ, rₐ, i, Ω, ω, ν] or fill(NaN, 6) if invalid.
Notes
- Parabolic orbits (
e ≈ 1) and singular conics are not supported. - Units must be consistent. Angles in radians.
Examples
kep = [7000.0, 0.01, π/4, 0.0, 0.0, π/3]
modkep = kep_to_modkep(kep)AstroStates.mee_to_cart — Method
mee_to_cart(mod_equinoct::Vector{<:Real}, μ::Real; j::Real = 1.0)Convert Modified Equinoctial Elements to Cartesian state.
Arguments
mod_equinoct::Vector{<:Real}: Vector containing the Modified Equinoctial Elements [p, f, g, h, k, L]μ::Real: Gravitational parameterj::Real=1.0: Optional constant (1 for prograde, -1 for retrograde), defaults to1.0
Returns
- A 6-element vector
[x, y, z, vx, vy, vz]representing the Cartesian position and velocity.
Examples
mee = [7000.0, 0.01, 0.0, 0.1, 0.0, π/4]
cart = mee_to_cart(mee, 398600.4418)AstroStates.modkep_to_kep — Method
modkep_to_kep(modkep::Vector{<:Real}; tol::Float64 = 1e-12)Convert a Modified Keplerian state to a classical Keplerian state.
Arguments
modkep::Vector{<:Real}: Modified Keplerian state vector[rₚ, rₐ, i, Ω, ω, ν]rₚ: radius of periapsisrₐ: radius of apoapsisi: inclinationΩ: right ascension of ascending nodeω: argument of periapsisν: true anomaly
tol::Float64: tolerance for singularity and consistency checks (default = 1e-12)
Returns
A classical Keplerian state [a, e, i, Ω, ω, ν] or fill(NaN, 6) if invalid.
Notes
- Returns
NaNvector if input describes a parabolic, undefined, or inconsistent orbit. - Assumes input angles are in radians and distances use consistent units.
Examples
modkep = [6778.0, 42164.0, π/6, 0.0, 0.0, 0.0]
kep = modkep_to_kep(modkep)AstroStates.outasymptote_to_kep — Method
outasymptote_to_kep(outasym::Vector{<:Real}, μ::Real; tol::Float64=1e-12)Convert outgoing asymptote elements to Keplerian elements.
Arguments
outasym: Vector{<:Real} of outgoing asymptote elements:rₚ: periapsis radius [length]C₃: characteristic energy [length²/time²]λₐ: right ascension of the asymptote [rad]δₐ: declination of the asymptote [rad]θᵦ: B-plane angle [rad]ν: true anomaly [rad]
μ: Gravitational parameter [length³/time²]tol: Singularity tolerance (default = 1e-12)
Returns
- Keplerian state vector
[a, e, i, Ω, ω, ν]
Notes
- Returns
fill(NaN, 6)if singularity is detected. - Angles in radians. Units consistent with
μ.
Examples
outasym = [6778.0, 5.0, 0.0, π/4, π/2, π/2]
kep = outasymptote_to_kep(outasym, 398600.4418)AstroStates.sphazfpa_to_cart — Method
sphazfpa_to_cart(spherical::Vector{<:Real}) -> Vector{<:Real}Convert a Spherical AZ-FPA state to a Cartesian state vector.
Arguments
spherical::Vector{<:Real}: Spherical AZ-FPA state vector[r, λ, δ, v, αₚ, ψ]r: radial distance [length]λ: right ascension [rad]δ: declination [rad]v: velocity magnitude [length/time]αₚ: flight path azimuth (angle east of north in local horizon) [rad]ψ: flight path angle (angle above local horizon) [rad]
Returns
A 6-element Cartesian state vector [x, y, z, vx, vy, vz].
Notes
- All angles must be in radians.
- Velocity frame uses local vertical/local horizontal.
Examples
sphazfpa = [6478.0, 0.0, π/4, 7.5, π/4, π/4]
cart = sphazfpa_to_cart(sphazfpa)AstroStates.sphradec_to_cart — Method
sphradec_to_cart(state::Vector{<:Real}) -> Vector{<:Real}Convert a spherical RA/Dec state [r, λᵣ, δᵣ, v, λᵥ, δᵥ] to a Cartesian state [x, y, z, vx, vy, vz].
Arguments
- state::Vector{<:Real}: length-6 vector where:
- r = position magnitude
- λᵣ = right ascension of position (radians)
- δᵣ = declination of position (radians)
- v = velocity magnitude
- λᵥ = azimuth of velocity direction (radians)
- δᵥ = elevation of velocity direction (radians)
Returns
- Vector{<:Real}: length-6 Cartesian state
[x, y, z, vx, vy, vz].
Notes
- All angles are in radians.
- Units must be consistent between position and velocity components.
- Right ascension typically in [0, 2π); declination in [-π/2, π/2].
Examples
sphradec = [7000.0, 0.0, 0.0, 7.5, π/2, 0.0]
cart = sphradec_to_cart(sphradec)AstroStates.to_state — Method
to_state(os::OrbitState) -> AbstractStateConvert an OrbitState to its corresponding concrete state type (subtype of AbstractState), using the stored state vector and marker type.
Arguments
os::OrbitState: TheOrbitStateinstance to convert.
Returns
- The concrete state type (e.g.,
CartesianState,KeplerianState, etc.) corresponding to thestatetypemarker and the stored state vector.
Example
state_vec = [7000.0, 0.0, 0.0, 0.0, 7.5, 0.0]
os = OrbitState(state_vec, Cartesian())
cs = to_state(os) # cs is a CartesianState
# For other state types:
os_kep = OrbitState([8000.0, 0.05, 0.1, 0.2, 0.3, 0.4], Keplerian())
ks = to_state(os_kep) # ks is a KeplerianStateNotes
- This function does not perform any physical conversions; it simply reconstructs the concrete state type from the stored vector and marker.
- For conversions between different state types (e.g.,
CartesianStatetoKeplerianState), use the appropriate constructor or conversion function, providing additional parameters (such asμ) if required.
API Index
AstroStates.AlternateEquinoctialStateAstroStates.CartesianStateAstroStates.CartesianStateAstroStates.CartesianStateAstroStates.CartesianStateAstroStates.CartesianStateAstroStates.EquinoctialStateAstroStates.IncomingAsymptoteStateAstroStates.KeplerianStateAstroStates.ModifiedEquinoctialStateAstroStates.ModifiedKeplerianStateAstroStates.OrbitStateAstroStates.OutGoingAsymptoteStateAstroStates.SphericalAZIFPAStateAstroStates.SphericalRADECStateAstroStates.alt_equinoctial_to_equinoctialAstroStates.cart_to_equinoctialAstroStates.cart_to_inasymptoteAstroStates.cart_to_kepAstroStates.cart_to_meeAstroStates.cart_to_outasymptoteAstroStates.cart_to_sphazfpaAstroStates.cart_to_sphradecAstroStates.equinoctial_to_alt_equinoctialAstroStates.equinoctial_to_cartAstroStates.inasymptote_to_kepAstroStates.kep_to_cartAstroStates.kep_to_modkepAstroStates.mee_to_cartAstroStates.modkep_to_kepAstroStates.outasymptote_to_kepAstroStates.sphazfpa_to_cartAstroStates.sphradec_to_cartAstroStates.to_state