4.6 KiB
Session Summary - 2026-01-24
Overview
Implemented Phases 1-3 of unified orbital elements configuration system.
Changes Made
Phase 1: Create Orbital Mechanics Module
- Created
src/orbital_mechanics.h- DefinesOrbitalElementsstruct with Keplerian elements - Created
src/orbital_mechanics.cpp- Implementsorbital_elements_to_cartesian()conversion function - Supports all orbit types: circular (e=0), elliptical (0<e<1), parabolic (e=1), hyperbolic (e>1)
- Planar orbits only (inclination=0), 3D orientation deferred to future work
Phase 2: Update Data Structures
-
Modified
CelestialBodystruct (simulation.h):- Added
OrbitalElements orbitfield - Renamed
position→global_position - Renamed
velocity→global_velocity - Reorganized field order for clarity
- Added
-
Modified
Spacecraftstruct (spacecraft.h):- Added
OrbitalElements orbitfield - Renamed
position→global_position - Renamed
velocity→global_velocity
- Added
-
Renamed
OrbitalElements→OrbitalMetricsin simulation.h (output/analysis use case)- Updated all references in
simulation.cpp,config_loader.cpp,renderer.cpp,ui_renderer.cpp
- Updated all references in
Phase 3: Update Config Parser
-
Modified
parse_toml_body()(config_loader.cpp):- Replaced old
positionfield requirement withorbittable parsing - Removed old
eccentricityandsemi_major_axistop-level fields - Parses all orbital element fields with defaults
- Supports
altitudeconvenience field for LEO/GEO orbits - Required:
semi_major_axisoraltitudein orbit table - Optional:
eccentricity(default 0.0),true_anomaly(default 0.0), 3D orientation elements (default 0.0) - Position/velocity initialized to zero (calculated from orbital elements later)
- Replaced old
-
Modified
parse_toml_spacecraft()(config_loader.cpp):- Replaced
position+velocityfields withorbittable parsing - Uses same orbital element parsing logic as bodies
- Position/velocity initialized to zero (calculated from orbital elements later)
- Replaced
-
Added validation for orbital elements:
semi_major_axismust not be zeroeccentricitymust be >= 0- For elliptical orbits (e < 1):
semi_major_axis > 0 - Validates both bodies and spacecraft
-
Modified
load_spacecraft_from_toml():- Removed manual position/velocity calculation from parent
- Now initializes both bodies and spacecraft in
initialize_orbital_objects()
Commits
dc1f9f4- Phase 1: Create orbital mechanics module121f1b9- Phase 2: Update data structures with global_position/global_velocityec1d115- Phase 3: Update config parser to use orbital elements
Net Line Count
- +172 lines added (orbital_mechanics module, updated structs, config parsing, validation)
- -93 lines deleted (removed manual velocity calculations, old config format support)
Remaining Issues
-
Phase 4 incomplete: Need to update initialization to use
orbital_elements_to_cartesian()function- Current state:
add_body_to_simulation()calls oldcalc_orbital_velocity()(removed) - Old
initialize_bodies()function still references removed function - Need to replace with
initialize_orbital_objects()that callsorbital_elements_to_cartesian()
- Current state:
-
Function name typo: File has
orbital_mechanics.hbut code usescalc_orbital_velocity(should beorbitalnotorbi) -
Config format: All existing test configs need to be updated to new
orbittable format (13 config files) -
Renderer references: Need to verify all
render_orbit()calls are correct after struct changes
Next Steps (Phase 4)
- Remove old
calc_orbital_velocity()function from simulation.cpp - Implement
initialize_orbital_objects()usingorbital_elements_to_cartesian():- Bodies: Convert orbital elements to local position/velocity, compute global coordinates
- Spacecraft: Handle altitude convenience, add parent radius, convert to local/global coordinates
- Calculate SOI radii for bodies
- Update
load_system_config()to callinitialize_orbital_objects()instead ofinitialize_bodies() - Update all 13 test configs to new format with
orbittables - Verify renderer displays orbits correctly
- Run full test suite to ensure all changes work correctly
Notes
- All orbital calculations use planar orbits (inclination=0), 3D orientation deferred
OrbitalElementsstruct in separate module to enable clean separation of concerns- Config parser now validates orbital elements at load time (better error messages)
- Altitude convenience simplifies LEO/GEO orbit specification (e.g., altitude=400km instead of semi_major_axis calculation)