Current section
Files
Jump to
Current section
Files
lib/sidereon/iod.ex
defmodule Sidereon.IOD do
@moduledoc """
Initial Orbit Determination methods.
Given observations (position vectors, angles, or times), determine
the orbit of a satellite.
"""
@type vec3 :: {number(), number(), number()}
@doc """
Gibbs method: determine velocity at r2 from three coplanar position vectors.
Algorithm 54, Vallado 2022, pp. 460-467.
## Parameters
* `r1`, `r2`, `r3` - ECI position vectors in km as `{x, y, z}` tuples
## Returns
`{v2, theta12, theta23, copa}` where:
* `v2` - velocity at r2 in km/s
* `theta12`, `theta23` - angles between position vectors in radians
* `copa` - coplanarity angle in radians
"""
@spec gibbs(vec3(), vec3(), vec3()) :: {{float(), float(), float()}, float(), float(), float()}
defdelegate gibbs(r1, r2, r3), to: Sidereon.NIF, as: :iod_gibbs
@doc """
Herrick-Gibbs method: determine velocity at r2 from three closely-spaced
position vectors with timestamps.
Algorithm 55, Vallado 2022, pp. 467-472.
## Parameters
* `r1`, `r2`, `r3` - ECI position vectors in km
* `jd1`, `jd2`, `jd3` - Julian day fractions (only differences matter)
"""
@spec hgibbs(vec3(), vec3(), vec3(), number(), number(), number()) ::
{{float(), float(), float()}, float(), float(), float()}
defdelegate hgibbs(r1, r2, r3, jd1, jd2, jd3), to: Sidereon.NIF, as: :iod_hgibbs
@doc """
Gauss angles-only IOD: determine orbit from three angular observations.
Algorithm 52, Vallado 2022, pp. 448-459.
## Parameters
* `decl1..3` - declinations in radians
* `rtasc1..3` - right ascensions in radians
* `jd1..3`, `jdf1..3` - Julian dates (whole + fraction)
* `site1..3` - ECI site position vectors in km as `{x, y, z}` tuples
## Returns
`{r2, v2}` - position and velocity at the middle observation.
"""
@spec gauss(
number(),
number(),
number(),
number(),
number(),
number(),
number(),
number(),
number(),
number(),
number(),
number(),
vec3(),
vec3(),
vec3()
) :: {{float(), float(), float()}, {float(), float(), float()}}
defdelegate gauss(d1, d2, d3, ra1, ra2, ra3, jd1, jdf1, jd2, jdf2, jd3, jdf3, s1, s2, s3),
to: Sidereon.NIF,
as: :iod_gauss
end