MultiFilterOD#
- class MultiFilterOD(filters: list, global_param_names: List[str], global_apriori_cov: ndarray | None = None, subtract_arc_priors: bool = True)#
Bases:
objectMulti-arc orbit determination combining N independent FilterOD instances.
Each arc has its own propagator, measurements, settings, and filter type (SRIF, LKF, LSB, SRIFB, or any
FilterODsubclass). The class runs all arcs to convergence and then fuses their estimates of any parameters designated as global (shared across arcs) using the NAPEOS partitioned normal-equation formulation with Schur-complement reduction.Algorithm overview
The full state vector of arc \(i\) is partitioned into arc-local parameters \(\mathbf{a}_i\) and global (shared) parameters \(\mathbf{g}\):
\[\begin{split}\mathbf{x}_i = \begin{bmatrix} \mathbf{a}_i \\ \mathbf{g} \end{bmatrix}\end{split}\]Step 1 — Per-arc convergence. Each arc filter is run to inner convergence independently, yielding a state deviation \(\delta\mathbf{x}_{0,i}\) and covariance \(P_{0,i}\) referred to a common reference epoch \(t_0\).
For batch or smoother outputs the solution is already at \(t_0\). For sequential filters (LKF, SRIF) the final-epoch result is mapped back via the cumulative state-transition matrix \(\Phi_N\):
\[\delta\mathbf{x}_{0,i} = \Phi_N\,\delta\mathbf{x}_{N,i}, \qquad P_{0,i} = \Phi_N\,P_{N,i}\,\Phi_N^T\]Step 2 — Normal equations. The information matrix and right-hand side for arc \(i\) are
\[N_i = P_{0,i}^{-1}, \qquad \mathbf{b}_i = N_i\,\delta\mathbf{x}_{0,i}\]When
subtract_arc_priors=Truethe arc’s own apriori information is removed so it is counted only once viaglobal_apriori_cov:\[N_i \leftarrow N_i - P_{\mathrm{apr},i}^{-1}\]Step 3 — Partitioning and Schur complement. The normal matrix is split into local and global blocks:
\[\begin{split}N_i = \begin{bmatrix} N_{a,i} & N_{ag,i} \\ N_{ag,i}^T & N_{g,i} \end{bmatrix}, \qquad \mathbf{b}_i = \begin{bmatrix} \mathbf{b}_{a,i} \\ \mathbf{b}_{g,i} \end{bmatrix}\end{split}\]Local parameters are eliminated via the Schur complement:
\[ \begin{align}\begin{aligned}\tilde{N}_{g,i} = N_{g,i} - N_{ag,i}^T N_{a,i}^{-1} N_{ag,i}\\\tilde{\mathbf{b}}_{g,i} = \mathbf{b}_{g,i} - N_{ag,i}^T N_{a,i}^{-1} \mathbf{b}_{a,i}\end{aligned}\end{align} \]Step 4 — Global combination. An arbitrary reference \(\bar{\mathbf{g}}\) (arc-0 absolute estimate) is used to form the combined information and normal vector:
\[ \begin{align}\begin{aligned}\Lambda = P_{\mathrm{prior}}^{-1} + \sum_{i=1}^{N} \tilde{N}_{g,i}\\\hat{\mathbf{n}} = \sum_{i=1}^{N} \Bigl( \tilde{\mathbf{b}}_{g,i} + \tilde{N}_{g,i}\, (\mathbf{x}_{G,i} - \bar{\mathbf{g}}) \Bigr)\end{aligned}\end{align} \]giving the combined global estimate and covariance:
\[\hat{P}_G = \Lambda^{-1}, \qquad \hat{\mathbf{x}}_G = \bar{\mathbf{g}} + \hat{P}_G\,\hat{\mathbf{n}}\]The solution is insensitive to the choice of \(\bar{\mathbf{g}}\).
Step 5 — Local back-substitution. With \(\hat{P}_G\) known, the arc-local correction is recovered by a second Schur inversion:
\[ \begin{align}\begin{aligned}\hat{P}_{a,i} = \bigl( N_{a,i} - N_{ag,i}\,\hat{P}_G\,N_{ag,i}^T \bigr)^{-1}\\\Delta\mathbf{x}_{a,i} = \hat{P}_{a,i}\, \bigl( \mathbf{b}_{a,i} - N_{ag,i}\,\hat{P}_G\,\hat{\mathbf{n}} \bigr)\end{aligned}\end{align} \]Step 6 — Reinitialization. Each arc is restarted from the corrected reference trajectory \(\mathbf{x}_{\mathrm{ref}} + [\Delta\mathbf{x}_{a,i};\,\Delta\mathbf{x}_G]\) and the outer loop repeats until the relative RMS change in \(\hat{\mathbf{x}}_G\) falls below
convergence_threshold.- Parameters:
filters (
listofFilterOD) – One filter per arc, fully configured (propagator, measurements, settings). All filters must estimate the same set of global parameters (matching base names) plus their own arc-local parameters.global_param_names (
listofstr) – Base names of parameters shared across arcs (e.g.["gm", "cnm_2_0"]). Every arc must estimate at least one such parameter.global_apriori_cov (
np.ndarrayofshape (n_G,n_G), optional) – Apriori covariance for the global parameter vector. Enters as \(P_{\mathrm{prior}}^{-1}\) in the global combination step. Set toNone(default) to omit (improper prior).subtract_arc_priors (
bool, optional) – IfTrue(default), each arc’s own apriori covariance \(P_{\mathrm{apr},i}\) is subtracted from \(N_i\) before combination, preventing the prior from being counted once per arc. Set toFalseto retain the classic behaviour in which every arc contributes its full posterior information matrix including the prior.
- Raises:
ValueError – If any arc filter has
flag_sequence=True(multi-leg arcs are not supported).ValueError – If any arc filter estimates no parameter whose name appears in
global_param_names.
Notes
Multi-leg (sequence) arcs are not supported; each arc must be a single-leg filter.
All arcs must estimate the same set of global parameters (matched by base name); the dimension \(n_G\) must be consistent across arcs.
The outer loop reinitializes arcs after each global combination; the number of outer iterations required is typically 2–4 for well-posed problems.
If no
global_apriori_covis supplied, the combined problem has an improper prior and the solution is determined solely by the arc data.
See also
scarabaeus.FilterODBase filter class used per-arc.
scarabaeus.LKFSequential covariance-form filter.
scarabaeus.SRIFSequential square-root information filter.
scarabaeus.LSBBatch least-squares estimator.
scarabaeus.SRIFBBatch square-root information estimator.
References
- French, A. S., Leonard, J. M., Geeraert, J. L., Page, B. R., Antreasian, P. G.,
Moreau, M. C., McMahon, J. W., Scheeres, D. J., & the OSIRIS-REx Team. “Multi-Arc Filtering During the Navigation Campaign of the OSIRIS-REx Mission.” KinetX / NASA GSFC / University of Colorado. (Primary reference for the partitioned normal-equation and Schur-complement multi-arc formulation implemented here.)
- European Space Operations Centre (2009).
“NAPEOS — Navigation Package for Earth Orbiting Satellites,” May 2009, pp. 1–150.
- Tapley, B. D., Schutz, B. E., & Born, G. H. (2004). Statistical Orbit Determination.
Elsevier Academic Press. ISBN 978-0-12-683630-1.
- Bierman, G. J. (1977).
Factorization Methods for Discrete Sequential Estimation. Academic Press.
Methods
fit([max_outer_iters, max_inner_iters, ...])Run multi-arc orbit determination.
- fit(max_outer_iters: int = 5, max_inner_iters: int = 10, convergence_threshold: float = 1e-06, if_sequential_smooth: bool = False, traj_name: str | None = None, verbose: bool = True) List[SolutionOD]#
Run multi-arc orbit determination.
- Parameters:
max_outer_iters (
int) – Maximum outer (global-combination) iterations.max_inner_iters (
int) – Maximum inner (per-arc) iterations per outer step.convergence_threshold (
float) – Relative RMS convergence threshold for both inner and outer loops.if_sequential_smooth (
bool) – Apply smoothing to each arc after inner convergence.traj_name (
str, optional) – Base name for trajectory files; arc index and outer iteration number are appended automatically.verbose (
bool) – Print progress banners.
- Returns:
One solution per arc from the final outer iteration. Each solution’s
multi_arc_globalattribute contains:x_G— (n_G,) combined absolute estimateP_G— (n_G, n_G) combined covarianceglobal_param_names— sorted list of global parameter namesarc_global_abs— per-arc absolute estimatesn_outer— outer iterations performedconverged— True if outer loop converged
- Return type:
list[SolutionOD]