Hello everyone,
I am developing a Batch Least Squares (BLS) orbit determination program and have encountered a persistent issue with excessively large residuals. I’ve been working on this for several months and would greatly appreciate any guidance or insights from the community.
The core problem is that my BLS estimator is producing final residuals on the order of 30-60 degrees for azimuth and elevation, which clearly indicates a fundamental modeling or implementation error.
## Workflow Overview
My project is divided into two main Python programs:
-
Measurement Simulator: Creates a realistic set of “truth” radar measurements
(R, AZ, EL)
with added noise. -
BLS Estimator: Ingests the simulated measurements to estimate the initial orbital state.
## 1. Measurement Simulation Process ( noisy_measurement_simulator.py (11.7 KB))
-
Initial State: I initialize the “truth” orbit using a state vector derived from a standard TLE.
-
Propagator: The trajectory is generated using a numerical propagator. I have experimented with various force models, including Earth’s gravity , atmospheric drag, and third-body gravity from the Sun and Moon.
-
Simulation Period: The simulation runs for four days, starting from the TLE epoch.
-
Measurement Generation: From a fixed ground station location, I generate topocentric
(Range, Azimuth, Elevation)
measurements of the satellite’s position. -
Noise Model: I apply zero-mean Gaussian noise to these ideal measurements using a specified standard deviation (
sigma
) for both range and angles to simulate realistic measurement errors. The resulting data is written to a file.
## 2. Batch Least Squares Estimation Process ( orbit_determination_from_simulated.py (18.5 KB) )
-
Input Data: The estimator reads the noisy measurement file generated in the previous step.
-
Initial Guess: The initial guess for the state vector in the BLS process is derived from the same TLE that was used to create the truth data.
-
Propagator Configuration: The numerical propagator used within the BLS estimator is configured with the exact same force models and physical constants as the simulation propagator.
-
Monitoring: I am using a
PythonBatchLSObserver
to monitor the residuals at each iteration of the least-squares solver.
## The Problem: Unacceptable Residuals
Despite ensuring the models in the simulation and estimation are consistent, the process converges to a solution with residuals that are orders of magnitude too high. Angular residuals of 30-60 degrees suggests a gross error that I am struggling to locate.
Note : ( There is implementation of Kalman filter as well in the OD code, but forget it for now, I am looking to get the lowest residuals using BLS )
I would be immensely grateful for any advice on the mistake here.
Thank you for your time and consideration.