The environment module provides space environment models for satellite and mission analysis:
- Solar Position - Approximate Sun ephemeris (RA/Dec, distance, ECI position)
- Eclipse Detection - Cylindrical and conical shadow models
- Magnetic Field - Centered dipole geomagnetic field model
All functions are templated for both numeric (double) and symbolic (casadi::MX) evaluation.
Quick Start
Vec3<double> r_sat, r_sun;
r_sat << -7000e3, 0.0, 0.0;
r_sun << 1.5e11, 0.0, 0.0;
Scalar shadow_cylindrical(const Vec3< Scalar > &r_sat, const Vec3< Scalar > &r_sun, double R_body=vulcan::constants::earth::R_eq)
Cylindrical shadow function.
Definition Eclipse.hpp:32
Scalar field_magnitude(const Vec3< Scalar > &r_ecef, double B0=constants::B0, double R=vulcan::constants::earth::R_eq)
Magnetic field magnitude at given position.
Definition MagneticField.hpp:71
std::pair< Scalar, Scalar > ra_dec(const Scalar &jd)
Definition SolarPosition.hpp:16
Vec3< Scalar > position_eci(const Scalar &jd)
Definition SolarPosition.hpp:32
double calendar_to_jd(int year, int month, int day, int hour=0, int min=0, double sec=0.0)
Convert calendar date/time to Julian Date.
Definition JulianDate.hpp:24
API Reference
Solar Position (vulcan::environment::solar)
| Function | Description |
| ra_dec(jd) | Sun right ascension and declination [rad] |
| right_ascension(jd) | Sun right ascension [rad] |
| declination(jd) | Sun declination [rad] |
| distance(jd) | Earth-Sun distance [m] |
| position_eci(jd) | Sun position vector in ECI [m] |
| unit_vector_eci(jd) | Sun direction unit vector in ECI |
Algorithm: Low-precision ephemeris from Vallado's "Fundamentals of Astrodynamics" (~0.01° accuracy over decades).
Example: Seasonal Variation
std::cout << "Declination: " << dec * 180/M_PI << "°\n";
Eclipse Detection (vulcan::environment::eclipse)
| Function | Description |
| shadow_cylindrical(r_sat, r_sun) | Cylindrical shadow model (0=shadow, 1=sunlit) |
| shadow_conical(r_sat, r_sun) | Conical model with penumbra transition |
| is_in_shadow(r_sat, r_sun) | Returns 1.0 if in shadow |
| is_sunlit(r_sat, r_sun) | Returns 1.0 if sunlit |
All functions accept optional R_body parameter for custom shadow-casting body radius.
Shadow Models
Cylindrical Model (fastest):
- Simple shadow cylinder behind Earth
- Good for quick checks and optimization
Conical Model (accurate):
- Accounts for finite Sun size
- Includes penumbra transition (0-1 range)
- Based on Montenbruck & Gill "Satellite Orbits"
Vec3<double> r_sat, r_sun;
r_sat << -7000e3, 100e3, 0.0;
r_sun << 1.5e11, 0.0, 0.0;
Scalar shadow_conical(const Vec3< Scalar > &r_sat, const Vec3< Scalar > &r_sun, double R_body=vulcan::constants::earth::R_eq, double R_sun=constants::R_sun)
Conical shadow function with penumbra.
Definition Eclipse.hpp:74
Magnetic Field (vulcan::environment::magnetic)
| Function | Description |
| dipole_field_ecef(r_ecef) | B-field vector in ECEF [T] |
| field_magnitude(r_ecef) | Field magnitude [T] |
| field_ned(lat, lon, alt) | B-field in NED frame [T] |
| surface_intensity(lat) | Surface field intensity [T] |
| inclination(lat) | Magnetic inclination angle [rad] |
Dipole Model
The centered dipole model approximates Earth's magnetic field:
- B₀ ≈ 31.2 μT at equator surface
- **~62 μT** at poles (2× equator)
- Field decays as r⁻³ with altitude
Vec3<double> r;
constexpr double R_eq
Equatorial radius [m] (WGS84).
Definition Constants.hpp:16
Vec3< Scalar > field_ned(const Scalar &lat, const Scalar &lon, const Scalar &alt, double B0=constants::B0, double R=vulcan::constants::earth::R_eq)
Magnetic field in local NED frame at geodetic coordinates.
Definition MagneticField.hpp:88
- Note
- This is a simplified centered dipole model. For high-accuracy geomagnetic applications (navigation, attitude control), consider IGRF or WMM models.
Symbolic Mode
All environment functions work with Janus symbolic types for automatic differentiation:
auto jd = janus::sym("jd");
auto ddec_djd = janus::jacobian(dec, jd);
janus::Function f("dec_rate", {jd}, {ddec_djd});
auto result =
f({2451545.0});
constexpr double f
Flattening (WGS84).
Definition Constants.hpp:25
Scalar declination(const Scalar &jd)
Definition SolarPosition.hpp:24
Example: Eclipse Optimization
Use shadow function in trajectory optimization:
auto x = janus::sym("x");
auto y = janus::sym("y");
auto z = janus::sym("z");
Vec3<janus::SymbolicScalar> r_sat, r_sun;
r_sat << x, y, z;
r_sun << janus::SymbolicScalar(1.5e11),
janus::SymbolicScalar(0.0),
janus::SymbolicScalar(0.0);
Constants
Available in vulcan::environment::solar::constants, eclipse::constants, magnetic::constants:
| Constant | Value | Description |
| solar::constants::AU | 1.496×10¹¹ m | Astronomical Unit |
| eclipse::constants::R_sun | 6.963×10⁸ m | Solar radius |
| magnetic::constants::B0 | 3.12×10⁻⁵ T | Equatorial surface field |
| magnetic::constants::dipole_tilt | 11.5° | Dipole tilt angle |
See Also