RMS-NAV

Contents:

  • Introduction
    • Overview
      • Navigation Pipeline
      • Installation
        • Using pip
        • Using pipx
      • Command-Line Programs
        • Navigation Phase
        • Backplanes Phase
        • PDS4 Bundle Phase
      • Cloud Tasks Support
    • Configuration
      • Configuration Loading Order
      • Configuration File Structure
        • Logging Configuration
      • Creating a User Configuration File
      • Using Command-Line Configuration Overrides
      • Command-Line Option Overrides
        • Environment Options
        • Navigation Options
        • Logging Options
      • Example: Combining Configuration Methods
  • User Guide
    • Image Navigation
      • Introduction
        • Purpose of the System
        • Supported Missions
      • Installation and Setup
        • Environment Setup
      • Configuration System
      • Command-Line Interface
        • Basic Usage
        • Command-Line Arguments
          • Environment options
          • Navigation options
          • Output options
          • Dataset selection (PDS3 datasets)
          • Miscellaneous
          • Logging options
        • Example Commands
        • Cloud-tasks entry point
          • Cloud-tasks JSON schema
      • Selecting models and techniques
        • Pattern syntax
          • Inclusion patterns
          • Exclusion patterns
          • Multiple patterns
        • Model names
        • Technique names
        • Examples
      • Inputs and Outputs
        • Input Files
        • Output Files
          • Metadata Files (*_metadata.json)
          • Summary PNG Files (*_summary.png)
        • Interpreting Results
      • Simulated Images
      • Navigation Techniques
        • Implemented techniques
          • BodyLimbNav
          • BodyTerminatorNav
          • RingEdgeNav
          • RingAnnulusNav
          • NavTechniqueManual
        • Filtering examples
        • Output
      • Navigation Models
        • Star Navigation Model
        • Body Navigation Model
        • Ring Navigation Model
          • Planet shadow removal
          • Body shadow removal (future)
      • Troubleshooting
        • Common Issues
        • Getting Help
    • Reprojection Mosaicing
      • Overview
      • Body reprojection and mosaicing
        • Coordinate systems
        • Choosing dtypes
        • Photometric correction
        • Pixel conflict resolution
        • Geometry limits when adding
        • Longitude wraparound
        • Retrieval methods
      • Ring reprojection and mosaicing
        • Choosing dtypes (rings)
        • Orbit model
        • Mosaic compatibility
        • Merge strategy
        • Retrieval methods
      • Saving and loading
        • Image labels (reprojection and mosaic)
        • Sub-solar and sub-observer geometry (body reprojection and mosaics)
      • Cartographic navigation model
      • Command-line mosaic generation
        • Offset application
        • Output format
        • Cloud-tasks entry point
        • Common options reference
          • Ring-specific options
          • Orbit model, longitude, and radius conventions
          • Body-specific options
      • Command-line mosaic display
        • Display options
        • Interactive controls
        • Projection selector (body mosaics)
        • Mouse bindings summary
    • Backplane Generation
      • Overview
      • Command-Line Interfaces
        • Examples
          • Cloud-tasks JSON schema
        • Configuration
        • Outputs
      • Backplane Viewer GUI
        • Run
        • Features
        • Notes
    • Simulated Images
    • PDS4 Bundle Generation
      • Overview
        • Purpose
      • Bundle Structure
      • Command-Line Interfaces
        • Labels Pass
          • Basic Usage
          • Command-Line Arguments
          • Examples
          • Cloud Tasks Variant
        • Summary Pass
          • Basic Usage
          • Command-Line Arguments
          • Examples
      • Inputs and Outputs
        • Input Files
        • Output Files
          • Labels Pass Outputs
          • Summary Pass Outputs
      • Configuration
        • Configuration Options
        • Bundle Results Root
      • Templates
      • Dataset-Specific Behavior
      • Workflow
      • Troubleshooting
        • Common Issues
        • Getting Help
    • Appendix: Cassini ISS
    • Appendix: Galileo SSI
    • Appendix: New Horizons LORRI
    • Appendix: Voyager ISS
  • Developer Guide
    • Introduction
      • Package overview
      • Repository layout
      • Install
        • Environment variables
      • Running the CLI tools
      • Running the test suite
        • Test markers and layout
      • Lint, types, formatter
      • Building the documentation
      • CI / CD pipeline
      • Release / deployment
      • Contribution workflow
      • Pointers to the rest of this manual
    • Code Familiarization Plan
      • Stage 1 — Orientation
      • Stage 2 — Cross-cutting foundations
      • Stage 3 — Inputs: datasets, observations, features
      • Stage 4 — First end-to-end pipeline: NavModelBody + BodyLimbNav
        • Model
        • Technique
        • Orchestrator (minimum slice)
        • Output: annotations, metadata, summary PNG, top-level driver
      • Stage 5 — Orchestrator round-trip: feasibility, confidence, diagnostics, ensemble
      • Stage 6 — Remaining models and their techniques
        • Stars (model + star techniques)
        • Body (additional techniques)
        • Rings (model + ring techniques)
        • Titan (model only)
        • Manual
      • Stage 7 — Simulated images
      • Stage 8 — Calibration and regression
      • Stage 9 — Downstream products
      • Stage 10 — Extending and conventions
    • Navigation
      • Navigation Overview
        • System architecture
        • Data flow
      • Class Hierarchy
        • Top-level driver
        • NavBase
        • FeatureReliabilityGate
        • Dataset, Obs, and ObsSnapshot
        • NavModel
        • NavTechnique
        • NavFeature and NavFeatureGeometry
        • NavResult, ensemble, curator
        • Annotation
      • Observations
        • Overview
        • ObsSnapshot
          • Backplane caching and thread safety
        • ObsInst
        • Per-instrument subclasses
          • Simulated-image instrument config: inherit / override / self-specify
        • Adding a new instrument
        • API reference
      • Navigation Models
        • Stars
          • Star Navigation Model
            • Overview
            • Theory
              • Catalog reduction
              • Conflict marking
              • Magnitude detectability gate
              • Magnitude-margin effective SNR
              • Per-feature uncertainty
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Module-level emission constants
              • Per-instrument overrides
            • Implementation
              • Annotation helpers
              • Per-image metadata
              • Call path
            • Examples
          • Simulated Star Navigation Model
            • Overview
            • Theory
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
        • Bodies
          • Body Navigation Model
            • Overview
            • Theory
              • Bounding-box construction
              • Anti-aliased silhouette extraction
              • Polyline sampling
              • Per-vertex position covariance
              • Visible-lit and overflow fractions
              • Lit-weighted predicted centroid
              • Sub-solar direction
              • Phase-and-irregularity coupling
              • Feature emission gates
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • bodies block
              • Body-shape catalogue
              • Module-level emission constants
              • Per-instrument overrides
            • Implementation
              • BodyShape dataclass
              • Annotation helpers
              • Per-image metadata
              • Call path
            • Examples
          • Simulated Body Navigation Model
            • Overview
            • Theory
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Render geometry vs navigation geometry
            • Implementation
              • Call path
            • Examples
        • Rings
          • Ring Navigation Model
            • Overview
            • Theory
              • Edge rendering
              • Per-edge feature filtering
              • Curvature classification
              • Per-vertex covariance
              • Annulus template
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • rings block
              • Per-planet ring catalogue
              • Module-level emission constants
              • Per-instrument overrides
            • Implementation
              • Annotation helpers
              • Per-image metadata
              • Call path
            • Examples
          • Simulated Ring Navigation Model
            • Overview
            • Theory
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
              • Call path
            • Examples
        • Titan
          • Titan Navigation Model
            • Overview
            • Theory
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
          • Simulated Titan Navigation Model
            • Overview
            • Theory
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
      • Navigation Techniques
        • Shared infrastructure
          • DT Fitting (Shared Polyline-vs-Image Fitter)
            • Overview
            • Theory
              • Stage 1 — coarse integer cross-correlation
              • Stage 2 — sub-pixel Levenberg-Marquardt refinement
              • Stage 3 — optional continuous gradient-ridge refinement
              • Polarity filtering
              • Robustness via Tukey biweight
              • From cost surface to information matrix
              • Pseudoinverse to covariance
              • Combining with a prior in the ensemble
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
          • Image Derivatives (Shared Gradient and Edge DT)
            • Overview
            • Theory
              • Gaussian smoothing then Sobel
              • Edge thresholding and Canny-style non-maximum suppression
              • Truncated distance transform
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
              • Call path
            • Examples
          • Confidence Calibration (Shared Sigmoid-of-Linear Combination)
            • Overview
            • Theory
              • Per-term normalisation
              • Sigmoid combination
              • Hard-zero gates
              • Post-sigmoid hard cap
              • Per-term breakdown
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
          • Feasibility Reporting (Shared NavFeasibilityReport)
            • Overview
            • Theory
              • Stable reasons
              • Consumed-feature count
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
          • Per-Technique Diagnostics (Shared Dataclass Family)
            • Overview
            • Theory
              • The confidence formula
              • The curator
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
            • Examples
        • Star techniques
          • Star Unique Match (StarUniqueMatchNav)
            • Overview
            • Theory
              • Brightness-margin gate
              • Local centroid
              • 1-star path
              • 2-star path
              • Per-mode confidence cap
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
              • Call path
            • Examples
          • Star Field Pattern Match (StarFieldFromCatalogNav)
            • Overview
            • Theory
              • Triplet hashing
              • Source detection
              • KD-tree match
              • RANSAC inlier validation
              • PSF-fit inlier refinement
              • Similarity-transform refit
              • Per-axis covariance
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
              • Call path
            • Examples
          • Star Refinement (StarRefineNav)
            • Overview
            • Theory
              • Per-star centroid model
              • Translation-only fit
              • Rotation-aware fit
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
            • Examples
        • Body techniques
          • Body Limb Fit (BodyLimbNav)
            • Overview
            • Theory
              • Cost function
              • Search strategy
              • Robustness
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
            • Examples
          • Body Terminator Fit (BodyTerminatorNav)
            • Overview
            • Theory
              • Cost function
              • Per-body uniform weighting
              • Search strategy
              • Robustness
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
            • Examples
          • Body Disc Correlate (BodyDiscCorrelateNav)
            • Overview
            • Theory
              • Composite template construction
              • Cost function
              • Sub-pixel refinement band-limit (refine_lowpass_sigma_px)
              • Mode selection (auto / raw / gradient)
              • Search strategy
              • Rotation-aware schedule
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
              • Call path
            • Examples
          • Body Blob Centroid (BodyBlobNav)
            • Overview
            • Theory
              • Coarse acquisition (lit-shape matched filter)
              • Per-blob centroid
              • Per-blob covariance
              • Joint translation fit
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
              • Call path
            • Examples
        • Ring techniques
          • Ring Edge Fit (RingEdgeNav)
            • Overview
            • Theory
              • Rank-deficient covariance
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
              • Call path
            • Examples
          • Ring Annulus Correlate (RingAnnulusNav)
            • Overview
            • Theory
              • Composite template construction
              • Cost function
              • Mode selection (auto / raw / gradient)
              • Search strategy
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
              • Feature-emission tunables (per-planet)
              • Per-instrument overrides
              • Confidence formula
            • Implementation
              • Diagnostics
              • Call path
            • Examples
        • Titan techniques
        • Manual
          • Manual Navigation (NavTechniqueManual)
            • Overview
            • Theory
              • Composite overlay
              • Auto-pick option
              • Restrictions and assumptions
              • Sources of uncertainty
            • Configuration
            • Implementation
              • Call path
            • Examples
      • Orchestrator Subsystem
        • Orchestrator (NavOrchestrator)
          • Overview
          • Theory
            • Pipeline stages
            • Exception-sandbox discipline
            • Glob-pattern model and technique filters
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
            • Call path
          • Examples
        • Per-Image State (NavContext)
          • Overview
          • Theory
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • Final Output (NavResult)
          • Overview
          • Theory
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • Per-Feature Post-Mortem (NavFeatureSummary)
          • Overview
          • Theory
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • Reproducibility Envelope (Provenance)
          • Overview
          • Theory
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • Image Classifier (NavImageClassifier)
          • Overview
          • Theory
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • Per-Instrument Settings (InstrumentSettings)
          • Overview
          • Theory
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • Ensemble Combine (ensemble + EnsembleConfig)
          • Overview
          • Theory
            • Step 1 — drop spurious
            • Step 2 — drop at-edge
            • Step 3 — single-link Mahalanobis grouping
            • Step 4 — pick the highest summed-confidence group
            • Step 5 — precision-weighted merge
            • Step 6 — disagreement and conflict penalties
            • Step 7 — confidence-rank assignment
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
        • JSON Curation (build_metadata_dict)
          • Overview
          • Theory
            • Float rounding policy
            • Allow-list discipline
            • Restrictions and assumptions
            • Sources of uncertainty
          • Configuration
          • Implementation
          • Examples
      • Annotations
        • Overview
        • Class hierarchy
        • Pipeline
        • Configuration
        • Per-model annotation contributions
        • API reference
      • Camera-rotation correction
        • Why per-instrument
        • The flag
        • Parameter vector
        • Per-technique strategy
        • Rank-deficient rotation
        • Ensemble combine in 3-D
        • JSON output
        • at_edge for rotation
      • Image Library
        • Layout
        • Sidecar schema (schema_version 1)
        • The calibration process
          • Why the library is the right substrate
          • The calibration loop
          • Coverage taxonomy
          • Confidence-tier semantics
          • Per-instrument calibration anchors
        • Adding a new entry
        • Tolerance regimes
        • Regression baselines
          • What checks the baselines
          • How a baseline is created or updated
    • Reprojection Internals
      • Module layout
      • Thread safety
      • Body mosaic storage
      • Ring sparse storage
      • Ring radius and longitude semantics
      • dtype propagation
      • Serialization
        • Supported formats
        • Format inference
        • kind / version scheme
        • Load-time dtype verification
        • RingOrbitModel serialization
      • Photometric models
      • Context managers
      • Adding a new photometric model
      • Cartographic model projection
      • Command-line layer
        • Two-pass workflow
      • Display layer
        • Adding a new display feature
        • Gamma stretch convention
    • Backplanes
      • Overview
      • Pipeline overview
      • Entry points
      • Restrictions and assumptions
      • Per-source backplane generation
        • Bodies
        • Rings
      • Distance-aware merge
      • FITS writer
      • Configuration
      • Snapshot helpers
      • Adding a backplane
      • Testing
      • API reference
    • PDS4 Bundle Generation
      • Pipeline overview
      • Driver: nav_create_bundle
      • Per-dataset extension points
        • The pds4 config block
      • Templated label workflow
        • Template tree
      • Output layout
      • Adding PDS4 support to a new dataset
      • API reference
    • The Image Simulator
      • Overview
      • What can be simulated
      • Scene ingredients
      • The render pipeline
      • Scene format
      • Scene parameter reference
        • Top-level fields
        • Body parameters
        • Ring parameters
        • Star parameters
        • Detector-noise block
        • Stray-light block
        • Instrument-config overrides
      • The simulated-image GUI
      • Running navigation on a simulated image
      • Exporting viewable PNGs
      • See also
    • Support Modules
      • Config and Static Data
        • The Config object
          • Sections
        • File layout
          • Per-file contents
          • Loader rules
          • Path resolution
        • Static data: catalogues and citation discipline
          • Static-data files
          • Citation requirement
          • Schema
          • Anti-hallucination procedure
          • Human review
          • Validation tests
          • Strip-rule guarantee
        • Adding a new tunable
      • Developer Guide: Logging
        • Why pdslogger
        • Log structure
        • Tests
        • Log levels
        • Conventions
    • Testing
      • Overview
      • Running the suite
      • Test kinds
      • Characterization runners and updaters
    • Extending the System
      • Adding a new dataset
      • Implementing PDS4 bundle generation methods
      • Adding a new instrument
      • Adding a new NavModel
      • Adding a new NavTechnique
      • Adding to the image library via the manual-nav dialog
    • Best Practices
      • Code style
      • Linting and typing
      • Testing
      • Documentation
    • API Reference
      • nav.feature
        • NavFeature
          • NavFeature.__post_init__()
          • NavFeature.body_name
          • NavFeature.feature_id
          • NavFeature.feature_type
          • NavFeature.flags
          • NavFeature.geometry
          • NavFeature.intensity_sigma_rel
          • NavFeature.position_cov_px
          • NavFeature.preferred_filter
          • NavFeature.reliability
          • NavFeature.reliability_reasons
          • NavFeature.source_model
          • NavFeature.subject_range_km
          • NavFeature.template_img
          • NavFeature.template_mask
          • NavFeature.usable_types
        • NavReliabilityBreakdown
          • NavReliabilityBreakdown.albedo_penalty
          • NavReliabilityBreakdown.blob_extent_px
          • NavReliabilityBreakdown.blob_snr
          • NavReliabilityBreakdown.in_body_silhouette
          • NavReliabilityBreakdown.in_saturation_or_cosmic
          • NavReliabilityBreakdown.incidence_factor
          • NavReliabilityBreakdown.overflow_fraction
          • NavReliabilityBreakdown.predicted_snr
          • NavReliabilityBreakdown.shadow_occluded_fraction
          • NavReliabilityBreakdown.smear_length_ok
          • NavReliabilityBreakdown.visible_arc_fraction
          • NavReliabilityBreakdown.visible_lit_fraction
        • body_names_from_features()
        • NavFeatureType
          • NavFeatureType.BODY_BLOB
          • NavFeatureType.BODY_DISC
          • NavFeatureType.CARTOGRAPHIC_MODEL
          • NavFeatureType.LIMB_ARC
          • NavFeatureType.RING_ANNULUS
          • NavFeatureType.RING_EDGE
          • NavFeatureType.STAR
          • NavFeatureType.TERMINATOR_ARC
          • NavFeatureType.TITAN_LIMB
        • BodyBlobGeometry
          • BodyBlobGeometry.bbox_extfov_vu
          • BodyBlobGeometry.predicted_center_vu
          • BodyBlobGeometry.predicted_diameter_px
        • BodyDiscGeometry
          • BodyDiscGeometry.bbox_extfov_vu
          • BodyDiscGeometry.overflow_fraction
          • BodyDiscGeometry.predicted_center_vu
        • CartographicModelGeometry
          • CartographicModelGeometry.bbox_extfov_vu
          • CartographicModelGeometry.overflow_fraction
          • CartographicModelGeometry.predicted_center_vu
        • LimbPolyline
          • LimbPolyline.bbox_extfov_vu
          • LimbPolyline.normals_vu
          • LimbPolyline.sigma_normal_per_vertex_px
          • LimbPolyline.sigma_tangent_per_vertex_px
          • LimbPolyline.vertices_vu
        • NavFeatureGeometry
        • RingAnnulusGeometry
          • RingAnnulusGeometry.bbox_extfov_vu
          • RingAnnulusGeometry.predicted_center_vu
        • RingEdgePolyline
          • RingEdgePolyline.bbox_extfov_vu
          • RingEdgePolyline.is_straight_line
          • RingEdgePolyline.normals_vu
          • RingEdgePolyline.sigma_along_edge_per_vertex_px
          • RingEdgePolyline.sigma_radial_per_vertex_px
          • RingEdgePolyline.vertices_vu
        • StarGeometry
          • StarGeometry.bbox_extfov_vu
          • StarGeometry.catalog_vu
          • StarGeometry.predicted_vu
        • TerminatorPolyline
          • TerminatorPolyline.bbox_extfov_vu
          • TerminatorPolyline.normals_vu
          • TerminatorPolyline.sigma_normal_per_vertex_px
          • TerminatorPolyline.sigma_tangent_per_vertex_px
          • TerminatorPolyline.vertices_vu
        • BodyBlobFlags
          • BodyBlobFlags.__post_init__()
          • BodyBlobFlags.body_name
          • BodyBlobFlags.phase_angle_deg
          • BodyBlobFlags.phase_irregularity_factor
          • BodyBlobFlags.predicted_diameter_px
          • BodyBlobFlags.sub_solar_dir_vu
        • BodyDiscFlags
          • BodyDiscFlags.__post_init__()
          • BodyDiscFlags.body_name
          • BodyDiscFlags.overflow_fov_fraction
        • CartographicModelFlags
          • CartographicModelFlags.body_name
          • CartographicModelFlags.mosaic_source
        • LimbArcFlags
          • LimbArcFlags.__post_init__()
          • LimbArcFlags.body_name
          • LimbArcFlags.visible_arc_fraction
        • NavFeatureFlags
        • RingAnnulusFlags
          • RingAnnulusFlags.__post_init__()
          • RingAnnulusFlags.constituent_edge_count
          • RingAnnulusFlags.planet_name
        • RingEdgeFlags
          • RingEdgeFlags.edge_name
          • RingEdgeFlags.is_straight_line
          • RingEdgeFlags.planet_name
          • RingEdgeFlags.polarity_predictable
        • StarFlags
          • StarFlags.__post_init__()
          • StarFlags.in_body_silhouette
          • StarFlags.in_saturation_or_cosmic_mask
          • StarFlags.predicted_snr
          • StarFlags.saturated
          • StarFlags.smear_length_px
          • StarFlags.vmag
        • TerminatorArcFlags
          • TerminatorArcFlags.__post_init__()
          • TerminatorArcFlags.body_name
          • TerminatorArcFlags.phase_angle_factor
          • TerminatorArcFlags.visible_arc_fraction
        • compose_dialog_overlay()
        • compose_template_features()
        • DEFAULT_RELIABILITY_THRESHOLDS
        • FeatureReliabilityGate
          • FeatureReliabilityGate.__post_init__()
          • FeatureReliabilityGate.apply()
          • FeatureReliabilityGate.thresholds
        • GatedFeatureRecord
          • GatedFeatureRecord.feature
          • GatedFeatureRecord.reason
        • AGREEMENT_FACTOR_CAP
        • COMBINED_CONFIDENCE_CAP
        • INCIDENCE_FACTOR_ANGLE_CAP_DEG
        • INCIDENCE_FACTOR_CLIP_DEG
        • JSON_INF_SENTINEL
        • MAX_INCIDENCE_FACTOR_CAP
        • MIN_ANISOTROPIC_SMEAR_PX
      • nav.nav_orchestrator
        • NavOrchestrator
          • NavOrchestrator.navigate()
          • NavOrchestrator.prepare()
        • OrchestratorPrep
          • OrchestratorPrep.annotations
          • OrchestratorPrep.context
          • OrchestratorPrep.feature_inventory
          • OrchestratorPrep.features
          • OrchestratorPrep.image_classifier
          • OrchestratorPrep.model_metadata
          • OrchestratorPrep.provenance
        • NavContext
          • NavContext.cosmic_ray_mask_ext
          • NavContext.fit_camera_rotation
          • NavContext.image_classifier
          • NavContext.image_edge_dt_ext
          • NavContext.image_ext
          • NavContext.image_gradient_ext
          • NavContext.image_gradient_vu_ext
          • NavContext.image_noise_sigma
          • NavContext.max_rotation_deg
          • NavContext.obs
          • NavContext.pre_filter_applied
          • NavContext.prior_covariance_px2
          • NavContext.prior_offset_px
          • NavContext.provenance
          • NavContext.saturation_mask_ext
          • NavContext.sensor_mask_ext
          • NavContext.with_prior()
        • NavResult
          • NavResult.__post_init__()
          • NavResult.annotations
          • NavResult.confidence
          • NavResult.confidence_rank
          • NavResult.conflicted()
          • NavResult.covariance_px2
          • NavResult.failed()
          • NavResult.feature_inventory
          • NavResult.image_classifier
          • NavResult.model_metadata
          • NavResult.offset_px
          • NavResult.per_technique
          • NavResult.provenance
          • NavResult.rotation_rad
          • NavResult.sigma_along_unobservable_px
          • NavResult.sigma_px
          • NavResult.sigma_rotation_rad
          • NavResult.status
          • NavResult.status_reason
          • NavResult.success()
        • NavFeatureSummary
          • NavFeatureSummary.__post_init__()
          • NavFeatureSummary.bbox_extfov_vu
          • NavFeatureSummary.feature_id
          • NavFeatureSummary.feature_type
          • NavFeatureSummary.gate_reason
          • NavFeatureSummary.gated
          • NavFeatureSummary.reliability
          • NavFeatureSummary.source_model
        • ImageQualityThresholds
          • ImageQualityThresholds.blank_max_dn
          • ImageQualityThresholds.max_missing_frac_clean
          • ImageQualityThresholds.max_saturation_frac_clean
          • ImageQualityThresholds.missing_data_marker_dn
          • ImageQualityThresholds.noisy_threshold
          • ImageQualityThresholds.partial_dropout_min_frac
          • ImageQualityThresholds.saturation_threshold_dn
        • NavImageClassifier
          • NavImageClassifier.classify()
          • NavImageClassifier.thresholds
        • NavImageClassifierResult
          • NavImageClassifierResult.flags
          • NavImageClassifierResult.image_class
          • NavImageClassifierResult.max_dn
          • NavImageClassifierResult.missing_frac
          • NavImageClassifierResult.noise_sigma
          • NavImageClassifierResult.saturation_frac
        • DEFAULT_DT_HALF_WIDTH_PX
        • DEFAULT_EDGE_THRESHOLD_K_SIGMA
        • DEFAULT_IMAGE_GRADIENT_SIGMA_PX
        • ImageDerivativesConfig
          • ImageDerivativesConfig.__post_init__()
          • ImageDerivativesConfig.dt_half_width_px
          • ImageDerivativesConfig.edge_threshold_k_sigma
          • ImageDerivativesConfig.image_gradient_sigma_px
        • build_image_edge_dt()
        • compute_all_image_derivatives()
        • compute_image_gradient_vu()
        • Provenance
          • Provenance.__post_init__()
          • Provenance.extractor_names
          • Provenance.image_et
          • Provenance.pipeline_run_iso8601
          • Provenance.rms_nav_git_sha
          • Provenance.rms_nav_version
          • Provenance.spice_kernel_count
          • Provenance.spice_kernels
          • Provenance.static_data_hashes
          • Provenance.technique_names
        • ProvenanceMetadata
          • ProvenanceMetadata.git_sha
          • ProvenanceMetadata.spice_kernels
          • ProvenanceMetadata.static_data_hashes
        • collect_provenance_metadata()
        • EnsembleConfig
          • EnsembleConfig.agreement_gap
          • EnsembleConfig.agreement_pixel_floor
          • EnsembleConfig.agreement_sigma
          • EnsembleConfig.conflicted_confidence_multiplier
          • EnsembleConfig.disagreement_penalty
          • EnsembleConfig.max_allowed_rotation_deg
          • EnsembleConfig.min_confidence
          • EnsembleConfig.pinvh_rcond
          • EnsembleConfig.tier_thresholds
        • derive_confidence_rank()
        • ensemble()
        • assert_diagnostic_fields_present()
        • build_metadata_dict()
        • InstrumentSettings
          • InstrumentSettings.data_units
          • InstrumentSettings.fit_camera_rotation
          • InstrumentSettings.marker_value
          • InstrumentSettings.max_rotation_deg
          • InstrumentSettings.saturation_dn
          • InstrumentSettings.thresholds
        • instrument_settings_from_obs()
      • nav.nav_model
        • NavModel
          • NavModel.__init_subclass__()
          • NavModel.create_model()
          • NavModel.instances_for_obs()
          • NavModel.metadata
          • NavModel.name
          • NavModel.obs
          • NavModel.to_annotations()
          • NavModel.to_features()
        • build_models_for_obs()
        • BODY_SHAPE_TABLE
        • BodyShape
          • BodyShape.albedo_variation
          • BodyShape.crater_scale_km
          • BodyShape.ellipsoid_rms_residual_km
          • BodyShape.min_blob_diameter_px
          • BodyShape.shape_class_hint
          • BodyShape.spice_orbital_residual_km
        • DEFAULT_BODY_SHAPE
        • load_body_shape()
        • BODY_DISC_MAX_OVERFLOW_FRACTION
        • BODY_DISC_MIN_VISIBLE_LIT_FRACTION
        • BODY_POSITION_SLOP_FRAC
        • LIMB_ARC_MAX_UNCERTAINTY_PX
        • NavModelBody
          • NavModelBody.create_model()
          • NavModelBody.instances_for_obs()
          • NavModelBody.to_annotations()
          • NavModelBody.to_features()
        • TERMINATOR_MIN_PHASE_FACTOR
        • TERMINATOR_MIN_VERTICES
        • BODY_BLOB_MIN_DIAMETER_PX
        • NavModelBodyBase
        • NavModelBodySimulated
          • NavModelBodySimulated.create_model()
          • NavModelBodySimulated.instances_for_obs()
          • NavModelBodySimulated.to_annotations()
          • NavModelBodySimulated.to_features()
        • FLAT_CURVATURE_THRESHOLD_PX
        • NavModelRings
          • NavModelRings.create_model()
          • NavModelRings.instances_for_obs()
          • NavModelRings.to_annotations()
          • NavModelRings.to_features()
        • RING_EDGE_DEFAULT_RELIABILITY
        • RING_EDGE_SIGMA_ALONG_PX
        • NavModelRingsBase
        • NavModelRingsSimulated
          • NavModelRingsSimulated.create_model()
          • NavModelRingsSimulated.instances_for_obs()
          • NavModelRingsSimulated.to_annotations()
          • NavModelRingsSimulated.to_features()
        • NavModelTitan
          • NavModelTitan.create_model()
          • NavModelTitan.to_annotations()
          • NavModelTitan.to_features()
        • nav.nav_model.rings
          • RingBaseOrbitMode
            • RingBaseOrbitMode.__post_init__()
            • RingBaseOrbitMode.a
            • RingBaseOrbitMode.ae
            • RingBaseOrbitMode.long_peri
            • RingBaseOrbitMode.rate_peri
            • RingBaseOrbitMode.rms
          • RingEdgeData
            • RingEdgeData.__post_init__()
            • RingEdgeData.base_orbit
            • RingEdgeData.base_radius
            • RingEdgeData.parsed_modes_for_backplane()
            • RingEdgeData.perturbations
            • RingEdgeData.radial_perturbations()
            • RingEdgeData.rms
          • RingFeatureType
            • RingFeatureType.GAP
            • RingFeatureType.RINGLET
          • RingPerturbationMode
            • RingPerturbationMode.__post_init__()
            • RingPerturbationMode.amplitude
            • RingPerturbationMode.is_inclination_mode
            • RingPerturbationMode.mode_num
            • RingPerturbationMode.pattern_speed
            • RingPerturbationMode.phase
          • RingFeature
            • RingFeature.__post_init__()
            • RingFeature.all_base_radii()
            • RingFeature.edge_labels
            • RingFeature.end_date
            • RingFeature.feature_type
            • RingFeature.from_config()
            • RingFeature.inner_edge
            • RingFeature.is_in_radius_range()
            • RingFeature.is_visible_at()
            • RingFeature.key
            • RingFeature.max_extent_radius
            • RingFeature.name
            • RingFeature.outer_edge
            • RingFeature.render()
            • RingFeature.start_date
            • RingFeature.uncertainty
            • RingFeature.uses_fade_for_edge()
          • validate_no_date_overlaps()
          • RingFeatureFilter
            • RingFeatureFilter.filter()
          • Design notes
          • compute_antialiasing()
          • compute_edge_fade()
          • compute_fade_integral()
          • RingsRenderContext
            • RingsRenderContext.__post_init__()
            • RingsRenderContext.all_edge_radii
            • RingsRenderContext.epoch
            • RingsRenderContext.fade_width_pix
            • RingsRenderContext.logger
            • RingsRenderContext.obs
            • RingsRenderContext.resolutions
            • RingsRenderContext.ring_target
          • RingRenderResult
            • RingRenderResult.__post_init__()
            • RingRenderResult.edge_info_list
            • RingRenderResult.model_img
            • RingRenderResult.model_mask
            • RingRenderResult.uncertainty
        • nav.nav_model.stars
          • NavModelStars
            • NavModelStars.create_model()
            • NavModelStars.instances_for_obs()
            • NavModelStars.stars
            • NavModelStars.to_annotations()
            • NavModelStars.to_features()
          • NavModelStarsSimulated
            • NavModelStarsSimulated.create_model()
            • NavModelStarsSimulated.instances_for_obs()
          • CATALOG_MAGNITUDE_BINS
          • aberrate_star()
          • get_tycho2_catalog()
          • get_ucac4_catalog()
          • get_ybsc_catalog()
          • reduce_catalogs()
          • select_radec_list()
          • stars_in_extfov()
          • mark_body_and_ring_conflicts()
          • parse_ring_occlusion_annuli()
          • integrated_signal_dn()
          • predicted_snr()
          • psf_aperture_pixels()
          • psf_sigma_px()
          • compute_smear_vector_px()
          • movement_granularity_px()
          • render_smeared_psf()
          • smear_length_px()
          • DAOPHOT_DEFAULT_DETECTION_SIGMA
          • DAOPHOT_DEFAULT_ROUNDNESS_BOUND
          • DAOPHOT_DEFAULT_SHARPNESS_MAX
          • DAOPHOT_DEFAULT_SHARPNESS_MIN
          • DetectedSource
            • DetectedSource.peak_dn
            • DetectedSource.roundness
            • DetectedSource.saturated
            • DetectedSource.sharpness
            • DetectedSource.u
            • DetectedSource.v
          • apply_shape_cuts()
          • centroid_gaussian_fit()
          • centroid_saturated()
          • detect_ccd_bloom_columns()
          • detect_sources()
          • matched_filter_image()
      • nav.nav_technique
        • NavTechnique
          • NavTechnique.__init_subclass__()
          • NavTechnique.accepts_feature_types
          • NavTechnique.confidence_attributes
          • NavTechnique.confidence_spec
          • NavTechnique.is_feasible()
          • NavTechnique.name
          • NavTechnique.navigate()
          • NavTechnique.requires_prior
          • NavTechnique.tier
          • NavTechnique.tuning
        • ROTATION_AT_EDGE_FRACTION
        • ROTATION_UNOBSERVABLE_VARIANCE
        • embed_rotation_unobservable()
        • filter_technique_names()
        • log_confidence_breakdown()
        • rotation_pivot_distance_px()
        • rotation_unobservable_sigma_rad()
        • search_window_for_obs()
        • technique_tier()
        • validate_registered_confidence_specs()
        • NavFeasibilityReport
          • NavFeasibilityReport.__post_init__()
          • NavFeasibilityReport.consumed_feature_count
          • NavFeasibilityReport.feasible
          • NavFeasibilityReport.reason
        • NavTechniqueResult
          • NavTechniqueResult.__post_init__()
          • NavTechniqueResult.at_edge
          • NavTechniqueResult.confidence
          • NavTechniqueResult.covariance_px2
          • NavTechniqueResult.diagnostics
          • NavTechniqueResult.feature_ids
          • NavTechniqueResult.offset_px
          • NavTechniqueResult.rotation_rad
          • NavTechniqueResult.sigma_rotation_rad
          • NavTechniqueResult.source_bodies
          • NavTechniqueResult.spurious
          • NavTechniqueResult.technique_name
        • BodyBlobDiagnostics
          • BodyBlobDiagnostics.CURATOR_FIELDS
          • BodyBlobDiagnostics.blob_count
          • BodyBlobDiagnostics.body_extent_px
          • BodyBlobDiagnostics.body_snr_inside_predicted_bbox
          • BodyBlobDiagnostics.max_phase_angle_deg
          • BodyBlobDiagnostics.max_phase_irregularity_factor
          • BodyBlobDiagnostics.residual_px
        • BodyDiscDiagnostics
          • BodyDiscDiagnostics.CURATOR_FIELDS
          • BodyDiscDiagnostics.body_count
          • BodyDiscDiagnostics.consistency_px
          • BodyDiscDiagnostics.consistency_ratio
          • BodyDiscDiagnostics.ncc_peak
          • BodyDiscDiagnostics.peak_to_runner_up_ratio
          • BodyDiscDiagnostics.used_gradient
        • BodyLimbDiagnostics
          • BodyLimbDiagnostics.CURATOR_FIELDS
          • BodyLimbDiagnostics.dt_fit_rms_px
          • BodyLimbDiagnostics.lm_iterations
          • BodyLimbDiagnostics.tukey_inlier_count
          • BodyLimbDiagnostics.visible_arc_px
          • BodyLimbDiagnostics.visible_limb_arc_fraction
        • BodyTerminatorDiagnostics
          • BodyTerminatorDiagnostics.CURATOR_FIELDS
          • BodyTerminatorDiagnostics.dt_fit_rms_px
          • BodyTerminatorDiagnostics.lm_iterations
          • BodyTerminatorDiagnostics.tukey_inlier_count
          • BodyTerminatorDiagnostics.visible_arc_px
          • BodyTerminatorDiagnostics.visible_terminator_arc_fraction
        • ManualNavDiagnostics
          • ManualNavDiagnostics.CURATOR_FIELDS
          • ManualNavDiagnostics.operator_accepted
        • NavTechniqueDiagnostics
        • RingAnnulusDiagnostics
          • RingAnnulusDiagnostics.CURATOR_FIELDS
          • RingAnnulusDiagnostics.annulus_count
          • RingAnnulusDiagnostics.ncc_peak
          • RingAnnulusDiagnostics.peak_to_runner_up_ratio
          • RingAnnulusDiagnostics.used_gradient
        • RingEdgeDiagnostics
          • RingEdgeDiagnostics.CURATOR_FIELDS
          • RingEdgeDiagnostics.edge_count
          • RingEdgeDiagnostics.is_rank_1
          • RingEdgeDiagnostics.per_edge_dt_rms_mean
          • RingEdgeDiagnostics.per_edge_dt_rms_summed
          • RingEdgeDiagnostics.total_edge_length_px
        • StarFieldDiagnostics
          • StarFieldDiagnostics.CURATOR_FIELDS
          • StarFieldDiagnostics.median_residual_px
          • StarFieldDiagnostics.n_catalog_predicted
          • StarFieldDiagnostics.n_detected_sources
          • StarFieldDiagnostics.n_inliers
          • StarFieldDiagnostics.n_triplets_evaluated
        • StarRefineDiagnostics
          • StarRefineDiagnostics.CURATOR_FIELDS
          • StarRefineDiagnostics.median_pos_err_px
          • StarRefineDiagnostics.n_stars_used
          • StarRefineDiagnostics.residual_scatter_px
        • StarUniqueMatchDiagnostics
          • StarUniqueMatchDiagnostics.CURATOR_FIELDS
          • StarUniqueMatchDiagnostics.brightness_margin_mag
          • StarUniqueMatchDiagnostics.mode
          • StarUniqueMatchDiagnostics.predicted_snr
          • StarUniqueMatchDiagnostics.residual_px
        • ConfidenceBreakdown
          • ConfidenceBreakdown.alpha0
          • ConfidenceBreakdown.confidence
          • ConfidenceBreakdown.hard_cap_applied
          • ConfidenceBreakdown.hard_zero
          • ConfidenceBreakdown.sigmoid_arg
          • ConfidenceBreakdown.terms
        • ConfidenceSpec
          • ConfidenceSpec.__post_init__()
          • ConfidenceSpec.alpha0
          • ConfidenceSpec.hard_cap
          • ConfidenceSpec.hard_zero_if
          • ConfidenceSpec.terms
        • ConfidenceTerm
          • ConfidenceTerm.__post_init__()
          • ConfidenceTerm.alpha
          • ConfidenceTerm.cap_at
          • ConfidenceTerm.divisor
          • ConfidenceTerm.feature
          • ConfidenceTerm.offset
        • ConfidenceTermContribution
          • ConfidenceTermContribution.alpha
          • ConfidenceTermContribution.contribution
          • ConfidenceTermContribution.feature
          • ConfidenceTermContribution.normalized
          • ConfidenceTermContribution.raw
        • evaluate_sigmoid_combination()
        • ConfidenceConfigError
        • load_confidence_spec()
        • load_technique_tuning()
        • DEFAULT_LM_DAMPING
        • DEFAULT_LM_MAX_ITERATIONS
        • DEFAULT_LM_STEP_TOLERANCE
        • DEFAULT_PINVH_RCOND
        • DEFAULT_RIDGE_HALF_WIDTH_PX
        • DEFAULT_RIDGE_MAX_ITERATIONS
        • DEFAULT_RIDGE_MAX_TOTAL_DISPLACEMENT_PX
        • DEFAULT_RIDGE_SAMPLE_STEP_PX
        • DEFAULT_TUKEY_C
        • LMRefineResult
          • LMRefineResult.__post_init__()
          • LMRefineResult.converged
          • LMRefineResult.covariance
          • LMRefineResult.degenerate
          • LMRefineResult.inlier_count
          • LMRefineResult.iterations
          • LMRefineResult.offset_vu
          • LMRefineResult.raw_rms_px
          • LMRefineResult.residuals_px
          • LMRefineResult.rms_px
          • LMRefineResult.rotation_rad
          • LMRefineResult.weights
        • RidgeRefineResult
          • RidgeRefineResult.applied
          • RidgeRefineResult.converged
          • RidgeRefineResult.iterations
          • RidgeRefineResult.offset_vu
          • RidgeRefineResult.rotation_rad
        • build_polyline_mask()
        • coarse_ncc_search()
        • gradient_ridge_refine()
        • information_matrix_to_covariance()
        • lm_subpixel_refine()
        • polarity_filter()
        • tukey_biweight_weights()
        • BodyLimbNav
          • BodyLimbNav.accepts_feature_types
          • BodyLimbNav.confidence_attributes
          • BodyLimbNav.is_feasible()
          • BodyLimbNav.name
          • BodyLimbNav.navigate()
          • BodyLimbNav.requires_prior
        • BodyTerminatorNav
          • BodyTerminatorNav.accepts_feature_types
          • BodyTerminatorNav.confidence_attributes
          • BodyTerminatorNav.is_feasible()
          • BodyTerminatorNav.name
          • BodyTerminatorNav.navigate()
          • BodyTerminatorNav.requires_prior
          • BodyTerminatorNav.tier
        • BodyDiscCorrelateNav
          • BodyDiscCorrelateNav.accepts_feature_types
          • BodyDiscCorrelateNav.confidence_attributes
          • BodyDiscCorrelateNav.is_feasible()
          • BodyDiscCorrelateNav.name
          • BodyDiscCorrelateNav.navigate()
          • BodyDiscCorrelateNav.requires_prior
        • BodyBlobNav
          • BodyBlobNav.accepts_feature_types
          • BodyBlobNav.confidence_attributes
          • BodyBlobNav.is_feasible()
          • BodyBlobNav.name
          • BodyBlobNav.navigate()
          • BodyBlobNav.requires_prior
          • BodyBlobNav.tier
        • RingEdgeNav
          • RingEdgeNav.accepts_feature_types
          • RingEdgeNav.confidence_attributes
          • RingEdgeNav.is_feasible()
          • RingEdgeNav.name
          • RingEdgeNav.navigate()
          • RingEdgeNav.requires_prior
        • RingAnnulusNav
          • RingAnnulusNav.accepts_feature_types
          • RingAnnulusNav.confidence_attributes
          • RingAnnulusNav.is_feasible()
          • RingAnnulusNav.name
          • RingAnnulusNav.navigate()
          • RingAnnulusNav.requires_prior
        • StarFieldFromCatalogNav
          • StarFieldFromCatalogNav.accepts_feature_types
          • StarFieldFromCatalogNav.confidence_attributes
          • StarFieldFromCatalogNav.is_feasible()
          • StarFieldFromCatalogNav.name
          • StarFieldFromCatalogNav.navigate()
          • StarFieldFromCatalogNav.requires_prior
        • StarRefineNav
          • StarRefineNav.accepts_feature_types
          • StarRefineNav.confidence_attributes
          • StarRefineNav.is_feasible()
          • StarRefineNav.name
          • StarRefineNav.navigate()
          • StarRefineNav.requires_prior
        • StarUniqueMatchNav
          • StarUniqueMatchNav.accepts_feature_types
          • StarUniqueMatchNav.confidence_attributes
          • StarUniqueMatchNav.is_feasible()
          • StarUniqueMatchNav.name
          • StarUniqueMatchNav.navigate()
          • StarUniqueMatchNav.requires_prior
        • NavTechniqueManual
          • NavTechniqueManual.accepts_feature_types
          • NavTechniqueManual.is_feasible()
          • NavTechniqueManual.name
          • NavTechniqueManual.navigate()
          • NavTechniqueManual.requires_prior
        • run_manual_nav()
      • nav.reproj
        • BodyMosaic
          • BodyMosaic.body_name
          • BodyMosaic.add()
          • BodyMosaic.bounds
          • BodyMosaic.generate_latitudes()
          • BodyMosaic.generate_longitudes()
          • BodyMosaic.latitude_longitude_to_pixels()
          • BodyMosaic.reproject()
          • BodyMosaic.to_bounded()
          • BodyMosaic.to_full()
        • BodyMosaicData
          • BodyMosaicData.body_name
          • BodyMosaicData.contributing_image_names
          • BodyMosaicData.eff_resolution
          • BodyMosaicData.emission
          • BodyMosaicData.image_dtype
          • BodyMosaicData.image_number
          • BodyMosaicData.img
          • BodyMosaicData.incidence
          • BodyMosaicData.lat_range
          • BodyMosaicData.lat_resolution
          • BodyMosaicData.latlon_type
          • BodyMosaicData.load()
          • BodyMosaicData.lon_direction
          • BodyMosaicData.lon_range
          • BodyMosaicData.lon_resolution
          • BodyMosaicData.metadata_dtype
          • BodyMosaicData.phase
          • BodyMosaicData.photometric_model_name
          • BodyMosaicData.resolution
          • BodyMosaicData.save()
          • BodyMosaicData.sub_observer_lat_per_image
          • BodyMosaicData.sub_observer_lon_per_image
          • BodyMosaicData.sub_solar_lat_per_image
          • BodyMosaicData.sub_solar_lon_per_image
          • BodyMosaicData.time
        • BodyMosaicMergeStrategy
          • BodyMosaicMergeStrategy.BEST_RESOLUTION
        • BodyReprojResult
          • BodyReprojResult.body_name
          • BodyReprojResult.eff_resolution
          • BodyReprojResult.emission
          • BodyReprojResult.image_dtype
          • BodyReprojResult.image_name
          • BodyReprojResult.img
          • BodyReprojResult.incidence
          • BodyReprojResult.lat_idx_range
          • BodyReprojResult.lat_resolution
          • BodyReprojResult.latlon_type
          • BodyReprojResult.load()
          • BodyReprojResult.lon_direction
          • BodyReprojResult.lon_idx_range
          • BodyReprojResult.lon_resolution
          • BodyReprojResult.metadata_dtype
          • BodyReprojResult.phase
          • BodyReprojResult.photometric_model_name
          • BodyReprojResult.resolution
          • BodyReprojResult.save()
          • BodyReprojResult.sub_observer_lat
          • BodyReprojResult.sub_observer_lon
          • BodyReprojResult.sub_solar_lat
          • BodyReprojResult.sub_solar_lon
          • BodyReprojResult.time
        • USE_MOSAIC_LIMITS
        • RingMosaic
          • RingMosaic.add()
          • RingMosaic.body_name
          • RingMosaic.bounds
          • RingMosaic.generate_longitudes()
          • RingMosaic.generate_radii()
          • RingMosaic.longitude_radius_to_pixels()
          • RingMosaic.orbit_pixels()
          • RingMosaic.reproject()
          • RingMosaic.ring_body_name
          • RingMosaic.shadow_body_name
          • RingMosaic.to_bounded()
          • RingMosaic.to_full()
          • RingMosaic.to_sparse()
        • RingMosaicData
          • RingMosaicData.body_name
          • RingMosaicData.contributing_image_names
          • RingMosaicData.image_dtype
          • RingMosaicData.image_number
          • RingMosaicData.img
          • RingMosaicData.load()
          • RingMosaicData.longitude_antimask
          • RingMosaicData.longitude_range
          • RingMosaicData.longitude_resolution
          • RingMosaicData.mean_angular_resolution
          • RingMosaicData.mean_emission
          • RingMosaicData.mean_incidence
          • RingMosaicData.mean_phase
          • RingMosaicData.mean_radial_resolution
          • RingMosaicData.metadata_dtype
          • RingMosaicData.orbit_model_name
          • RingMosaicData.photometric_model_name
          • RingMosaicData.radius_inner
          • RingMosaicData.radius_outer
          • RingMosaicData.radius_resolution
          • RingMosaicData.ring_body_name
          • RingMosaicData.save()
          • RingMosaicData.shadow_body_name
          • RingMosaicData.time
        • RingMosaicMergeStrategy
          • RingMosaicMergeStrategy.BEST_RESOLUTION
          • RingMosaicMergeStrategy.MOST_COVERAGE_THEN_RESOLUTION
        • RingReprojResult
          • RingReprojResult.body_name
          • RingReprojResult.image_dtype
          • RingReprojResult.image_name
          • RingReprojResult.img
          • RingReprojResult.incidence
          • RingReprojResult.load()
          • RingReprojResult.longitude_antimask
          • RingReprojResult.longitude_resolution
          • RingReprojResult.mean_angular_resolution
          • RingReprojResult.mean_emission
          • RingReprojResult.mean_phase
          • RingReprojResult.mean_radial_resolution
          • RingReprojResult.metadata_dtype
          • RingReprojResult.orbit_model
          • RingReprojResult.photometric_model_name
          • RingReprojResult.radius_inner
          • RingReprojResult.radius_outer
          • RingReprojResult.radius_resolution
          • RingReprojResult.save()
          • RingReprojResult.time
        • CartographicModelResult
          • CartographicModelResult.model_img
          • CartographicModelResult.resolution_ratio
        • create_cartographic_model()
        • LambertModel
          • LambertModel.correct()
          • LambertModel.min_cos_incidence
          • LambertModel.name
          • LambertModel.uncorrect()
        • LommelSeeligerModel
          • LommelSeeligerModel.correct()
          • LommelSeeligerModel.min_cos_incidence
          • LommelSeeligerModel.min_denom
          • LommelSeeligerModel.name
          • LommelSeeligerModel.uncorrect()
        • MinnaertModel
          • MinnaertModel.correct()
          • MinnaertModel.k
          • MinnaertModel.min_cos_emission
          • MinnaertModel.min_cos_incidence
          • MinnaertModel.name
          • MinnaertModel.uncorrect()
        • PhotometricModel
          • PhotometricModel.correct()
          • PhotometricModel.name
        • photometric_model_from_name()
        • FRING_CORE
        • RingOrbitModel
          • RingOrbitModel.__post_init__()
          • RingOrbitModel.a
          • RingOrbitModel.corotating_to_inertial()
          • RingOrbitModel.dw
          • RingOrbitModel.e
          • RingOrbitModel.epoch_utc
          • RingOrbitModel.inertial_to_corotating()
          • RingOrbitModel.longitude_radius()
          • RingOrbitModel.mean_motion
          • RingOrbitModel.name
          • RingOrbitModel.radius_at_longitude()
          • RingOrbitModel.w0
        • get_orbit_model_by_name()
      • nav.dataset
        • DataSetPDS3
          • DataSetPDS3.add_selection_arguments()
          • DataSetPDS3.pds3_holdings_root
          • DataSetPDS3.supported_grouping()
          • DataSetPDS3.yield_image_files_from_arguments()
          • DataSetPDS3.yield_image_files_index()
        • DataSetPDS4
          • DataSetPDS4.add_selection_arguments()
          • DataSetPDS4.supported_grouping()
          • DataSetPDS4.yield_image_files_from_arguments()
          • DataSetPDS4.yield_image_files_index()
        • DataSetPDS3CassiniISS
          • DataSetPDS3CassiniISS.add_selection_arguments()
          • DataSetPDS3CassiniISS.pds4_bundle_name()
          • DataSetPDS3CassiniISS.pds4_bundle_path_for_image()
          • DataSetPDS3CassiniISS.pds4_bundle_template_dir()
          • DataSetPDS3CassiniISS.pds4_image_name_to_browse_lid()
          • DataSetPDS3CassiniISS.pds4_image_name_to_browse_lidvid()
          • DataSetPDS3CassiniISS.pds4_image_name_to_data_lid()
          • DataSetPDS3CassiniISS.pds4_image_name_to_data_lidvid()
          • DataSetPDS3CassiniISS.pds4_path_stub()
          • DataSetPDS3CassiniISS.pds4_template_variables()
          • DataSetPDS3CassiniISS.supported_grouping()
          • DataSetPDS3CassiniISS.yield_image_files_index()
        • DataSetPDS3CassiniISSCruise
        • DataSetPDS3CassiniISSSaturn
        • DataSetPDS3VoyagerISS
          • DataSetPDS3VoyagerISS.pds4_bundle_name()
          • DataSetPDS3VoyagerISS.pds4_bundle_path_for_image()
          • DataSetPDS3VoyagerISS.pds4_bundle_template_dir()
          • DataSetPDS3VoyagerISS.pds4_image_name_to_browse_lid()
          • DataSetPDS3VoyagerISS.pds4_image_name_to_browse_lidvid()
          • DataSetPDS3VoyagerISS.pds4_image_name_to_data_lid()
          • DataSetPDS3VoyagerISS.pds4_image_name_to_data_lidvid()
          • DataSetPDS3VoyagerISS.pds4_path_stub()
          • DataSetPDS3VoyagerISS.pds4_template_variables()
        • DataSetPDS3GalileoSSI
          • DataSetPDS3GalileoSSI.pds4_bundle_name()
          • DataSetPDS3GalileoSSI.pds4_bundle_path_for_image()
          • DataSetPDS3GalileoSSI.pds4_bundle_template_dir()
          • DataSetPDS3GalileoSSI.pds4_image_name_to_browse_lid()
          • DataSetPDS3GalileoSSI.pds4_image_name_to_browse_lidvid()
          • DataSetPDS3GalileoSSI.pds4_image_name_to_data_lid()
          • DataSetPDS3GalileoSSI.pds4_image_name_to_data_lidvid()
          • DataSetPDS3GalileoSSI.pds4_path_stub()
          • DataSetPDS3GalileoSSI.pds4_template_variables()
        • DataSetPDS3NewHorizonsLORRI
          • DataSetPDS3NewHorizonsLORRI.pds4_bundle_name()
          • DataSetPDS3NewHorizonsLORRI.pds4_bundle_path_for_image()
          • DataSetPDS3NewHorizonsLORRI.pds4_bundle_template_dir()
          • DataSetPDS3NewHorizonsLORRI.pds4_image_name_to_browse_lid()
          • DataSetPDS3NewHorizonsLORRI.pds4_image_name_to_browse_lidvid()
          • DataSetPDS3NewHorizonsLORRI.pds4_image_name_to_data_lid()
          • DataSetPDS3NewHorizonsLORRI.pds4_image_name_to_data_lidvid()
          • DataSetPDS3NewHorizonsLORRI.pds4_path_stub()
          • DataSetPDS3NewHorizonsLORRI.pds4_template_variables()
      • nav.obs
        • Obs
        • ObsSnapshot
          • ObsSnapshot.body_distance()
          • ObsSnapshot.bp
          • ObsSnapshot.center_bp
          • ObsSnapshot.clip_extfov()
          • ObsSnapshot.clip_fov()
          • ObsSnapshot.clip_rect_extfov()
          • ObsSnapshot.clip_rect_fov()
          • ObsSnapshot.closest_planet
          • ObsSnapshot.corner_bp
          • ObsSnapshot.data_shape_u
          • ObsSnapshot.data_shape_uv
          • ObsSnapshot.data_shape_v
          • ObsSnapshot.data_shape_vu
          • ObsSnapshot.ext_bp
          • ObsSnapshot.ext_corner_bp
          • ObsSnapshot.extdata
          • ObsSnapshot.extdata_shape_uv
          • ObsSnapshot.extdata_shape_vu
          • ObsSnapshot.extfov_data_sensor_mask()
          • ObsSnapshot.extfov_margin_u
          • ObsSnapshot.extfov_margin_v
          • ObsSnapshot.extfov_margin_vu
          • ObsSnapshot.extfov_u_max
          • ObsSnapshot.extfov_u_min
          • ObsSnapshot.extfov_v_max
          • ObsSnapshot.extfov_v_min
          • ObsSnapshot.extfov_vu_max
          • ObsSnapshot.extfov_vu_min
          • ObsSnapshot.extract_offset_array()
          • ObsSnapshot.fov_u_max
          • ObsSnapshot.fov_u_min
          • ObsSnapshot.fov_v_max
          • ObsSnapshot.fov_v_min
          • ObsSnapshot.fov_vu_max
          • ObsSnapshot.fov_vu_min
          • ObsSnapshot.inventory_body_in_extfov()
          • ObsSnapshot.inventory_body_in_fov()
          • ObsSnapshot.make_extfov_false()
          • ObsSnapshot.make_extfov_zeros()
          • ObsSnapshot.make_fov_zeros()
          • ObsSnapshot.ra_dec_limits()
          • ObsSnapshot.ra_dec_limits_ext()
          • ObsSnapshot.reset_all()
          • ObsSnapshot.sun_body_distance()
          • ObsSnapshot.unpad_array_to_extfov()
        • ObsSnapshotInst
        • ObsInst
          • ObsInst.from_file()
          • ObsInst.get_public_metadata()
          • ObsInst.inst_config
          • ObsInst.star_max_usable_vmag()
          • ObsInst.star_min_usable_vmag()
          • ObsInst.star_psf()
          • ObsInst.star_psf_size()
        • ObsCassiniISS
          • ObsCassiniISS.from_file()
          • ObsCassiniISS.get_public_metadata()
          • ObsCassiniISS.star_max_usable_vmag()
          • ObsCassiniISS.star_min_usable_vmag()
        • ObsVoyagerISS
          • ObsVoyagerISS.from_file()
          • ObsVoyagerISS.get_public_metadata()
          • ObsVoyagerISS.star_max_usable_vmag()
          • ObsVoyagerISS.star_min_usable_vmag()
        • ObsGalileoSSI
          • ObsGalileoSSI.from_file()
          • ObsGalileoSSI.get_public_metadata()
          • ObsGalileoSSI.star_max_usable_vmag()
          • ObsGalileoSSI.star_min_usable_vmag()
        • ObsNewHorizonsLORRI
          • ObsNewHorizonsLORRI.from_file()
          • ObsNewHorizonsLORRI.get_public_metadata()
          • ObsNewHorizonsLORRI.star_max_usable_vmag()
          • ObsNewHorizonsLORRI.star_min_usable_vmag()
        • ObsSim
          • ObsSim.from_file()
          • ObsSim.get_public_metadata()
          • ObsSim.star_max_usable_vmag()
          • ObsSim.star_min_usable_vmag()
      • nav.annotation
        • Annotation
          • Annotation.add_text_info()
          • Annotation.avoid_mask
          • Annotation.config
          • Annotation.obs
          • Annotation.overlay
          • Annotation.overlay_color
          • Annotation.text_info_list
        • Annotations
          • Annotations.add_annotations()
          • Annotations.annotations
          • Annotations.combine()
        • AnnotationTextInfo
          • AnnotationTextInfo.__repr__()
          • AnnotationTextInfo.__str__()
          • AnnotationTextInfo.color
          • AnnotationTextInfo.font
          • AnnotationTextInfo.font_size
          • AnnotationTextInfo.ref_vu
          • AnnotationTextInfo.text
          • AnnotationTextInfo.text_loc
        • TextLocInfo
          • TextLocInfo.label
          • TextLocInfo.label_u
          • TextLocInfo.label_v
      • nav.config
        • Config
          • Config.backplanes
          • Config.bodies
          • Config.body_shape
          • Config.bootstrap
          • Config.category()
          • Config.ensure_loaded()
          • Config.environment
          • Config.fuzzy_satellites()
          • Config.general
          • Config.is_loaded
          • Config.offset
          • Config.pds4
          • Config.planets
          • Config.read_config()
          • Config.ring_satellites()
          • Config.rings
          • Config.satellites()
          • Config.stars
          • Config.titan
          • Config.update_config()
        • image_log_handlers()
        • setup_logging()
      • nav.support
        • AttrDict
        • evaluate_candidate()
        • fisher_covariance()
        • fourier_shift()
        • gradient_magnitude()
        • int_to_signed()
        • masked_ncc()
        • navigate_single_scale_kpeaks()
        • navigate_with_pyramid_kpeaks()
        • nms_topk()
        • peak_to_runner_up_ratio()
        • per_metric()
        • pmr_metric()
        • psr_metric()
        • upsampled_dft()
        • apply_translation()
        • sample_dt_bilinear()
        • clean_obj()
        • dump_yaml()
        • json_as_string()
        • canonicalize()
        • NavFilterKind
          • NavFilterKind.ANISOTROPIC_GAUSSIAN
          • NavFilterKind.BANDPASS_DOG
          • NavFilterKind.DISTANCE_TRANSFORM
          • NavFilterKind.GRADIENT_OF_GAUSSIAN
          • NavFilterKind.ISOTROPIC_GAUSSIAN
          • NavFilterKind.MORPH_DILATE
          • NavFilterKind.NONE
        • NavFilterSpec
          • NavFilterSpec.align_axis
          • NavFilterSpec.bandpass_cutoffs_px
          • NavFilterSpec.covariance_px2
          • NavFilterSpec.dt_half_width_px
          • NavFilterSpec.kind
          • NavFilterSpec.null_filter_threshold_sigma
          • NavFilterSpec.sigma_xy
        • apply_filter()
        • clean_sclass()
        • apply_linear_gamma_stretch()
        • array_unzoom()
        • array_zoom()
        • crop_center()
        • draw_circle()
        • draw_line()
        • draw_line_arrow()
        • draw_rect()
        • filter_downsample()
        • filter_local_maximum()
        • filter_sub_median()
        • gaussian_blur_cov()
        • gradient_magnitude()
        • next_power_of_2()
        • normalize_array()
        • pad_array()
        • pad_array_to_power_of_2()
        • pad_top_left()
        • require_finite_int_or_float()
        • shift_array()
        • unpad_array()
        • cosmic_ray_mask()
        • saturation_mask()
        • current_git_version()
        • dec_rad_to_dms()
        • flatten_list()
        • get_local_host_name()
        • log_run_environment()
        • mad_std()
        • ra_rad_to_hms()
        • safe_lstrip_zero()
        • NavBase
          • NavBase.config
          • NavBase.logger
        • estimate_image_noise_sigma()
        • NavStatusReason
          • NavStatusReason.ALL_FEATURES_GATED
          • NavStatusReason.ALL_TECHNIQUES_SPURIOUS
          • NavStatusReason.CONFLICTED_TECHNIQUES
          • NavStatusReason.FINAL_CONFIDENCE_BELOW_THRESHOLD
          • NavStatusReason.FINAL_SIGMA_ABOVE_THRESHOLD
          • NavStatusReason.IMAGE_CORRUPT
          • NavStatusReason.IMAGE_OVEREXPOSED
          • NavStatusReason.INSTRUMENT_NOT_CONFIGURED
          • NavStatusReason.KERNELS_UNAVAILABLE
          • NavStatusReason.MISSING_DATA_DOMINANT
          • NavStatusReason.NO_FEASIBLE_TECHNIQUES
          • NavStatusReason.NO_FEATURES_EXTRACTED
          • NavStatusReason.NO_SIGNAL_IN_IMAGE
          • NavStatusReason.OK
          • NavStatusReason.RANK_1_ONLY
          • NavStatusReason.UNOBSERVABLE_OFFSET
        • dt_delta_str()
        • et_to_utc()
        • now_dt()
        • now_iso()
        • utc_to_et()
        • MutableStar
          • MutableStar.b_v
          • MutableStar.catalog_name
          • MutableStar.conflicts
          • MutableStar.dec
          • MutableStar.dec_pm
          • MutableStar.diff_u
          • MutableStar.diff_v
          • MutableStar.dn
          • MutableStar.johnson_mag_b
          • MutableStar.johnson_mag_faked
          • MutableStar.johnson_mag_v
          • MutableStar.move_u
          • MutableStar.move_v
          • MutableStar.name
          • MutableStar.pretty_name
          • MutableStar.psf_size
          • MutableStar.ra
          • MutableStar.ra_dec_with_pm()
          • MutableStar.ra_pm
          • MutableStar.spectral_class
          • MutableStar.temperature
          • MutableStar.temperature_faked
          • MutableStar.u
          • MutableStar.unique_number
          • MutableStar.v
          • MutableStar.vmag
      • nav.sim
        • apply_detector_noise()
        • apply_saturation()
        • apply_stray_light()
        • render_background_stars()
        • render_bodies()
        • render_combined_model()
        • render_stars()
        • create_simulated_body()
        • compute_border_atop_simulated()
        • compute_edge_radius_at_angle()
        • compute_edge_radius_mode1()
        • render_ring()
        • Mesh
          • Mesh.faces
          • Mesh.vertices
        • MeshBodySpec
          • MeshBodySpec.lumpiness
          • MeshBodySpec.n_lat
          • MeshBodySpec.n_lon
          • MeshBodySpec.pose_euler_deg
          • MeshBodySpec.seed
        • make_irregular_mesh()
        • mesh_spec_from_params()
        • render_mesh_body_image()
        • render_polyhedral_body()
        • SimSceneValidationError
        • iter_scene_paths()
        • load_sim_scene()
        • save_sim_scene()
        • scene_class_for_path()
        • resolve_extfov_margin()
        • resolve_sim_inst_config()
        • derive_effect_seed()
        • stable_param_seed()
        • render_scene_png()
        • save_png()
        • stretch_to_uint8()
      • nav.ui
        • ManualNavDialog
          • ManualNavDialog.run_modal()
        • LibraryEntryDraft
          • LibraryEntryDraft.camera
          • LibraryEntryDraft.exposure_time_sec
          • LibraryEntryDraft.filter_combo
          • LibraryEntryDraft.image_datetime_utc
          • LibraryEntryDraft.image_id
          • LibraryEntryDraft.mission
        • build_sidecar_yaml()
        • compute_image_url()
        • infer_obs_metadata()
        • nav.ui.mosaic_viewer
          • Normalized-unit conventions per kind
          • Coordinate system
          • ProjectionKind
            • ProjectionKind.MOLLWEIDE
            • ProjectionKind.POLAR_N
            • ProjectionKind.POLAR_S
            • ProjectionKind.RECT
            • ProjectionKind.SPHERE_3D
          • ProjectionParams
            • ProjectionParams.cx
            • ProjectionParams.cy
            • ProjectionParams.kind
            • ProjectionParams.pitch_deg
            • ProjectionParams.scale
            • ProjectionParams.yaw_deg
          • display_to_lonlat()
          • fit_scale()
          • lonlat_to_display()
          • sphere_pixel_to_lonlat()
          • render_to_image()
          • graticule_label_anchors()
          • graticule_polylines()
      • nav.navigate_image_files
        • build_metadata_from_result()
        • navigate_image_files()
        • write_summary_png()
    • Contributing
      • Contributing to RMS-NAV
        • Code of Conduct
        • Getting Started
        • Development Workflow
        • Coding Standards
        • Pull Request Process
        • Testing
        • Documentation
        • Reporting Issues
  • Simulator Performance and Sensitivity Report
    • Purpose and scope
    • Methodology
    • Running the sweeps
    • Example scenes
    • Algorithmic-invariant recovery
    • Single-variable sensitivity
      • Read-noise sweep
      • Phase-angle sweep
      • Body-size (range) sweep
    • Offset accuracy by technique
    • Star-field centroiding: dim vs bright
    • Per-technique accuracy across SNR and injected offset
    • Irregular-body navigation
      • Shape mismatch vs irregularity
      • Pose disagreement
    • Camera-roll sensitivity and roll / translation separability
    • Small-body navigation floor
    • I/F-calibrated vs raw-DN navigation
    • Summary
RMS-NAV
  • Developer Guide
  • API Reference
  • nav.feature
  • View page source

nav.feature

Feature layer for autonomous navigation.

Each scene element the orchestrator considers is decomposed into NavFeature instances emitted by registered NavModel instances. Features carry their own uncertainty, preferred filter, and reliability; techniques pick them up by feature type and produce per-technique offsets.

Modules:

feature_type

NavFeatureType enum (single canonical list of feature types).

geometry

NavFeatureGeometry sum type and per-type geometry payload dataclasses.

flags

NavFeatureFlags sum type and per-type flag dataclasses.

feature

NavFeature dataclass and NavReliabilityBreakdown.

reliability

FeatureReliabilityGate and per-type reliability thresholds.

constants

Module-level physical constants (cap angles, sentinel values).

Thread safety: every class in this package is stateless or is wrapped in a frozen dataclass. Concurrent access from multiple threads is safe so long as each thread holds its own ObsSnapshotInst (the underlying oops Backplane queries mutate global precision state).

NavFeature — the smallest independently-navigable scene element.

Every scene that the orchestrator considers is decomposed into NavFeatures by the registered feature extractors. Each feature carries everything a technique needs to know to use it or ignore it: identity, geometry, uncertainty, a preferred filter, a reliability score, and which technique types are allowed to consume it.

class NavFeature(feature_id: str, feature_type: NavFeatureType, source_model: str, geometry: StarGeometry | LimbPolyline | TerminatorPolyline | RingEdgePolyline | BodyDiscGeometry | BodyBlobGeometry | RingAnnulusGeometry | CartographicModelGeometry, subject_range_km: float, position_cov_px: ndarray[tuple[Any, ...], dtype[floating[Any]]] | None, intensity_sigma_rel: float, preferred_filter: NavFilterSpec, reliability: float, reliability_reasons: NavReliabilityBreakdown, usable_types: frozenset[NavFeatureType], flags: StarFlags | LimbArcFlags | TerminatorArcFlags | RingEdgeFlags | BodyDiscFlags | BodyBlobFlags | RingAnnulusFlags | CartographicModelFlags, template_img: ndarray[tuple[Any, ...], dtype[floating[Any]]] | None = None, template_mask: ndarray[tuple[Any, ...], dtype[bool]] | None = None)[source]

Bases: object

A single navigable scene element with everything techniques need.

NavFeatures are produced per-image by stateless extractors; no cross-image state is involved. They carry their own uncertainty in image-plane pixel units, a preferred filter for the matching metric, and a self-assessed reliability score that the orchestrator’s gate consults before invoking techniques.

Parameters:
  • feature_id – Unique identifier within a single NavResult. Format is <type_lc>:<scope>; e.g. star:UCAC4:144787700, limb_arc:MIMAS, ring_edge:SATURN:A_outer. Two features with the same ID is an extractor bug.

  • feature_type – One of the NavFeatureType values.

  • source_model – Name of the NavModel that produced this feature ('stars', 'body', 'rings', etc.).

  • geometry – One of the NavFeatureGeometry variants matching the feature type.

  • subject_range_km – Distance from observer to the feature subject in kilometers. Used to depth-sort body features when building combined templates.

  • template_img – Optional pre-rendered model template (small postage stamp). Set for BODY_DISC, RING_ANNULUS, and CARTOGRAPHIC_MODEL; None for feature types whose geometry alone is sufficient.

  • template_mask – Optional boolean mask matching template_img; True where the template carries signal.

  • position_cov_px – 2x2 image-plane covariance in pixels for scalar features (STAR, BODY_BLOB). None for polyline-payload and template-payload features whose covariance is per-vertex or derived from the matching peak.

  • intensity_sigma_rel – Relative brightness uncertainty (scalar in [0, 1]); 0 is “perfect brightness prediction”.

  • preferred_filter – NavFilterSpec the feature requests for both the template and the surrounding image patch.

  • reliability – Self-assessed reliability score in [0, 1].

  • reliability_reasons – Per-component breakdown of the reliability score; lets the curator surface why a feature was scored confidently or rejected.

  • usable_types – Frozen set of feature types this feature is allowed to be consumed as. Always contains its own feature_type and may include compatible cohabitants (a body’s LIMB_ARC and BODY_DISC are separate features with the same body_name; they differ only in payload shape).

  • flags – Typed feature-type-specific flags dataclass.

__post_init__() → None[source]

Validate invariants and freeze numpy arrays.

Raises ValueError on out-of-range reliability, empty feature_id, or covariance matrices that are not 2x2 symmetric positive-semidefinite.

property body_name: str

SPICE body name this feature traces, or '' for non-body features.

Reads the structured body_name carried on the body-feature flag dataclasses (LimbArcFlags, TerminatorArcFlags, BodyDiscFlags, BodyBlobFlags, CartographicModelFlags). Star and ring flags have no body, so the value is ''. Consumers should prefer this over parsing the feature_id string.

feature_id: str
feature_type: NavFeatureType
flags: StarFlags | LimbArcFlags | TerminatorArcFlags | RingEdgeFlags | BodyDiscFlags | BodyBlobFlags | RingAnnulusFlags | CartographicModelFlags
geometry: StarGeometry | LimbPolyline | TerminatorPolyline | RingEdgePolyline | BodyDiscGeometry | BodyBlobGeometry | RingAnnulusGeometry | CartographicModelGeometry
intensity_sigma_rel: float
position_cov_px: ndarray[tuple[Any, ...], dtype[floating[Any]]] | None
preferred_filter: NavFilterSpec
reliability: float
reliability_reasons: NavReliabilityBreakdown
source_model: str
subject_range_km: float
template_img: ndarray[tuple[Any, ...], dtype[floating[Any]]] | None = None
template_mask: ndarray[tuple[Any, ...], dtype[bool]] | None = None
usable_types: frozenset[NavFeatureType]
class NavReliabilityBreakdown(predicted_snr: float | None = None, visible_arc_fraction: float | None = None, incidence_factor: float | None = None, albedo_penalty: float | None = None, shadow_occluded_fraction: float | None = None, visible_lit_fraction: float | None = None, overflow_fraction: float | None = None, blob_snr: float | None = None, blob_extent_px: float | None = None, in_body_silhouette: bool | None = None, in_saturation_or_cosmic: bool | None = None, smear_length_ok: bool | None = None)[source]

Bases: object

Per-component reliability contributions for a NavFeature.

All fields are optional [0, 1] floats (or booleans where noted). A missing field means “not applicable for this feature type”, not zero.

Parameters:
  • predicted_snr – STAR — detection contribution derived from the star’s magnitude margin to the limiting magnitude (effective SNR), not a DN-based photometric SNR.

  • visible_arc_fraction – LIMB_ARC, TERMINATOR_ARC, RING_EDGE — fraction of total predicted arc length in extfov and not occluded.

  • incidence_factor – LIMB_ARC — limb-incidence-angle softening factor.

  • albedo_penalty – TERMINATOR_ARC — albedo-variation penalty term.

  • shadow_occluded_fraction – RING_EDGE — fraction of polyline vertices dropped to planet shadow.

  • visible_lit_fraction – BODY_DISC — fraction of the whole predicted disc (lit + dark) that is both lit (cos(incidence) >= 0) and inside the sensor. Despite the name the denominator is the entire disc, not the lit hemisphere, so this falls with phase even for a fully-framed body — intentional, so the BODY_DISC gate screens out thin high-phase crescents (a poor disc template) as well as partially-framed discs.

  • overflow_fraction – BODY_DISC — fraction of the predicted disc area outside the sensor.

  • blob_snr – BODY_BLOB — image SNR within the predicted body bbox.

  • blob_extent_px – BODY_BLOB — predicted body extent (longer axis) in pixels.

  • in_body_silhouette – STAR — True if the predicted star is inside a predicted body silhouette.

  • in_saturation_or_cosmic – STAR — True if the predicted star pixel falls inside a saturation/cosmic-ray mask pixel.

  • smear_length_ok – STAR — True if smear length is below the stars.max_smear reject gate.

albedo_penalty: float | None = None
blob_extent_px: float | None = None
blob_snr: float | None = None
in_body_silhouette: bool | None = None
in_saturation_or_cosmic: bool | None = None
incidence_factor: float | None = None
overflow_fraction: float | None = None
predicted_snr: float | None = None
shadow_occluded_fraction: float | None = None
smear_length_ok: bool | None = None
visible_arc_fraction: float | None = None
visible_lit_fraction: float | None = None
body_names_from_features(features: Iterable[NavFeature]) → frozenset[str][source]

Return the set of non-empty body names across features.

Uses each feature’s structured NavFeature.body_name rather than parsing feature_id strings, so the source-body identity a technique reports cannot silently diverge from a change to the feature-id format.

Enum of feature types produced by NavFeatureExtractors.

A NavFeature carries one of these tags identifying which kind of independently-navigable scene element it represents.

Modules:

The single canonical list of NavFeatureType values. New types are added by adding an enum value here and providing an extractor that emits it.

class NavFeatureType(*values)[source]

Bases: Enum

The kind of scene element a NavFeature represents.

Each value names a category of independently-navigable scene element with its own geometry, uncertainty model, and consuming techniques.

  • STAR: a single catalog star (one (v, u) point).

  • LIMB_ARC: one body’s lit limb expressed as a polyline of vertices.

  • TERMINATOR_ARC: one body’s terminator polyline.

  • BODY_DISC: a body disc rendered as a pixel template for correlation.

  • BODY_BLOB: a body that is too irregular or under-resolved to fit a limb arc; carries only a predicted centroid and bounding box.

  • RING_EDGE: a single named ring edge expressed as a polyline.

  • RING_ANNULUS: a multi-ring composite rendered as a pixel template, used when individual edges cannot be separated at the image resolution.

  • TITAN_LIMB: reserved for atmospheric-body navigation; never emitted by the current extractor set (the algorithm is unimplemented).

  • CARTOGRAPHIC_MODEL: a pre-built cartographic mosaic of a body reprojected into the predicted body silhouette for high-detail correlation.

BODY_BLOB = 'BODY_BLOB'
BODY_DISC = 'BODY_DISC'
CARTOGRAPHIC_MODEL = 'CARTOGRAPHIC_MODEL'
LIMB_ARC = 'LIMB_ARC'
RING_ANNULUS = 'RING_ANNULUS'
RING_EDGE = 'RING_EDGE'
STAR = 'STAR'
TERMINATOR_ARC = 'TERMINATOR_ARC'
TITAN_LIMB = 'TITAN_LIMB'

Sum-type variants describing the geometry of a NavFeature.

Each NavFeature carries a geometry payload whose concrete dataclass type matches the feature_type. The payload holds whatever the consuming technique needs to know about where in the image the feature lives — image-side operations remain global, so no payload describes a per-feature image crop.

Coordinates are in extended-FOV (extfov) image coordinates (v, u). Bounding boxes are half-open in the numpy slicing sense: v_min, u_min, v_max, u_max with arr[v_min:v_max, u_min:u_max] covering the box.

class BodyBlobGeometry(predicted_center_vu: tuple[float, float], bbox_extfov_vu: tuple[int, int, int, int], predicted_diameter_px: float)[source]

Bases: object

Geometry payload for a BODY_BLOB feature.

Carries only the predicted centroid and bounding extent of an under- resolved or irregular body. No template is rendered.

Parameters:
  • predicted_center_vu – Predicted body center in extfov coordinates.

  • bbox_extfov_vu – Half-open bounding box around the predicted body.

  • predicted_diameter_px – Predicted disc diameter in pixels (longer axis of the predicted ellipse silhouette).

bbox_extfov_vu: tuple[int, int, int, int]
predicted_center_vu: tuple[float, float]
predicted_diameter_px: float
class BodyDiscGeometry(bbox_extfov_vu: tuple[int, int, int, int], predicted_center_vu: tuple[float, float], overflow_fraction: float)[source]

Bases: object

Geometry payload for a BODY_DISC feature.

The body’s full-disc rendering is carried on NavFeature.template_img; the geometry payload only records the position of that template within the extfov image, the predicted body-center pixel, and the fraction of the predicted disc area that falls outside the sensor.

Parameters:
  • bbox_extfov_vu – Half-open bounding box where the template sits.

  • predicted_center_vu – Predicted body center in extfov coordinates.

  • overflow_fraction – Fraction of the disc area outside the sensor [0, 1]; 0 means fully in-FOV.

bbox_extfov_vu: tuple[int, int, int, int]
overflow_fraction: float
predicted_center_vu: tuple[float, float]
class CartographicModelGeometry(bbox_extfov_vu: tuple[int, int, int, int], predicted_center_vu: tuple[float, float], overflow_fraction: float)[source]

Bases: object

Geometry payload for a CARTOGRAPHIC_MODEL feature.

A pre-built cartographic mosaic of a body, reprojected into the predicted body silhouette and stored on NavFeature.template_img. Same shape as BodyDiscGeometry — the difference is that the template carries surface detail rather than smooth Lambert shading.

Parameters:
  • bbox_extfov_vu – Half-open bounding box where the template sits.

  • predicted_center_vu – Predicted body center in extfov coordinates.

  • overflow_fraction – Fraction of the disc area outside the sensor.

bbox_extfov_vu: tuple[int, int, int, int]
overflow_fraction: float
predicted_center_vu: tuple[float, float]
class LimbPolyline(vertices_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]], normals_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]], sigma_normal_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]], sigma_tangent_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]], bbox_extfov_vu: tuple[int, int, int, int])[source]

Bases: object

Geometry payload for a LIMB_ARC feature.

A polyline of vertices along a body’s predicted limb, after extraction-time cropping for occlusion / off-FOV / shadow. Each vertex carries its own normal direction and per-vertex anisotropic uncertainty.

Parameters:
  • vertices_vu – (N, 2) array of (v, u) per surviving vertex.

  • normals_vu – (N, 2) array of outward limb normal per vertex.

  • sigma_normal_per_vertex_px – (N,) per-vertex sigma along normal.

  • sigma_tangent_per_vertex_px – (N,) per-vertex sigma along tangent; typically a small constant (~0.5 px) reflecting polyline sampling resolution.

  • bbox_extfov_vu – Half-open bounding box of the polyline.

bbox_extfov_vu: tuple[int, int, int, int]
normals_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]]
sigma_normal_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]]
sigma_tangent_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]]
vertices_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]]
NavFeatureGeometry = nav.feature.geometry.StarGeometry | nav.feature.geometry.LimbPolyline | nav.feature.geometry.TerminatorPolyline | nav.feature.geometry.RingEdgePolyline | nav.feature.geometry.BodyDiscGeometry | nav.feature.geometry.BodyBlobGeometry | nav.feature.geometry.RingAnnulusGeometry | nav.feature.geometry.CartographicModelGeometry

Sum type spanning every NavFeatureType’s geometry payload.

class RingAnnulusGeometry(bbox_extfov_vu: tuple[int, int, int, int], predicted_center_vu: tuple[float, float])[source]

Bases: object

Geometry payload for a RING_ANNULUS feature.

Multi-ring composite template carried on NavFeature.template_img; this payload records only the template’s location in the extfov image and the predicted ring-system center.

Parameters:
  • bbox_extfov_vu – Half-open bounding box where the template sits.

  • predicted_center_vu – Predicted planet center for the ring system.

bbox_extfov_vu: tuple[int, int, int, int]
predicted_center_vu: tuple[float, float]
class RingEdgePolyline(vertices_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]], normals_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]], sigma_radial_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]], sigma_along_edge_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]], is_straight_line: bool, bbox_extfov_vu: tuple[int, int, int, int])[source]

Bases: object

Geometry payload for a RING_EDGE feature.

Polyline of vertices along one named ring edge. Each vertex’s per-axis uncertainty is along the radial direction (across the edge) and along the edge tangent. The straight-line flag is set when the projected polyline’s deviation from a best-fit straight line is below threshold; in that case its rank-1 covariance must be combined with another feature to resolve a 2-D offset.

Parameters:
  • vertices_vu – (N, 2) (v, u) per vertex.

  • normals_vu – (N, 2) radially outward per vertex.

  • sigma_radial_per_vertex_px – (N,) sigma across the edge (radial).

  • sigma_along_edge_per_vertex_px – (N,) sigma along the edge.

  • is_straight_line – True if the polyline’s max-deviation from a best-fit straight line is below the curvature threshold.

  • bbox_extfov_vu – Half-open bounding box of the polyline.

bbox_extfov_vu: tuple[int, int, int, int]
is_straight_line: bool
normals_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]]
sigma_along_edge_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]]
sigma_radial_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]]
vertices_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]]
class StarGeometry(predicted_vu: tuple[float, float], catalog_vu: tuple[float, float], bbox_extfov_vu: tuple[int, int, int, int])[source]

Bases: object

Geometry payload for a STAR feature.

Single (v, u) point in extended-FOV coordinates plus the catalog-derived prediction from which it was generated. The two are equal at extraction time and may differ after a refinement step records the matched detection.

Parameters:
  • predicted_vu – Predicted star (v, u) in extfov coordinates.

  • catalog_vu – Catalog-aberrated star (v, u) in extfov coordinates. Equal to predicted_vu at extraction; may differ after refinement.

  • bbox_extfov_vu – Half-open bounding box (v_min, u_min, v_max, u_max) covering the postage stamp around the predicted position.

bbox_extfov_vu: tuple[int, int, int, int]
catalog_vu: tuple[float, float]
predicted_vu: tuple[float, float]
class TerminatorPolyline(vertices_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]], normals_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]], sigma_normal_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]], sigma_tangent_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]], bbox_extfov_vu: tuple[int, int, int, int])[source]

Bases: object

Geometry payload for a TERMINATOR_ARC feature.

Mirrors LimbPolyline with terminator-specific semantics — the vertices lie along the terminator (where cos(incidence) == 0) rather than the silhouette. Per-vertex sigma_normal is generally larger than the matching limb because albedo variation softens the photometric edge.

Parameters: see LimbPolyline (identical field set).

bbox_extfov_vu: tuple[int, int, int, int]
normals_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]]
sigma_normal_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]]
sigma_tangent_per_vertex_px: ndarray[tuple[Any, ...], dtype[floating[Any]]]
vertices_vu: ndarray[tuple[Any, ...], dtype[floating[Any]]]

Sum-type flag dataclasses carried on NavFeature.flags.

Each feature type has a small dataclass listing the technique-specific boolean / scalar flags relevant to that type. Carrying them as a typed sum type instead of a free-form dict[str, Any] lets static type checkers see which fields exist for each type and lets curator code copy known fields by attribute.

class BodyBlobFlags(body_name: str = '', predicted_diameter_px: float = 0.0, phase_angle_deg: float = 0.0, phase_irregularity_factor: float = 0.0, sub_solar_dir_vu: tuple[float, float] = (0.0, 0.0))[source]

Bases: object

Flags carried on a BODY_BLOB feature.

Parameters:
  • body_name – SPICE body name whose blob this feature represents.

  • predicted_diameter_px – Predicted disc diameter in pixels (longer axis of the predicted ellipse silhouette). Must be >= 0.

  • phase_angle_deg – Phase angle (Sun -> body -> observer) at the body’s center, in degrees. Recorded for diagnostic inspection; the BLOB confidence formula consumes phase_irregularity_factor instead, since raw phase alone understates the centroid uncertainty for an irregular body. Must be in [0, 180].

  • phase_irregularity_factor – Dimensionless coupling of phase angle and shape irregularity, computed by the body NavModel as (ellipsoid_rms_residual_km / body_radius_km) * (1 + 2 * sin^2(phase / 2)). Captures the centroid-bias risk that the lit-weighted predicted centroid cannot fully correct for. The fractional residual / radius term is ~ 0.005 for regular moons and ~ 0.05-0.10 for irregular satellites; the phase factor goes from 1 at full-phase (rotational orientation always unknown) to 3 at full crescent (most of the body unlit, hiding most of the irregularity). Must be >= 0.

  • sub_solar_dir_vu – Unit (v, u) image-plane direction from the body’s geometric center toward the bright limb (the projection of the body-to-Sun vector). (0.0, 0.0) when the direction is unknown or undefined (a near-full-phase body whose lit centroid coincides with its geometric center). BodyBlobNav orients its phase-aware coarse-acquisition template along this direction so a high-phase crescent displaced beyond its predicted bounding box is still found; a filled-disc template cannot match a thin crescent. Both components must lie in [-1, 1].

__post_init__() → None[source]

Validate per-field constraints.

body_name: str = ''
phase_angle_deg: float = 0.0
phase_irregularity_factor: float = 0.0
predicted_diameter_px: float = 0.0
sub_solar_dir_vu: tuple[float, float] = (0.0, 0.0)
class BodyDiscFlags(body_name: str = '', overflow_fov_fraction: float = 0.0)[source]

Bases: object

Flags carried on a BODY_DISC feature.

Parameters:
  • body_name – SPICE body name whose disc this feature renders.

  • overflow_fov_fraction – Fraction of the disc area outside the sensor [0, 1]. Same value as BodyDiscGeometry.overflow_fraction; duplicated here for type-specific access.

__post_init__() → None[source]

Validate overflow_fov_fraction is in [0, 1].

body_name: str = ''
overflow_fov_fraction: float = 0.0
class CartographicModelFlags(body_name: str = '', mosaic_source: str = '')[source]

Bases: object

Flags carried on a CARTOGRAPHIC_MODEL feature.

Parameters:
  • body_name – SPICE body name the cartographic mosaic represents.

  • mosaic_source – Identifier of the mosaic file (e.g. file basename or URL).

body_name: str = ''
mosaic_source: str = ''
class LimbArcFlags(body_name: str = '', visible_arc_fraction: float = 0.0)[source]

Bases: object

Flags carried on a LIMB_ARC feature.

Parameters:
  • body_name – SPICE body name whose limb this arc traces.

  • visible_arc_fraction – Fraction of total limb length inside extfov and not occluded [0, 1].

__post_init__() → None[source]

Validate visible_arc_fraction is in [0, 1].

body_name: str = ''
visible_arc_fraction: float = 0.0
NavFeatureFlags = nav.feature.flags.StarFlags | nav.feature.flags.LimbArcFlags | nav.feature.flags.TerminatorArcFlags | nav.feature.flags.RingEdgeFlags | nav.feature.flags.BodyDiscFlags | nav.feature.flags.BodyBlobFlags | nav.feature.flags.RingAnnulusFlags | nav.feature.flags.CartographicModelFlags

Sum type spanning every NavFeatureType’s flag dataclass.

class RingAnnulusFlags(planet_name: str = '', constituent_edge_count: int = 0)[source]

Bases: object

Flags carried on a RING_ANNULUS feature.

Parameters:
  • planet_name – Planet whose ring system this annulus represents.

  • constituent_edge_count – Number of catalog edges fused into this annulus template. Must be a non-negative integer.

__post_init__() → None[source]

Validate constituent_edge_count is a non-negative integer.

constituent_edge_count: int = 0
planet_name: str = ''
class RingEdgeFlags(is_straight_line: bool = False, polarity_predictable: bool = False, edge_name: str = '', planet_name: str = '')[source]

Bases: object

Flags carried on a RING_EDGE feature.

Parameters:
  • is_straight_line – True when the polyline’s deviation from a straight-line fit is below threshold. Triggers rank-1 covariance handling at the technique level.

  • polarity_predictable – True only when the per-edge static-catalog entry guarantees the gradient direction across the edge in this scene. Default is False.

  • edge_name – Name of the ring edge in the static catalog.

  • planet_name – Planet whose rings this edge belongs to.

edge_name: str = ''
is_straight_line: bool = False
planet_name: str = ''
polarity_predictable: bool = False
class StarFlags(saturated: bool = False, smear_length_px: float = 0.0, in_body_silhouette: bool = False, in_saturation_or_cosmic_mask: bool = False, predicted_snr: float = 0.0, vmag: float | None = None)[source]

Bases: object

Flags carried on a STAR feature.

Parameters:
  • saturated – True if the detected star peak hit the camera’s full-well DN; centroiding switches from peak-Gaussian-fit to annular brightness-weighted moment.

  • smear_length_px – Expected smear length in pixels at this image’s spacecraft attitude rate. Must be >= 0.

  • in_body_silhouette – True if the predicted star position falls inside a predicted body silhouette in extfov.

  • in_saturation_or_cosmic_mask – True if the predicted star position falls inside a saturation or cosmic-ray mask pixel.

  • predicted_snr – Magnitude-margin-derived effective SNR for the catalog star (SNR_REF * 2.512 ** (mag_limit - vmag)), not a DN-based photometric SNR. Monotone in catalog brightness, so StarUniqueMatchNav can still rank stars by it when picking the unique-bright pair. 0.0 for fixtures or features whose model did not populate it. Must be >= 0.

  • vmag – Catalog V-band magnitude of the star, or None when the catalog entry has no magnitude. Used by StarUniqueMatchNav to compute the magnitude margin to the next-brightest star.

__post_init__() → None[source]

Validate smear_length_px and predicted_snr are non-negative.

in_body_silhouette: bool = False
in_saturation_or_cosmic_mask: bool = False
predicted_snr: float = 0.0
saturated: bool = False
smear_length_px: float = 0.0
vmag: float | None = None
class TerminatorArcFlags(body_name: str = '', visible_arc_fraction: float = 0.0, phase_angle_factor: float = 0.0)[source]

Bases: object

Flags carried on a TERMINATOR_ARC feature.

Parameters:
  • body_name – SPICE body name whose terminator this arc traces.

  • visible_arc_fraction – Fraction of total terminator length inside extfov and lit [0, 1].

  • phase_angle_factor – sin(phase_angle) factor used in reliability; peaks at 90-degree crescent. Must lie in [0, 1].

__post_init__() → None[source]

Validate fractions and the phase-angle factor.

body_name: str = ''
phase_angle_factor: float = 0.0
visible_arc_fraction: float = 0.0

Compose template-bearing features into a single ext-FOV image and mask.

Some downstream consumers (the manual-navigation dialog, the summary-PNG overlay) want a single 2-D representation of “what the predicted scene looks like” rather than a per-feature collection. This module builds that composite by Z-buffer painting every feature that carries a template_img / template_mask payload, ordered by subject range so nearer features paint over farther ones.

compose_template_features() is the bitmap-only composer (limbs, terminators, ring edges are skipped; their geometry belongs to the annotation pipeline). compose_dialog_overlay() extends it by rasterizing every polyline-bearing feature on top — that is the composite the manual-navigation dialog overlays on the source image so an operator sees limbs / terminators / ring edges even when the body emits no full-disc template.

compose_dialog_overlay(features: list[NavFeature], extfov_shape_vu: tuple[int, int]) → tuple[ndarray[tuple[Any, ...], dtype[floating[Any]]], ndarray[tuple[Any, ...], dtype[bool]]][source]

Compose the manual-navigation dialog’s full-scene overlay.

Starts from compose_template_features() (BODY_DISC, RING_ANNULUS, CARTOGRAPHIC_MODEL templates) and additionally rasterizes:

  • every polyline-bearing feature’s vertices_vu as single-pixel marks (LIMB_ARC, TERMINATOR_ARC, RING_EDGE);

  • every BODY_BLOB’s predicted-diameter circle outline at the predicted centroid;

  • every STAR feature’s bbox as a rectangle outline at the predicted-vu position so the operator can manually align catalog stars with the observed bright pixels.

All rasterization is intentionally minimal — it is a visibility aid, not a precise renderer; the autonomous DT / RANSAC pipeline owns the quantitative fit.

Vertices and markers that fall outside the ext-FOV bounds are silently dropped (the polyline samplers can hand back partially-clipped polylines near the FOV edge; star markers near the FOV edge are clipped to the visible portion).

Parameters:
  • features – The feature list (templated + polyline + plain).

  • extfov_shape_vu – Shape (v, u) of the ext-FOV array to build.

Returns:

Tuple (image, mask) where image is float64 in ext-FOV coordinates and mask is a boolean array of the same shape. Every painted pixel (template or polyline or marker) is True in the mask.

compose_template_features(features: list[NavFeature], extfov_shape_vu: tuple[int, int]) → tuple[ndarray[tuple[Any, ...], dtype[floating[Any]]], ndarray[tuple[Any, ...], dtype[bool]]][source]

Z-buffer paint template features into a single ext-FOV image+mask.

Features are sorted by subject_range_km ascending (nearer features last), so the closest body’s pixels overwrite farther bodies’ on overlap. Each feature’s template is placed at its geometry.bbox_extfov_vu location; pixels marked True in the feature’s template_mask carry the template’s value into the composite, and the composite mask becomes the OR of every painted feature’s mask.

Features without a template_img or template_mask are skipped.

Parameters:
  • features – The feature list (may include non-template features).

  • extfov_shape_vu – Shape (v, u) of the ext-FOV array to build.

Returns:

Tuple (image, mask) where image is float64 in ext-FOV coordinates and mask is a boolean array of the same shape.

Reliability gate — drops features whose self-assessed reliability is too low.

Each feature carries a [0, 1] reliability score it computed at extraction time. The orchestrator runs this gate between extraction and technique invocation; gated-out features are recorded in the feature inventory with their rejection reason but are not passed to any technique.

The thresholds live in config_520_features.yaml per feature type with optional per-instrument overrides. Default values defined here are used when no override is supplied by the loader.

DEFAULT_RELIABILITY_THRESHOLDS: Final[dict[NavFeatureType, float]] = {NavFeatureType.BODY_BLOB: 0.2, NavFeatureType.BODY_DISC: 0.3, NavFeatureType.CARTOGRAPHIC_MODEL: 0.3, NavFeatureType.LIMB_ARC: 0.3, NavFeatureType.RING_ANNULUS: 0.3, NavFeatureType.RING_EDGE: 0.3, NavFeatureType.STAR: 0.2, NavFeatureType.TERMINATOR_ARC: 0.3, NavFeatureType.TITAN_LIMB: 0.3}

Default per-type reliability thresholds.

Feature types not present in this map fall through with a 0.0 threshold (no gate). Values are placeholders subject to empirical calibration.

class FeatureReliabilityGate(thresholds: dict[~nav.feature.feature_type.NavFeatureType, float]=<factory>)[source]

Bases: object

Stateless gate filtering features by per-type reliability threshold.

Parameters:

thresholds – Mapping feature_type -> minimum reliability. Falls back to 0.0 (no gate) for missing keys.

Raises:
  • TypeError – if any key in thresholds is not a NavFeatureType or any value is not numeric.

  • ValueError – if any threshold is non-finite or outside [0, 1].

__post_init__() → None[source]

Validate the thresholds mapping and every threshold value.

apply(features: list[NavFeature]) → tuple[list[NavFeature], list[GatedFeatureRecord]][source]

Split features into kept and gated lists.

Parameters:

features – All features emitted by extractors.

Returns:

Tuple (kept, gated) where gated carries rejection reasons.

thresholds: dict[NavFeatureType, float]
class GatedFeatureRecord(feature: NavFeature, reason: str)[source]

Bases: object

Diagnostic record for a feature dropped by the gate.

Parameters:
  • feature – The feature that was dropped.

  • reason – Stable string describing why; used by the curator and tests.

feature: NavFeature
reason: str

Module-level constants used across feature extraction and reliability scoring.

These constants encode physically-motivated thresholds and caps referenced across feature-extraction and confidence-scoring formulas. Keeping them in one file makes the formulas self-documenting at the point of use and gives a single edit-site when calibration changes their values.

Each constant carries a one-line docstring with units and intent. Constants that have a YAML-config equivalent (per-instrument tunables) belong in the config files; only physically-motivated values live here.

AGREEMENT_FACTOR_CAP: float = 1.5

Maximum boost (multiplicative) the ensemble agreement factor may apply.

Bounds the 1 + 0.5 * max(0, log2(n_significant)) formula; even when many techniques agree, the boost never exceeds this multiplier.

COMBINED_CONFIDENCE_CAP: float = 0.99

Maximum value the precision-weighted combined confidence may take.

Two correlated estimators agreeing strongly is treated as honest 0.99, never 1.0 — confidence is a calibrated proxy, not a probability.

INCIDENCE_FACTOR_ANGLE_CAP_DEG: float = 80.0

Incidence angle (degrees) at which the softening factor saturates.

Beyond this angle, incidence_factor is clamped to MAX_INCIDENCE_FACTOR_CAP rather than continuing to grow.

INCIDENCE_FACTOR_CLIP_DEG: float = 85.0

Maximum incidence angle (degrees) used in cosine projection.

Used inside cos(min(i, INCIDENCE_FACTOR_CLIP_DEG)) to keep the cosine positive and bounded. Slightly larger than the saturation angle so the clamp behavior is smooth across the boundary.

JSON_INF_SENTINEL: float = 1000000000.0

Finite sentinel substituted for inf in JSON output.

In-memory NavResult keeps real inf for unbounded uncertainty axes (e.g. flat-ring-only scenes); the JSON curator clamps to this finite value for cross-language compatibility (strict JSON disallows Infinity). Downstream consumers should treat any value >= 1e8 as “axis unconstrained”.

MAX_INCIDENCE_FACTOR_CAP: float = 4.76

Cap on incidence-angle softening factor (dimensionless).

Equal to 1 / cos(80 deg) - 1. Beyond an incidence angle of 80 degrees, the cosine projection becomes so steep that the limb pixel contributes essentially zero useful information about limb position; treating any pixel beyond 80 deg as having the same softness factor is the principled cap.

MIN_ANISOTROPIC_SMEAR_PX: float = 0.5

Smear length below which star centroid covariance becomes isotropic.

When L < MIN_ANISOTROPIC_SMEAR_PX, the smear axis is shorter than the PSF and anisotropy is sub-pixel-meaningless; the extractor uses (sigma_PSF / sqrt(SNR))^2 * I_2 instead of the anisotropic formula.

Previous Next

© Copyright 2025, SETI Institute.

Built with Sphinx using a theme provided by Read the Docs.