astrox-python 1.2.0__tar.gz → 1.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {astrox_python-1.2.0 → astrox_python-1.2.2}/PKG-INFO +1 -1
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/celestial.py +5 -5
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/compute_lambert_transfer.md +4 -3
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_lambert_transfer.md +4 -3
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/celestial/README.md +13 -12
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/coverage/README.md +2 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/celestial/README.md +13 -12
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/coverage/README.md +2 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/celestial.md +9 -8
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/coverage.md +5 -4
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/11_celestial/celestial_queries.py +2 -2
- {astrox_python-1.2.0 → astrox_python-1.2.2}/pyproject.toml +2 -2
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/celestial/test_celestial.py +27 -15
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/README.md +1 -1
- astrox_python-1.2.2/tests/validation/_support/orekit.py +100 -0
- astrox_python-1.2.2/tests/validation/_support/test_orekit.py +71 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py +103 -1
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_mpc_target_elements.py +62 -24
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/_fom_helpers.py +8 -2
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +36 -4
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +12 -12
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/celestial/celestial.snap.json +69 -5
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/celestial/test_celestial.py +29 -8
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/coverage/coverage.snap.json +292 -34
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/coverage/test_coverage.py +15 -53
- {astrox_python-1.2.0 → astrox_python-1.2.2}/uv.lock +118 -118
- astrox_python-1.2.0/tests/validation/_support/orekit.py +0 -68
- {astrox_python-1.2.0 → astrox_python-1.2.2}/.gitignore +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/LICENSE +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/_http.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/access.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/astrogator/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/astrogator/_api.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/astrogator/_models.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/astrogator/_results.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/cat.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/catalog.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_axes.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_common.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_constraints.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_objects.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_positions.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_rotations.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_sensors.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/components/_vgt.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/conjunction.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/_core.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/_fom.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/coverage_time.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/number_of_assets.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/response_time.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/revisit_time.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/coverage/simple_coverage.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/exceptions.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/libration.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/lighting.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/orbits.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/propagator.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/rocket.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/astrox/terrain.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/CONTRIBUTING.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/automated-workflows.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/docs-principles.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/getting_started.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/build_an_hpop_configuration.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/compute_access_intervals.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/compute_lighting_conditions.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/convert_between_orbit_representations.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/generate_a_crtbp_periodic_orbit.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/propagate_an_orbit.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/run_an_astrogator_mcs.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/how_to/screen_close_approaches.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/getting_started.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/build_an_hpop_configuration.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_access_intervals.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/compute_lighting_conditions.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/convert_between_orbit_representations.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/generate_a_crtbp_periodic_orbit.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/propagate_an_orbit.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/run_an_astrogator_mcs.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/how_to/screen_close_approaches.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/access/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/astrogator/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/cat/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/catalog/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/components/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/conjunction/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/libration/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/lighting/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/orbits/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/propagator/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/rocket/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/i18n/en/manual/terrain/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/access/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/astrogator/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/cat/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/catalog/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/components/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/conjunction/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/libration/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/lighting/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/orbits/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/propagator/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/rocket/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/manual/terrain/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/sdk-principles.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/test-principles.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/access.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/astrogator.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/cat.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/catalog.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/conjunction.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/libration.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/lighting.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/orbits.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/propagator.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/rocket.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/docs/validation/terrain.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/ballistic_apogee_alt.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/ballistic_delta_v.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/ballistic_min_ecc.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/ballistic_time_of_flight.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/batch_propagators.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/hpop.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/j2_classical.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/propagator_reference.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/sgp4_tle.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/simple_ascent.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/two_body_classical.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/01_propagation/two_body_rv.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/02_orbits/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/02_orbits/conversions.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/02_orbits/lambert_delta_v.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/02_orbits/orbit_system.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/02_orbits/wizards.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/03_lighting/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/03_lighting/lighting.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/04_access/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/04_access/chain.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/04_access/compute.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/04_access/constraints.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/04_access/custom_axes.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/04_access/sensor_pointing.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/05_rocket/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/05_rocket/landing_zone.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/06_coverage/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/06_coverage/compute.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/06_coverage/fom.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/06_coverage/grid_points.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/06_coverage/reports.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/07_astrogator/run_mcs.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/08_conjunction/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/08_conjunction/close_approaches.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/09_cat/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/09_cat/cat_workflows.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/10_catalog/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/10_catalog/catalog_queries.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/11_celestial/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/12_terrain/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/12_terrain/terrain_masks.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/13_libration/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/13_libration/libration_dynamics.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/examples/manifest.toml +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/conftest.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/access/helpers.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/access/test_chain.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/access/test_compute.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/access/test_values.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/astrogator/test_api.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/astrogator/test_models.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/astrogator/test_results.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/cat/test_cat.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/catalog/test_catalog.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/client/test_client.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/components/test_components.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/conjunction/test_conjunction.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/coverage/test_coverage.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/coverage/test_coverage_fom.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/helpers.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/libration/test_libration.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/lighting/test_lighting.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/orbits/helpers.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/orbits/test_conversions.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/orbits/test_keplerian.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/orbits/test_orbit_system.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/orbits/test_tle.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/orbits/test_wizards.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/helpers.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_ballistic.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_hpop.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_j2_two_body.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_multi.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_public_contract.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/propagator/test_two_body_rv.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/rocket/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/rocket/test_rocket.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/sdk/terrain/test_terrain.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_external/gmat/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_external/gmat/hpop_driver.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/contracts.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/external_tools.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/gmat.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/test_contracts.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/test_external_tools.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/test_gmat.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/_support/test_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/README.md +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_aer.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_cases.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_constraints.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_exclusion.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/_orientation.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_branch_semantics.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_initial_state_conversions.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_maneuver_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_run_mcs_two_body_brahe.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_scalar_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_sequence_czml_brahe.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/astrogator/test_target_sequence_local.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/cat/test_cat_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_cb_axes_rotation_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/conjunction/test_close_approaches_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/_support.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_cross_endpoint_consistency.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_crtbp_trajectory.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_e2m2e_qualification.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_fixed_x_correction.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_orekit_qualification.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_periodic_families.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/libration/test_positions_and_units.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_lambert_path_points.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/propagator/test_two_body_rv_brahe.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/rocket/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/cross_validation/terrain/test_terrain_mask_invariants.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/access.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_access.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/run_mcs.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/astrogator/test_run_mcs.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/cat/cat.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/cat/test_cat.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/catalog/catalog.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/catalog/test_catalog.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/conjunction/close_approaches.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/conjunction/test_close_approaches.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/libration/libration.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/libration/test_libration.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/conversions.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_conversions.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_ballistic.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/test_two_body.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/propagator/two_body.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/rocket/test_landing_zone.py +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/terrain/terrain.snap.json +0 -0
- {astrox_python-1.2.0 → astrox_python-1.2.2}/tests/validation/live_snapshot/terrain/test_terrain.py +0 -0
|
@@ -75,8 +75,8 @@ class MpcOrbitalElements:
|
|
|
75
75
|
argument_of_periapsis_deg: float | None = None
|
|
76
76
|
mean_anomaly_deg: float | None = None
|
|
77
77
|
reference_frame: str | None = None
|
|
78
|
-
"""Heliocentric mean-ecliptic variant: ``MeanEclpJ2000`` (
|
|
79
|
-
``EclpJ2000ICRF
|
|
78
|
+
"""Heliocentric mean-ecliptic variant: ``MeanEclpJ2000`` (server default)
|
|
79
|
+
or ``EclpJ2000ICRF``."""
|
|
80
80
|
|
|
81
81
|
def __post_init__(self) -> None:
|
|
82
82
|
for field_name in (
|
|
@@ -372,11 +372,11 @@ def mpc_ephemeris(
|
|
|
372
372
|
step_s: float | None = None,
|
|
373
373
|
target_elements: MpcOrbitalElements | None = None,
|
|
374
374
|
) -> dict[str, Any]:
|
|
375
|
-
"""Return ASTROX minor-planet ephemeris output from its MPC
|
|
375
|
+
"""Return ASTROX minor-planet ephemeris output from its MPC data route.
|
|
376
376
|
|
|
377
377
|
When ``target_elements`` is supplied, the server integrates those MPC
|
|
378
|
-
orbital elements directly instead of resolving ``target_name`` through
|
|
379
|
-
|
|
378
|
+
orbital elements directly instead of resolving ``target_name`` through its
|
|
379
|
+
local NEA catalog. ``step_s`` controls the output sampling cadence; zero
|
|
380
380
|
requests the server's internal integration grid.
|
|
381
381
|
"""
|
|
382
382
|
payload: dict[str, Any] = {
|
|
@@ -48,9 +48,9 @@ python compute_lambert_transfer.py
|
|
|
48
48
|
|
|
49
49
|
## 需要做的几个决定
|
|
50
50
|
|
|
51
|
-
1. **选出发与到达天体**:`departure_body`/`arrival_body` 接受服务端支持的天体名称(如 `Earth`、`Mars`、`Ceres`)以及 MPC 编号或名称(如 `2015 XF261
|
|
51
|
+
1. **选出发与到达天体**:`departure_body`/`arrival_body` 接受服务端支持的天体名称(如 `Earth`、`Mars`、`Ceres`)以及 MPC 编号或名称(如 `2015 XF261`)。近地小行星省略对应的 `*_elements` 参数时,服务端从每日更新的本地 NEA 目录读取根数;其他小行星需显式提供根数。
|
|
52
52
|
2. **定两个时间窗口**:`departure_start`/`departure_stop` 与 `arrival_start`/`arrival_stop` 各定义一个 UTC 时间窗口,SDK 分别组合为 `DepartureInterval`/`ArrivalInterval` 的 `"开始/结束"` 字符串。`departure_step_days` 与 `arrival_step_days`(单位 d)控制窗口内的采样步长,结果个数约等于两个窗口采样点数的乘积;示例中的 2 个出发日 × 3 个到达日产生 6 条结果。`min_time_of_flight_days`(单位 d,整数)过滤掉转移时间太短的组合,服务端缺省 10。
|
|
53
|
-
3. **选输出参考系**:`sun_frame` 服务端缺省 `
|
|
53
|
+
3. **选输出参考系**:`sun_frame` 服务端缺省 `EclpJ2000ICRF`;`ICRF` 分支的转移速度已与独立零圈顺行 Lambert 解一致,端点位置方向也已识别为 ICRF 轴方向,而 `MeanEclpJ2000` 与 ICRF 的精确关系尚未独立确认,需要参考系明确的数值时建议显式传 `sun_frame="ICRF"`。
|
|
54
54
|
4. **按需调整过滤上限**:2026-08-20 起服务端按 `max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`(缺省各 10000 m/s,分别对应出发/到达双曲超速大小)与 `max_time_of_flight_days`(缺省 500 d)过滤算例,全部超界时返回空列表;扫描大 ΔV 或超长转移窗口时需显式放宽,示例中的 Earth→Mars 窗口就属于这种情况。
|
|
55
55
|
|
|
56
56
|
## 读懂结果
|
|
@@ -62,10 +62,11 @@ python compute_lambert_transfer.py
|
|
|
62
62
|
- `RV1`/`RV2`:出发/到达时的日心位置速度 `[x, y, z, vx, vy, vz]`(位置 m、速度 m/s);ICRF 分支下转移速度与独立 Lambert 解一致,端点位置方向与 ICRF 轴方向一致。
|
|
63
63
|
- `TimeOfFlightDays`:飞行时间(d),已验证为到达与出发时刻的精确天数差。
|
|
64
64
|
- `ArrivalLightAngle`:到达时刻太阳光照角(deg),已验证为 `DeltaV2` 与 `RV2` 位置矢量的夹角。
|
|
65
|
+
- `MinRangeAu`/`MaxRangeAu`:从出发到到达的转移弧上,距太阳的最小/最大距离(AU,包含端点)。
|
|
65
66
|
|
|
66
67
|
## 小行星与显式 MPC 根数
|
|
67
68
|
|
|
68
|
-
|
|
69
|
+
要跳过服务端的本地 NEA 目录查询,或使用非 NEA 小行星,可以显式传入轨道根数:
|
|
69
70
|
|
|
70
71
|
```python
|
|
71
72
|
elements = celestial.mpc_orbital_elements(
|
|
@@ -49,9 +49,9 @@ python compute_lambert_transfer.py
|
|
|
49
49
|
|
|
50
50
|
## Decisions to make
|
|
51
51
|
|
|
52
|
-
1. **Choose the departure and arrival bodies**: `departure_body`/`arrival_body` accept server-supported body names (e.g. `Earth`, `Mars`, `Ceres`) and MPC numbers or names (e.g. `2015 XF261`). When the matching `*_elements` argument is omitted for
|
|
52
|
+
1. **Choose the departure and arrival bodies**: `departure_body`/`arrival_body` accept server-supported body names (e.g. `Earth`, `Mars`, `Ceres`) and MPC numbers or names (e.g. `2015 XF261`). When the matching `*_elements` argument is omitted for a near-Earth asteroid, the server reads the elements from its daily-refreshed local NEA catalog; other asteroids require explicit elements.
|
|
53
53
|
2. **Set the two time windows**: `departure_start`/`departure_stop` and `arrival_start`/`arrival_stop` each define a UTC time window, which the SDK combines into the `"start/stop"` string of `DepartureInterval`/`ArrivalInterval` respectively. `departure_step_days` and `arrival_step_days` (unit d) control the sample step within each window; the number of results is roughly the product of the two windows' sample counts — the 2 departure days × 3 arrival days in the example produce 6 results. `min_time_of_flight_days` (unit d, integer) filters out combinations whose transfer time is too short; the server default is 10.
|
|
54
|
-
3. **Choose the output reference frame**: the server default for `sun_frame` is `
|
|
54
|
+
3. **Choose the output reference frame**: the server default for `sun_frame` is `EclpJ2000ICRF`; the transfer velocities of the `ICRF` branch agree with an independent zero-revolution prograde Lambert solution, and the endpoint position directions have also been identified as ICRF axes, while the exact relationship between `MeanEclpJ2000` and ICRF is not yet independently confirmed, so pass `sun_frame="ICRF"` explicitly when you need numbers with an identified frame.
|
|
55
55
|
4. **Adjust the filter bounds as needed**: since 2026-08-20 the server filters cases by `max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s` (defaults 10000 m/s each, the departure/arrival hyperbolic excess speed magnitudes) and `max_time_of_flight_days` (default 500 d), returning an empty list when everything is out of bounds; widen the bounds explicitly when scanning large-ΔV or very long transfer windows — the Earth→Mars window in the example is such a case.
|
|
56
56
|
|
|
57
57
|
## Reading the results
|
|
@@ -63,10 +63,11 @@ Each result object contains:
|
|
|
63
63
|
- `RV1`/`RV2`: heliocentric position and velocity at departure/arrival `[x, y, z, vx, vy, vz]` (positions m, velocities m/s); under the ICRF branch the transfer velocities agree with the independent Lambert solution, and the endpoint position directions match the ICRF axes.
|
|
64
64
|
- `TimeOfFlightDays`: time of flight (d), verified to be the exact day difference between the arrival and departure times.
|
|
65
65
|
- `ArrivalLightAngle`: Sun lighting angle at arrival (deg), verified to be the angle between `DeltaV2` and the `RV2` position vector.
|
|
66
|
+
- `MinRangeAu`/`MaxRangeAu`: minimum/maximum distance from the Sun along the departure-to-arrival transfer arc (AU, including endpoints).
|
|
66
67
|
|
|
67
68
|
## Asteroids and explicit MPC elements
|
|
68
69
|
|
|
69
|
-
To
|
|
70
|
+
To bypass the server's local NEA catalog lookup, or to use a non-NEA asteroid, pass orbital elements explicitly:
|
|
70
71
|
|
|
71
72
|
```python
|
|
72
73
|
elements = celestial.mpc_orbital_elements(
|
|
@@ -118,25 +118,25 @@ celestial.mpc_ephemeris(
|
|
|
118
118
|
) -> dict[str, Any]
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
Queries an MPC
|
|
121
|
+
Queries an MPC ephemeris by near-Earth asteroid (NEA) name or number and returns a raw JSON response dictionary. Name lookup uses the server's daily-refreshed local NEA catalog. When `target_elements` is provided, the server integrates the given MPC orbital elements directly without consulting that catalog; non-NEA asteroids must use this path.
|
|
122
122
|
|
|
123
123
|
| Parameter | Wire parameter | Description |
|
|
124
124
|
| --- | --- | --- |
|
|
125
|
-
| `target_name` | `TargetName` |
|
|
125
|
+
| `target_name` | `TargetName` | Near-Earth asteroid name or number, e.g. `Apophis`, `99942`; non-NEAs also require `target_elements` |
|
|
126
126
|
| `observer_frame` | `ObserverFrame` | Heliocentric frame, server options `FIXED`, `INERTIAL`, `J2000`, `ICRF`, `MeanEclpJ2000`, `EclpJ2000ICRF`, default `MeanEclpJ2000` |
|
|
127
127
|
| `start` | `Start` | Start time (UTC); defaults to the orbital epoch and cannot be earlier than the orbital epoch (server rule) |
|
|
128
128
|
| `stop` | `Stop` | Stop time (UTC); defaults to 1 year after `Start` |
|
|
129
129
|
| `step_s` | `Step` | Output sample step, in s, server default 86400 s; pass `0` to output at the internal integration steps |
|
|
130
|
-
| `target_elements` | `TargetElements` | Explicit MPC orbital elements (built with `mpc_orbital_elements`); when omitted, the server
|
|
130
|
+
| `target_elements` | `TargetElements` | Explicit MPC orbital elements (built with `mpc_orbital_elements`); when omitted, the server resolves `target_name` from its local NEA catalog |
|
|
131
131
|
|
|
132
|
-
This route
|
|
132
|
+
This route reads orbital elements from the server's local NEA catalog (element epoch in MJD TDT), which is refreshed daily. The server contract declares adaptive heliocentric integration followed by Hermite interpolation onto the fixed output grid selected by `step_s`; `step_s=0` requests output at the server-declared internal integration steps. The response is a heliocentric CZML Position structure containing `OrbitElements` (orbital elements with keys `EpochMjdTdt`, `PeriTimeMjdTdt`, `Q`, `SemimajorAxis`, `Eccentricity`, `Inclination`, `Raan`, `ArgOfPeriapsis`, `MeanAnomaly`, `ReferenceFrame`) and `Position` (CZML structure, same as `ephemeris`). The catalog's orbital-element values may change with each daily refresh. When `start`/`stop` are omitted, the server uses the orbital-epoch default window (`start` is the orbital epoch and `stop` is one year after it); an explicit fixed window depends on the orbital epoch at query time, and once the catalog epoch updates, a previously fixed window may fall before the new epoch and be rejected by the server, so prefer omitting the window parameters or following the current epoch.
|
|
133
133
|
|
|
134
|
-
Verified (within-route invariants): passing the `OrbitElements` returned by a name query back as `target_elements` reproduces the name-query ephemeris exactly; omitting `step_s` exactly matches explicit `86400`, `172800` produces an exact subset of the daily grid, and `0` returns the same endpoints on a nonuniform internal integration grid; the `reference_frame` values `
|
|
134
|
+
Verified (within-route invariants): passing the `OrbitElements` returned by a name query back as `target_elements` reproduces the name-query ephemeris exactly; omitting `step_s` exactly matches explicit `86400`, `172800` produces an exact subset of the daily grid, and `0` returns the same endpoints on a nonuniform internal integration grid; the `reference_frame` values `MeanEclpJ2000` (the server default for local-catalog and omitted values) and `EclpJ2000ICRF` are two distinguishable branches. This evidence verifies request branches and output-sampling semantics, not absolute orbit accuracy. See the [celestial validation page](../../../../validation/celestial.md) for details.
|
|
135
135
|
|
|
136
136
|
```python
|
|
137
|
-
mpc = celestial.mpc_ephemeris(target_name="
|
|
137
|
+
mpc = celestial.mpc_ephemeris(target_name="Apophis", step_s=172800.0)
|
|
138
138
|
|
|
139
|
-
print(f"
|
|
139
|
+
print(f"Apophis MPC ephemeris: {len(mpc['Position']['cartesianVelocity']) // 7} state samples")
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
## Minor-planet MPC orbital elements
|
|
@@ -172,7 +172,7 @@ Builds a heliocentric MPC orbital-element fragment. When either the departure or
|
|
|
172
172
|
| `raan_deg` | `Raan` | deg |
|
|
173
173
|
| `argument_of_periapsis_deg` | `ArgOfPeriapsis` | deg |
|
|
174
174
|
| `mean_anomaly_deg` | `MeanAnomaly` | deg |
|
|
175
|
-
| `reference_frame` | `ReferenceFrame` | Heliocentric ecliptic frame variant: `MeanEclpJ2000` (
|
|
175
|
+
| `reference_frame` | `ReferenceFrame` | Heliocentric ecliptic frame variant: `MeanEclpJ2000` (server default) or `EclpJ2000ICRF` |
|
|
176
176
|
|
|
177
177
|
```python
|
|
178
178
|
from astrox import celestial
|
|
@@ -192,7 +192,7 @@ elements = celestial.mpc_orbital_elements(
|
|
|
192
192
|
print(elements.to_wire())
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
`to_wire()` returns the ASTROX `MpcOrbElements` request fragment; the example above prints `{'EpochMjdTdt': 61000.0, 'PeriTimeMjdTdt': 60900.0, 'Q': 0.6740515, 'SemimajorAxis': 0.9898367, 'Eccentricity': 0.3190276, 'Inclination': 0.79379, 'Raan': 209.81829, 'ArgOfPeriapsis': 100.88187, 'MeanAnomaly': 120.0}`. When passed to `lambert_transfer_window`, the server propagates heliocentrically directly with these elements and no longer
|
|
195
|
+
`to_wire()` returns the ASTROX `MpcOrbElements` request fragment; the example above prints `{'EpochMjdTdt': 61000.0, 'PeriTimeMjdTdt': 60900.0, 'Q': 0.6740515, 'SemimajorAxis': 0.9898367, 'Eccentricity': 0.3190276, 'Inclination': 0.79379, 'Raan': 209.81829, 'ArgOfPeriapsis': 100.88187, 'MeanAnomaly': 120.0}`. When passed to `lambert_transfer_window`, the server propagates heliocentrically directly with these elements and no longer consults the local NEA catalog. The independent Kepler propagation of explicit elements in that route is unverified: the element system and time convention are not confirmed (the `reference_frame` option does not change the arrival states of that route); the `target_elements` branch of `mpc_ephemeris` is verified (see above), so verify the meaning yourself before use.
|
|
196
196
|
|
|
197
197
|
## Lambert transfer windows
|
|
198
198
|
|
|
@@ -233,8 +233,8 @@ Samples over the departure time window and the arrival time window, computes Lam
|
|
|
233
233
|
| `min_time_of_flight_days` | `MinTofDays` | Minimum transfer time, in d, integer; server default 10 |
|
|
234
234
|
| `departure_step_days` | `DepartureStepDay` | Departure time sample step, in d; server default 1 |
|
|
235
235
|
| `arrival_step_days` | `ArrivalStepDay` | Arrival time sample step, in d; server default 1 |
|
|
236
|
-
| `departure_elements` | `DepartureElements` | MPC orbital elements of the departure asteroid (built with `mpc_orbital_elements`); when omitted, the server queries
|
|
237
|
-
| `arrival_elements` | `ArrivalElements` | MPC orbital elements of the arrival asteroid; when omitted, the server queries
|
|
236
|
+
| `departure_elements` | `DepartureElements` | MPC orbital elements of the departure asteroid (built with `mpc_orbital_elements`); when omitted for a near-Earth asteroid, the server queries its local NEA catalog, while other asteroids require explicit elements |
|
|
237
|
+
| `arrival_elements` | `ArrivalElements` | MPC orbital elements of the arrival asteroid; when omitted for a near-Earth asteroid, the server queries its local NEA catalog, while other asteroids require explicit elements |
|
|
238
238
|
| `max_departure_delta_v_m_s` | `MaxDepartureDV` | Maximum departure velocity increment (departure hyperbolic excess speed magnitude), in m/s, integer; server default 10000, cases above it are filtered out |
|
|
239
239
|
| `max_arrival_delta_v_m_s` | `MaxArrivalDV` | Maximum arrival velocity increment (arrival hyperbolic excess speed magnitude), in m/s, integer; server default 10000, cases above it are filtered out |
|
|
240
240
|
| `max_time_of_flight_days` | `MaxTofDays` | Maximum transfer time, in d, integer; server default 500, cases above it are filtered out |
|
|
@@ -280,6 +280,7 @@ The response contains `TransferResults` (an array of transfer results; each elem
|
|
|
280
280
|
| `RV1` / `RV2` | number[6] | Position and velocity at departure/arrival (heliocentric) `[x, y, z, vx, vy, vz]`, positions m, velocities m/s |
|
|
281
281
|
| `TimeOfFlightDays` | number | Time of flight, in d; verified to be the exact day difference between `ArrivalTime` and `DepartureTime` |
|
|
282
282
|
| `ArrivalLightAngle` | number | Sun lighting angle at arrival, in deg; verified to be the angle between `DeltaV2` and the `RV2` position vector |
|
|
283
|
+
| `MinRangeAu` / `MaxRangeAu` | number | Minimum/maximum distance from the Sun along the departure-to-arrival transfer arc, in AU; includes endpoints, rather than describing the full orbit's perihelion/aphelion distances |
|
|
283
284
|
|
|
284
285
|
Verified (supported by independent cross-validation): omitting `sun_frame` produces exactly the same `TransferResults` as explicit `EclpJ2000ICRF`; `EclpJ2000ICRF` output is the `ICRF` output rotated by the fixed 23.43929111111111° J2000 mean obliquity; with `sun_frame="ICRF"`, the transfer velocities in `RV1`/`RV2` follow the zero-revolution prograde Lambert relationship, and the endpoint position directions use the ICRF axes; `max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`/`max_time_of_flight_days` filter the sampled grid by the `DV1_Mag`/`DV2_Mag`/time-of-flight upper bounds respectively. Note that since 2026-08-20 the server defaults (10000 m/s each for departure/arrival, 500 d) filter out cases beyond the defaults, so scans over large-ΔV windows need explicitly widened bounds. Unresolved: the exact coordinate relationship between explicit `MeanEclpJ2000` and ICRF, the physical meaning of `DeltaV` relative to the endpoint-body velocities, and independent Kepler propagation of explicit MPC elements (the `reference_frame` option does not change the arrival states of that route; the element convention is still unconfirmed). The numeric semantics of those branches remain unverified, so check them before use.
|
|
285
286
|
|
|
@@ -288,7 +289,7 @@ Verified (supported by independent cross-validation): omitting `sun_frame` produ
|
|
|
288
289
|
- `ephemeris` `start` and `stop` are optional; when omitted they are not sent to ASTROX and the server selects January 1 to December 31 of the current year as the window.
|
|
289
290
|
- Each `cartesianVelocity` sample is `[Time, X, Y, Z, dX, dY, dZ]`, with `Time` in seconds from the reference epoch, positions in m, and velocities in m/s.
|
|
290
291
|
- `cb_axes_rotation` passes the integer `order` through as-is; the `Rotation` length corresponds to `order` (`0` → 4, `1` → 7).
|
|
291
|
-
- `mpc_ephemeris` relies on the server's orbital-epoch default window when `start`/`stop` are omitted; an explicit fixed window may expire when the
|
|
292
|
+
- `mpc_ephemeris` relies on the server's orbital-epoch default window when `start`/`stop` are omitted; an explicit fixed window may expire when the orbital epoch in the local NEA catalog updates.
|
|
292
293
|
- `mpc_ephemeris` `step_s` controls the output sampling grid; when omitted the server default is 86400 s, while `0` outputs at the internal integration steps.
|
|
293
294
|
- The returns of all four functions on this page have the transport-level `IsSuccess` and `Message` removed, and the remaining server fields are preserved; errors are still raised by the HTTP layer (see error handling).
|
|
294
295
|
- `lambert_transfer_window` combines `departure_start`/`departure_stop` and `arrival_start`/`arrival_stop` into the `"start/stop"` strings of `DepartureInterval`/`ArrivalInterval` respectively.
|
|
@@ -362,6 +362,8 @@ count_now = coverage.number_of_assets.by_grid_point_at_time(
|
|
|
362
362
|
|
|
363
363
|
Response time returns statistics on uncovered gap durations for each grid point. `compute_type` supports `"Maximum"` and `"Minimum"`.
|
|
364
364
|
|
|
365
|
+
The dynamic `by_grid_point_at_time` route returns `FOM_Value: null` when a point is currently uncovered and has no later access inside the analysis window. `Minimum`, `Maximum`, and `Average` from `grid_stats_over_time` can also be `null`, so callers should handle `None` when reading these fields.
|
|
366
|
+
|
|
365
367
|
```python
|
|
366
368
|
response = coverage.response_time.grid_stats(
|
|
367
369
|
start="2024-01-01T00:00:00.000Z",
|
|
@@ -118,25 +118,25 @@ celestial.mpc_ephemeris(
|
|
|
118
118
|
) -> dict[str, Any]
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
按近地小行星(NEA)名称或编号查询 MPC 小行星星历,返回原始 JSON 响应字典。名称查询由服务端每日更新的本地 NEA 目录解析;提供 `target_elements` 时,服务端直接对给定 MPC 轨道根数积分,不再查询该目录,非 NEA 小行星也必须使用这一方式。
|
|
122
122
|
|
|
123
123
|
| 参数 | wire 参数 | 说明 |
|
|
124
124
|
| --- | --- | --- |
|
|
125
|
-
| `target_name` | `TargetName` |
|
|
125
|
+
| `target_name` | `TargetName` | 近地小行星名称或编号,如 `Apophis`、`99942`;非 NEA 小行星需同时提供 `target_elements` |
|
|
126
126
|
| `observer_frame` | `ObserverFrame` | 日心坐标系,服务端可选 `FIXED`、`INERTIAL`、`J2000`、`ICRF`、`MeanEclpJ2000`、`EclpJ2000ICRF`,缺省为 `MeanEclpJ2000` |
|
|
127
127
|
| `start` | `Start` | 开始时刻(UTC);缺省为轨道历元时刻,不能早于轨道历元时刻(服务端规则) |
|
|
128
128
|
| `stop` | `Stop` | 结束时刻(UTC);缺省为 `Start` 起 1 年 |
|
|
129
129
|
| `step_s` | `Step` | 输出采样步长,单位 s,服务端缺省 86400 s;传入 `0` 时按内部积分步长输出 |
|
|
130
|
-
| `target_elements` | `TargetElements` | 显式 MPC 轨道根数(`mpc_orbital_elements`
|
|
130
|
+
| `target_elements` | `TargetElements` | 显式 MPC 轨道根数(`mpc_orbital_elements` 构造);省略时服务端从本地 NEA 目录解析 `target_name` |
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
该路由从服务端本地 NEA 目录读取轨道根数(历元为 MJD TDT),目录每日更新。服务端契约声明其使用自适应日心积分器递推,再通过 Hermite 插值重采样到 `step_s` 指定的固定输出网格;`step_s=0` 表示请求按服务端声明的内部积分步长输出。响应为日心系 CZML Position 结构,包含 `OrbitElements`(轨道根数,键为 `EpochMjdTdt`、`PeriTimeMjdTdt`、`Q`、`SemimajorAxis`、`Eccentricity`、`Inclination`、`Raan`、`ArgOfPeriapsis`、`MeanAnomaly`、`ReferenceFrame`)与 `Position`(CZML 结构,同 `ephemeris`)。目录中的轨道根数可能随每日数据刷新而变化。省略 `start`/`stop` 时,服务端使用轨道历元默认窗口(`start` 为轨道历元时刻,`stop` 为其后 1 年);显式固定窗口依赖查询时的轨道历元,目录更新后,先前固定的窗口可能早于新历元而被服务端拒绝,建议省略窗口参数或跟随当前历元选择。
|
|
133
133
|
|
|
134
|
-
已验证(路由内不变量):把名称查询返回的 `OrbitElements` 以 `target_elements` 原样回传,得到的星历与名称查询结果完全一致;省略 `step_s` 与显式传入 `86400` 结果完全一致,`172800` 输出是日采样网格的精确子集,`0` 返回端点一致但中间时间不等距的内部积分网格;`reference_frame` 的 `
|
|
134
|
+
已验证(路由内不变量):把名称查询返回的 `OrbitElements` 以 `target_elements` 原样回传,得到的星历与名称查询结果完全一致;省略 `step_s` 与显式传入 `86400` 结果完全一致,`172800` 输出是日采样网格的精确子集,`0` 返回端点一致但中间时间不等距的内部积分网格;`reference_frame` 的 `MeanEclpJ2000`(本地 NEA 目录与省略值时的服务端缺省)与 `EclpJ2000ICRF` 是可区分的两个分支。这些证据验证请求分支与输出采样语义,不验证绝对轨道精度;详见 [celestial 验证页](../../validation/celestial.md)。
|
|
135
135
|
|
|
136
136
|
```python
|
|
137
|
-
mpc = celestial.mpc_ephemeris(target_name="
|
|
137
|
+
mpc = celestial.mpc_ephemeris(target_name="Apophis", step_s=172800.0)
|
|
138
138
|
|
|
139
|
-
print(f"
|
|
139
|
+
print(f"Apophis MPC 星历: {len(mpc['Position']['cartesianVelocity']) // 7} 个状态样本")
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
## 小行星 MPC 轨道根数
|
|
@@ -172,7 +172,7 @@ celestial.mpc_orbital_elements(
|
|
|
172
172
|
| `raan_deg` | `Raan` | deg |
|
|
173
173
|
| `argument_of_periapsis_deg` | `ArgOfPeriapsis` | deg |
|
|
174
174
|
| `mean_anomaly_deg` | `MeanAnomaly` | deg |
|
|
175
|
-
| `reference_frame` | `ReferenceFrame` | 日心平黄道坐标系变体:`MeanEclpJ2000
|
|
175
|
+
| `reference_frame` | `ReferenceFrame` | 日心平黄道坐标系变体:`MeanEclpJ2000`(服务端缺省)或 `EclpJ2000ICRF` |
|
|
176
176
|
|
|
177
177
|
```python
|
|
178
178
|
from astrox import celestial
|
|
@@ -192,7 +192,7 @@ elements = celestial.mpc_orbital_elements(
|
|
|
192
192
|
print(elements.to_wire())
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
`to_wire()` 返回 ASTROX `MpcOrbElements` 请求片段,上面的示例输出 `{'EpochMjdTdt': 61000.0, 'PeriTimeMjdTdt': 60900.0, 'Q': 0.6740515, 'SemimajorAxis': 0.9898367, 'Eccentricity': 0.3190276, 'Inclination': 0.79379, 'Raan': 209.81829, 'ArgOfPeriapsis': 100.88187, 'MeanAnomaly': 120.0}`。传入 `lambert_transfer_window`
|
|
195
|
+
`to_wire()` 返回 ASTROX `MpcOrbElements` 请求片段,上面的示例输出 `{'EpochMjdTdt': 61000.0, 'PeriTimeMjdTdt': 60900.0, 'Q': 0.6740515, 'SemimajorAxis': 0.9898367, 'Eccentricity': 0.3190276, 'Inclination': 0.79379, 'Raan': 209.81829, 'ArgOfPeriapsis': 100.88187, 'MeanAnomaly': 120.0}`。传入 `lambert_transfer_window` 后,服务端直接使用这些根数进行日心轨道递推,不再查询本地 NEA 目录。显式根数在该路由中的独立开普勒递推尚未验证,其元素系与时间约定未确认(`reference_frame` 选项不改变该路由的到达状态);`mpc_ephemeris` 的 `target_elements` 分支已验证(见上文),使用前请自行核对。
|
|
196
196
|
|
|
197
197
|
## Lambert 转移窗口
|
|
198
198
|
|
|
@@ -233,8 +233,8 @@ celestial.lambert_transfer_window(
|
|
|
233
233
|
| `min_time_of_flight_days` | `MinTofDays` | 最小转移时间,单位 d,整数;服务端缺省 10 |
|
|
234
234
|
| `departure_step_days` | `DepartureStepDay` | 出发时间采样步长,单位 d;服务端缺省 1 |
|
|
235
235
|
| `arrival_step_days` | `ArrivalStepDay` | 到达时间采样步长,单位 d;服务端缺省 1 |
|
|
236
|
-
| `departure_elements` | `DepartureElements` | 出发小行星的 MPC 轨道根数(`mpc_orbital_elements`
|
|
237
|
-
| `arrival_elements` | `ArrivalElements` | 到达小行星的 MPC
|
|
236
|
+
| `departure_elements` | `DepartureElements` | 出发小行星的 MPC 轨道根数(`mpc_orbital_elements` 构造);近地小行星省略时服务端查询本地 NEA 目录,其他小行星需显式提供 |
|
|
237
|
+
| `arrival_elements` | `ArrivalElements` | 到达小行星的 MPC 轨道根数;近地小行星省略时服务端查询本地 NEA 目录,其他小行星需显式提供 |
|
|
238
238
|
| `max_departure_delta_v_m_s` | `MaxDepartureDV` | 最大出发速度增量(出发双曲超速大小),单位 m/s,整数;服务端缺省 10000,超出的算例被过滤 |
|
|
239
239
|
| `max_arrival_delta_v_m_s` | `MaxArrivalDV` | 最大到达速度增量(到达双曲超速大小),单位 m/s,整数;服务端缺省 10000,超出的算例被过滤 |
|
|
240
240
|
| `max_time_of_flight_days` | `MaxTofDays` | 最大转移时间,单位 d,整数;服务端缺省 500,超出的算例被过滤 |
|
|
@@ -280,6 +280,7 @@ print(
|
|
|
280
280
|
| `RV1` / `RV2` | number[6] | 出发/到达时的位置速度(日心系)`[x, y, z, vx, vy, vz]`,位置 m、速度 m/s |
|
|
281
281
|
| `TimeOfFlightDays` | number | 飞行时间,单位 d;已验证为 `ArrivalTime` 与 `DepartureTime` 的精确天数差 |
|
|
282
282
|
| `ArrivalLightAngle` | number | 到达时刻太阳光照角,单位 deg;已验证为 `DeltaV2` 与 `RV2` 位置矢量的夹角 |
|
|
283
|
+
| `MinRangeAu` / `MaxRangeAu` | number | 从出发到到达的转移弧上,距太阳的最小/最大距离,单位 AU;包含端点,不是整条轨道的近日点/远日点距离 |
|
|
283
284
|
|
|
284
285
|
已验证(独立交叉验证支持):省略 `sun_frame` 与显式传入 `EclpJ2000ICRF` 的 `TransferResults` 完全一致;`EclpJ2000ICRF` 输出是 `ICRF` 输出按 23.43929111111111° J2000 平黄赤交角进行的固定旋转;`sun_frame="ICRF"` 时,`RV1`/`RV2` 中的转移速度遵循零圈顺行 Lambert 关系,端点位置方向使用 ICRF 轴;`max_departure_delta_v_m_s`/`max_arrival_delta_v_m_s`/`max_time_of_flight_days` 分别按 `DV1_Mag`/`DV2_Mag`/飞行时间上限过滤采样网格。注意 2026-08-20 起服务端缺省值(出发/到达各 10000 m/s、500 d)会过滤掉超出缺省的算例,扫描大 ΔV 窗口时需显式放宽。未解决:显式 `MeanEclpJ2000` 与 ICRF 之间的精确坐标关系、`DeltaV` 相对端点天体速度的物理含义、显式 MPC 根数的独立开普勒递推(`reference_frame` 选项不改变该路由的到达状态,元素约定仍未确认)。这些分支的数值语义尚未验证,使用前请自行核对。
|
|
285
286
|
|
|
@@ -288,7 +289,7 @@ print(
|
|
|
288
289
|
- `ephemeris` 的 `start` 与 `stop` 可选;省略时不会被发往 ASTROX,由服务端选择当年 1 月 1 日至 12 月 31 日作为窗口。
|
|
289
290
|
- `cartesianVelocity` 每个样本为 `[Time, X, Y, Z, dX, dY, dZ]`,`Time` 为相对历元的秒数,位置 m、速度 m/s。
|
|
290
291
|
- `cb_axes_rotation` 的 `order` 是整数,SDK 原样传递;`Rotation` 长度与 `order` 对应(`0` → 4,`1` → 7)。
|
|
291
|
-
- `mpc_ephemeris` 省略 `start`/`stop`
|
|
292
|
+
- `mpc_ephemeris` 省略 `start`/`stop` 时由服务端使用轨道历元默认窗口;显式固定窗口可能因本地 NEA 目录中的轨道历元更新而过期。
|
|
292
293
|
- `mpc_ephemeris` 的 `step_s` 控制输出采样网格;省略时服务端缺省为 86400 s,传入 `0` 时按内部积分步长输出。
|
|
293
294
|
- 本页四个函数的返回都移除了传输层 `IsSuccess` 与 `Message`,保留其余服务器字段;错误仍由 HTTP 层抛出(见错误处理)。
|
|
294
295
|
- `lambert_transfer_window` 的 `departure_start`/`departure_stop` 与 `arrival_start`/`arrival_stop` 分别组合为 `DepartureInterval`/`ArrivalInterval` 的 `"start/stop"` 字符串。
|
|
@@ -362,6 +362,8 @@ count_now = coverage.number_of_assets.by_grid_point_at_time(
|
|
|
362
362
|
|
|
363
363
|
响应时间返回每个网格点未被覆盖的间隙时长统计。`compute_type` 支持 `"Maximum"` 和 `"Minimum"`。
|
|
364
364
|
|
|
365
|
+
指定时刻接口 `by_grid_point_at_time` 在网格点当前未覆盖且分析窗口内没有后续覆盖时返回 `FOM_Value: null`;`grid_stats_over_time` 的 `Minimum`、`Maximum`、`Average` 也可能为 `null`,读取这些字段时应处理 `None`。
|
|
366
|
+
|
|
365
367
|
```python
|
|
366
368
|
response = coverage.response_time.grid_stats(
|
|
367
369
|
start="2024-01-01T00:00:00.000Z",
|
|
@@ -33,19 +33,20 @@ Status of `celestial.cb_axes_rotation`: `partial` — the same-body identity inv
|
|
|
33
33
|
|
|
34
34
|
## MPC ephemeris
|
|
35
35
|
|
|
36
|
-
Status of `celestial.mpc_ephemeris`: structure, `target_elements`, `reference_frame`, and output-cadence branches `verified`; absolute numeric values remain
|
|
36
|
+
Status of `celestial.mpc_ephemeris`: structure, `target_elements`, `reference_frame`, and output-cadence branches `verified`; absolute numeric values remain catalog-data-owned and `unverified`.
|
|
37
37
|
|
|
38
|
-
- Response structure: `verified` through the live snapshot for `target_name="
|
|
39
|
-
- Numeric values: `unverified` as absolute ASTROX ephemeris semantics. The route
|
|
40
|
-
- `target_elements` explicit-element branch: `verified` through [`tests/validation/cross_validation/celestial/test_mpc_target_elements.py`](../../tests/validation/cross_validation/celestial/test_mpc_target_elements.py) as an endpoint-to-endpoint invariant: feeding the `OrbitElements` parsed from a name-based
|
|
41
|
-
- Output cadence: `verified` on a six-day window derived from the current
|
|
42
|
-
- `reference_frame` branch: `verified` as a distinguishing pair. The same
|
|
38
|
+
- Response structure: `verified` through the live snapshot for `target_name="Apophis"` with the server-owned default window (fixed `Start`/`Stop` omitted) — envelope (`OrbitElements`, `Position`; the transport status wrapper fields are removed from curated returns), `OrbitElements` keys (`EpochMjdTdt`, `PeriTimeMjdTdt`, `Q`, `SemimajorAxis`, `Eccentricity`, `Inclination`, `Raan`, `ArgOfPeriapsis`, `MeanAnomaly`, `ReferenceFrame`), and a `Position` CZML-like structure with the same keys as `ephemeris`.
|
|
39
|
+
- Numeric values: `unverified` as absolute ASTROX ephemeris semantics. The route reads orbital elements from the server's daily-refreshed local NEA catalog (element epoch in MJD TDT); the current server contract declares adaptive heliocentric integration followed by Hermite resampling onto the requested fixed output grid. The numeric orbital values are catalog-data-owned and may change with each refresh. No independent orbit oracle is maintained, so no absolute physical-accuracy claim is made. The live snapshot omits `Start`/`Stop` so the server applies its orbital-epoch default window, avoiding fixed windows that could fall before a future catalog epoch and be rejected.
|
|
40
|
+
- `target_elements` explicit-element branch: `verified` through [`tests/validation/cross_validation/celestial/test_mpc_target_elements.py`](../../tests/validation/cross_validation/celestial/test_mpc_target_elements.py) as an endpoint-to-endpoint invariant: feeding the `OrbitElements` parsed from a name-based Apophis lookup back through `target_elements` reproduces the name-based ephemeris exactly (`ROUNDTRIP_ABS_M = 1e-6`, observed residual 0). This verifies branch wiring, not the absolute ephemeris semantics, which remain catalog-data-owned.
|
|
41
|
+
- Output cadence: `verified` on a six-day window derived from the current Apophis element epoch. Omitting `step_s` exactly matches explicit `step_s=86400`; explicit `step_s=172800` returns the exact matching subset of the daily grid; and `step_s=0` returns a distinct, strictly increasing, nonuniform internal grid with the same interval endpoints. The current internal-grid case has four samples, with adjacent intervals from approximately 76910 s to 355090 s. `OUTPUT_GRID_ABS_TOL = 1e-6` is a precision bound for the matching fixed-grid values, whose observed residual is 0. This verifies sampling behavior, not integration accuracy.
|
|
42
|
+
- `reference_frame` branch: `verified` as a distinguishing pair. The same Apophis elements labelled `MeanEclpJ2000` (the local-catalog and omitted-value server default) versus `EclpJ2000ICRF` produce ephemerides separated by approximately 25.3 km on the maintained orbit-epoch-derived window (`FRAME_SEPARATION_MIN_M = 1000`), so the two labels are live, distinguishable branches; the absolute convention of each label is not independently promoted.
|
|
43
43
|
|
|
44
44
|
## Lambert transfer windows
|
|
45
45
|
|
|
46
|
-
Status of `celestial.lambert_transfer_window`: `partial` — the server-default frame, the `EclpJ2000ICRF`↔`ICRF` coordinate relation, the ICRF transfer-state relation for the maintained Earth→Mars grid, the ICRF axis identification of the `RV1`/`RV2` endpoint position directions, the `MinTofDays`/`MaxTofDays`/`MaxDepartureDV`/`MaxArrivalDV` filtering behavior, the DV-magnitude norm invariant, and the `TimeOfFlightDays`/`ArrivalLightAngle` field invariants are `verified`; the explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the physical endpoint-body-velocity interpretation of `DeltaV`, and the independent Kepler semantics of explicit MPC elements are `unresolved`.
|
|
46
|
+
Status of `celestial.lambert_transfer_window`: `partial` — the server-default frame, the `EclpJ2000ICRF`↔`ICRF` coordinate relation, the ICRF transfer-state relation for the maintained Earth→Mars grid, the ICRF axis identification of the `RV1`/`RV2` endpoint position directions, the `MinTofDays`/`MaxTofDays`/`MaxDepartureDV`/`MaxArrivalDV` filtering behavior, the DV-magnitude norm invariant, the `MinRangeAu`/`MaxRangeAu` finite-arc extrema, and the `TimeOfFlightDays`/`ArrivalLightAngle` field invariants are `verified`; the explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the physical endpoint-body-velocity interpretation of `DeltaV`, and the independent Kepler semantics of explicit MPC elements are `unresolved`.
|
|
47
47
|
|
|
48
48
|
- ICRF Earth→Mars zero-revolution prograde transfer states: `verified` through [`tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py`](../../tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py). The maintained case compares the complete six UTC departure/arrival timestamp pairs in a 2 departure days × 3 arrival days grid; the independent solver is `lamberthub.izzo2015` with the Sun gravitational parameter (`1.3271244004193938e20 m^3/s^2`), `M=0`, `prograde=True`, and `low_path=True` (a zero-revolution prograde Lambert solution), using the ASTROX `RV1`/`RV2` endpoint positions as its inputs. The ASTROX transfer velocities match the solver within `SOLVER_ABS_TOL_M_S = 1e-6` m/s. The endpoint positions themselves are the solver inputs; their full celestial-state meaning beyond the independently checked directions is not promoted here.
|
|
49
|
+
- Transfer-arc `MinRangeAu`/`MaxRangeAu`: `verified` using independent `lamberthub.izzo2015` velocities and SciPy DOP853 two-body integration with radial-stationary events and both endpoints. The 22 maintained transfers cover Earth→Mars in ICRF and EclpJ2000ICRF, explicit-element asteroid transfers in ICRF, and 2/4/12/14-day ICRF transfers. They exercise 40 interior and 4 endpoint extrema, distinguishing finite-arc bounds from full-orbit apsides. Maximum observed residual is 1.46e-11 AU, below the pre-set 1e-9 AU bound (the 1e-6 m/s Lambert velocity precision budget accumulated over roughly 300 days is about 2e-10 AU; the remaining margin allows propagation amplification and integration error). Integration uses AU/day units, rtol=2e-12 and atol=2e-14, and independently checks arrival-position closure within 1e-9 AU. This comparison conditions on returned endpoint positions; it does not validate the endpoint ephemerides or resolve the explicit MPC-element convention. SciPy is an existing development dependency.
|
|
49
50
|
- ICRF endpoint position-direction axis identification: `verified` through [`tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py`](../../tests/validation/cross_validation/celestial/test_lambert_transfer_lamberthub.py). For each of the six maintained Earth→Mars results, the `RV1`/`RV2` position directions at the returned UTC departure/arrival epochs are compared with independent Skyfield DE421 heliocentric Earth/Mars position directions (body-minus-Sun positions at the same epochs). The direct angular-separation maximum is approximately 8.54e-7 deg, within the pre-set `ICRF_AXIS_IDENTIFICATION_MAX_ANGLE_DEG = 0.01`; the best of the fixed ±23.43929111111111 deg obliquity rotations applied to the independent directions stays at approximately 22.35 deg maximum separation, above `WRONG_FRAME_MIN_SEPARATION_DEG = 1.0`. This verifies only the identification of the ICRF axes for the endpoint position directions — not full numerical-kernel precision, and not the celestial-state meaning of the endpoint positions beyond their direction. The explicit `MeanEclpJ2000`↔`ICRF` coordinate relation, the `DeltaV` physical interpretation, and the explicit MPC-element semantics remain separate `unresolved` items.
|
|
50
51
|
- Server-default frame: `verified` on the maintained Earth→Mars grid by exact `TransferResults` equality between omitted `sun_frame` and explicit `sun_frame="EclpJ2000ICRF"`. The default result is distinguishable from explicit `MeanEclpJ2000`, with a current maximum state-vector separation of about 54 km.
|
|
51
52
|
- `EclpJ2000ICRF`↔`ICRF` coordinate relation: `verified` on every `RV1`, `RV2`, `DeltaV1`, and `DeltaV2` vector in the maintained grid. A fixed 23.43929111111111° J2000 mean-obliquity rotation reproduces the ecliptic output from the independently anchored ICRF output within `ECLIPTIC_RELATION_POSITION_ABS_TOL_M = 1e-3 m` and `ECLIPTIC_RELATION_VELOCITY_ABS_TOL_M_S = 1e-9 m/s`; current maximum residuals are approximately 3.1e-5 m and 1.1e-11 m/s.
|
|
@@ -61,7 +62,7 @@ Status of `celestial.lambert_transfer_window`: `partial` — the server-default
|
|
|
61
62
|
|
|
62
63
|
## Live snapshot coverage
|
|
63
64
|
|
|
64
|
-
The celestial functions are exercised in [`tests/validation/live_snapshot/celestial/test_celestial.py`](../../tests/validation/live_snapshot/celestial/test_celestial.py), with sidecar [`tests/validation/live_snapshot/celestial/celestial.snap.json`](../../tests/validation/live_snapshot/celestial/celestial.snap.json) covering `ephemeris` (Moon, explicit window), `cb_axes_rotation` (order 0 and 1), `mpc_ephemeris` (
|
|
65
|
+
The celestial functions are exercised in [`tests/validation/live_snapshot/celestial/test_celestial.py`](../../tests/validation/live_snapshot/celestial/test_celestial.py), with sidecar [`tests/validation/live_snapshot/celestial/celestial.snap.json`](../../tests/validation/live_snapshot/celestial/celestial.snap.json) covering `ephemeris` (Moon, explicit window), `cb_axes_rotation` (order 0 and 1), `mpc_ephemeris` (Apophis, server-owned default window), and `lambert_transfer_window` (Earth→Mars with the server-default `EclpJ2000ICRF` frame, and Earth→2015 XF261 with explicit MPC elements and `sun_frame="ICRF"`). The snapshots freeze recursive nested type/layout descriptors: per-field value kinds, the CZML `cartesianVelocity` 7-value grouping, the order-dependent `Rotation` lengths (4 for `order=0`, 7 for `order=1`), the MPC `OrbitElements` key set (including `ReferenceFrame` since 2026-08-20), and the transfer-result grid with its `DeltaV` 3-vector and `RV` 6-vector layouts plus the `TimeOfFlightDays`/`ArrivalLightAngle` numbers (since 2026-08-20); the two range fields added in the 2026-09-19 upstream contract are also retained as numeric AU values with a 1e-9 AU absolute comparison tolerance; other volatile numeric values are not frozen, and the MPC numeric values remain catalog-data-owned. Curated returns remove the transport status wrapper fields `IsSuccess`/`Message`, so the frozen shapes contain only server data fields. These live snapshots detect drift in response shape and the retained range values for maintained public inputs.
|
|
65
66
|
|
|
66
67
|
Cross-validation scripts:
|
|
67
68
|
- [`tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py`](../../tests/validation/cross_validation/celestial/test_ephemeris_skyfield.py)
|
|
@@ -168,8 +168,8 @@ FOM cross-validation is organized across [`test_fom_interval_invariants.py`](../
|
|
|
168
168
|
| `ValueByGridPointAtTime` before first access | verified as remaining duration until next positive-asset interval |
|
|
169
169
|
| `ValueByGridPointAtTime` during access | verified as `0` |
|
|
170
170
|
| `ValueByGridPointAtTime` mixed covered/not-yet-covered | verified pointwise against remaining time to next access |
|
|
171
|
-
| `ValueByGridPointAtTime` after final access |
|
|
172
|
-
| `GridStatsOverTime` for intermittent coverage |
|
|
171
|
+
| `ValueByGridPointAtTime` after final access | verified as `null` when no later access exists inside the analysis window |
|
|
172
|
+
| `GridStatsOverTime` for intermittent coverage | partial; returns nullable statistics instead of an HTTP error, while exact mixed-null aggregation remains unresolved |
|
|
173
173
|
| `ValueByGridPointAtTime` outside analysis window | verified to reject with an API error, not a silent clamp |
|
|
174
174
|
|
|
175
175
|
### Revisit Time
|
|
@@ -190,12 +190,13 @@ Known findings:
|
|
|
190
190
|
- FOM grid statistics use simple arithmetic statistics over point values, not coverage grid weights. This is verified on a representative `LatLonBounds` grid where arithmetic and weighted averages differ.
|
|
191
191
|
- At-time FOM routes use ASTROX's internal transition precision, not the rounded millisecond strings returned in `ComputeCoverage` intervals. A rounded access-start timestamp can still evaluate as uncovered when the precise transition occurs a fraction of a millisecond later.
|
|
192
192
|
- `ResponseTime` differs from `RevisitTime`: when uncovered before a later access, `ResponseTime` returns remaining time until the next access, while `RevisitTime` returns the whole containing gap duration.
|
|
193
|
+
- Dynamic `ResponseTime` returns `null` for an uncovered point when no later access exists inside the analysis window. A never-covered grid therefore returns null per-point values and all-null over-time statistics.
|
|
193
194
|
- For no-coverage cases, `ComputeCoverage` itself currently returns a worker "Index was out of range" error, but most FOM static, at-time, and over-time routes return meaningful edge-case values: `0` for `SimpleCoverage`, `CoverageTime`, and `NumberOfAssets`; full-window duration for `ResponseTime` and `RevisitTime`.
|
|
194
195
|
- For continuous-coverage cases, `ComputeCoverage` also returns a worker error in the covered fixture, but the FOM routes return `1` for `SimpleCoverage` and `NumberOfAssets`, full-window duration for `CoverageTime`, and `0` for `ResponseTime` and `RevisitTime`.
|
|
195
196
|
- Unsupported `ComputeType` strings are rejected by ASTROX for routes that expose `ComputeType`; they are not ignored, defaulted, or silently remapped.
|
|
196
197
|
- `AzElMask` is rejected consistently across representative FOM routes and `ComputeCoverage` in the coverage grid-point role.
|
|
197
198
|
|
|
198
|
-
Live snapshot sidecar: `coverage.snap.json` covers all public FOM routes, including
|
|
199
|
+
Live snapshot sidecar: `coverage.snap.json` covers all public FOM routes, including nullable dynamic `ResponseTime` results.
|
|
199
200
|
|
|
200
201
|
## Live Snapshot Coverage
|
|
201
202
|
|
|
@@ -206,7 +207,7 @@ The live snapshot layer proves maintained response shape, not semantic correctne
|
|
|
206
207
|
- Coverage compute with elevation and range grid-point constraints.
|
|
207
208
|
- `percent_coverage` and `coverage_by_asset` reports for one SGP4 asset.
|
|
208
209
|
- All 18 public FOM functions: `simple_coverage`, `coverage_time`, `number_of_assets`, `response_time`, and `revisit_time` across `by_grid_point`, `by_grid_point_at_time`, `grid_stats`, and `grid_stats_over_time` where exposed.
|
|
209
|
-
-
|
|
210
|
+
- Nullable `response_time.by_grid_point_at_time` and `response_time.grid_stats_over_time` results in intermittent and no-coverage cases.
|
|
210
211
|
- Drift guard for site-entity coverage assets currently returning a worker error.
|
|
211
212
|
|
|
212
213
|
The snapshot tolerance is `COVERAGE_SNAPSHOT_ABS_TOL = 2.0e-3`; cross-validation owns semantic precision.
|
|
@@ -34,8 +34,8 @@ def main() -> None:
|
|
|
34
34
|
)
|
|
35
35
|
print(f"Earth→Moon 旋转: {len(rotation['Rotation'])} 个数值")
|
|
36
36
|
|
|
37
|
-
mpc = celestial.mpc_ephemeris(target_name="
|
|
38
|
-
print(f"
|
|
37
|
+
mpc = celestial.mpc_ephemeris(target_name="Apophis", step_s=172800.0)
|
|
38
|
+
print(f"Apophis MPC 星历: {len(mpc['Position']['cartesianVelocity']) // 7} 个状态样本")
|
|
39
39
|
|
|
40
40
|
transfer = celestial.lambert_transfer_window(
|
|
41
41
|
departure_body="Earth",
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "astrox-python"
|
|
7
|
-
version = "1.2.
|
|
7
|
+
version = "1.2.2"
|
|
8
8
|
description = "Python SDK for the ASTROX Web API."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -59,7 +59,7 @@ dev = [
|
|
|
59
59
|
"astropy>=6.1.7",
|
|
60
60
|
"spiceypy>=8.1.2",
|
|
61
61
|
"scipy>=1.14",
|
|
62
|
-
"e2m2e==5.
|
|
62
|
+
"e2m2e==5.9.5",
|
|
63
63
|
]
|
|
64
64
|
|
|
65
65
|
[tool.hatch.build.targets.wheel]
|
|
@@ -166,16 +166,16 @@ def test_cb_axes_rotation_omits_optional_server_defaults(
|
|
|
166
166
|
)
|
|
167
167
|
|
|
168
168
|
|
|
169
|
-
def
|
|
169
|
+
def test_mpc_ephemeris_preserves_server_owned_route_defaults(
|
|
170
170
|
monkeypatch: pytest.MonkeyPatch,
|
|
171
171
|
) -> None:
|
|
172
172
|
calls = record_raw_post(monkeypatch, RESPONSE)
|
|
173
173
|
|
|
174
|
-
celestial.mpc_ephemeris(target_name="
|
|
174
|
+
celestial.mpc_ephemeris(target_name="Apophis")
|
|
175
175
|
|
|
176
176
|
assert_canonical_equal(
|
|
177
177
|
calls[0],
|
|
178
|
-
{"endpoint": "/celestial/mpc", "json": {"TargetName": "
|
|
178
|
+
{"endpoint": "/celestial/mpc", "json": {"TargetName": "Apophis"}},
|
|
179
179
|
)
|
|
180
180
|
|
|
181
181
|
|
|
@@ -185,7 +185,7 @@ def test_mpc_ephemeris_lowers_optional_arguments(
|
|
|
185
185
|
calls = record_raw_post(monkeypatch, RESPONSE)
|
|
186
186
|
|
|
187
187
|
celestial.mpc_ephemeris(
|
|
188
|
-
target_name="
|
|
188
|
+
target_name="Apophis",
|
|
189
189
|
observer_frame="topocentric",
|
|
190
190
|
start=START,
|
|
191
191
|
stop=STOP,
|
|
@@ -197,7 +197,7 @@ def test_mpc_ephemeris_lowers_optional_arguments(
|
|
|
197
197
|
{
|
|
198
198
|
"endpoint": "/celestial/mpc",
|
|
199
199
|
"json": {
|
|
200
|
-
"TargetName": "
|
|
200
|
+
"TargetName": "Apophis",
|
|
201
201
|
"ObserverFrame": "topocentric",
|
|
202
202
|
"Start": START,
|
|
203
203
|
"Stop": STOP,
|
|
@@ -212,13 +212,13 @@ def test_mpc_ephemeris_preserves_zero_step(
|
|
|
212
212
|
) -> None:
|
|
213
213
|
calls = record_raw_post(monkeypatch, RESPONSE)
|
|
214
214
|
|
|
215
|
-
celestial.mpc_ephemeris(target_name="
|
|
215
|
+
celestial.mpc_ephemeris(target_name="Apophis", step_s=0)
|
|
216
216
|
|
|
217
217
|
assert_canonical_equal(
|
|
218
218
|
calls[0],
|
|
219
219
|
{
|
|
220
220
|
"endpoint": "/celestial/mpc",
|
|
221
|
-
"json": {"TargetName": "
|
|
221
|
+
"json": {"TargetName": "Apophis", "Step": 0.0},
|
|
222
222
|
},
|
|
223
223
|
)
|
|
224
224
|
|
|
@@ -229,7 +229,7 @@ def test_mpc_ephemeris_omits_none_optional_arguments(
|
|
|
229
229
|
calls = record_raw_post(monkeypatch, RESPONSE)
|
|
230
230
|
|
|
231
231
|
celestial.mpc_ephemeris(
|
|
232
|
-
target_name="
|
|
232
|
+
target_name="Apophis",
|
|
233
233
|
observer_frame=None,
|
|
234
234
|
start=START,
|
|
235
235
|
stop=None,
|
|
@@ -240,7 +240,7 @@ def test_mpc_ephemeris_omits_none_optional_arguments(
|
|
|
240
240
|
calls[0],
|
|
241
241
|
{
|
|
242
242
|
"endpoint": "/celestial/mpc",
|
|
243
|
-
"json": {"TargetName": "
|
|
243
|
+
"json": {"TargetName": "Apophis", "Start": START},
|
|
244
244
|
},
|
|
245
245
|
)
|
|
246
246
|
|
|
@@ -261,7 +261,7 @@ def test_mpc_ephemeris_omits_none_optional_arguments(
|
|
|
261
261
|
"order",
|
|
262
262
|
),
|
|
263
263
|
(celestial.mpc_ephemeris, {"target_name": 1}, "target_name"),
|
|
264
|
-
(celestial.mpc_ephemeris, {"target_name": "
|
|
264
|
+
(celestial.mpc_ephemeris, {"target_name": "Apophis", "step_s": True}, "step_s"),
|
|
265
265
|
],
|
|
266
266
|
)
|
|
267
267
|
def test_celestial_rejects_mistyped_arguments(
|
|
@@ -372,7 +372,7 @@ def test_mpc_ephemeris_lowers_target_elements(
|
|
|
372
372
|
)
|
|
373
373
|
|
|
374
374
|
celestial.mpc_ephemeris(
|
|
375
|
-
target_name="
|
|
375
|
+
target_name="Apophis",
|
|
376
376
|
start=START,
|
|
377
377
|
stop=STOP,
|
|
378
378
|
target_elements=elements,
|
|
@@ -383,7 +383,7 @@ def test_mpc_ephemeris_lowers_target_elements(
|
|
|
383
383
|
{
|
|
384
384
|
"endpoint": "/celestial/mpc",
|
|
385
385
|
"json": {
|
|
386
|
-
"TargetName": "
|
|
386
|
+
"TargetName": "Apophis",
|
|
387
387
|
"Start": START,
|
|
388
388
|
"Stop": STOP,
|
|
389
389
|
"TargetElements": elements.to_wire(),
|
|
@@ -394,7 +394,7 @@ def test_mpc_ephemeris_lowers_target_elements(
|
|
|
394
394
|
|
|
395
395
|
def test_mpc_ephemeris_rejects_mistyped_target_elements() -> None:
|
|
396
396
|
with pytest.raises(TypeError, match="target_elements"):
|
|
397
|
-
celestial.mpc_ephemeris(target_name="
|
|
397
|
+
celestial.mpc_ephemeris(target_name="Apophis", target_elements={})
|
|
398
398
|
|
|
399
399
|
|
|
400
400
|
def test_lambert_transfer_window_lowers_delta_v_and_tof_filters(
|
|
@@ -451,7 +451,13 @@ def test_lambert_transfer_window_lowers_complete_payload_and_strips_status(
|
|
|
451
451
|
transfer_response = {
|
|
452
452
|
"IsSuccess": True,
|
|
453
453
|
"Message": "Success",
|
|
454
|
-
"TransferResults": [
|
|
454
|
+
"TransferResults": [
|
|
455
|
+
{
|
|
456
|
+
"RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
|
|
457
|
+
"MinRangeAu": 0.8,
|
|
458
|
+
"MaxRangeAu": 1.6,
|
|
459
|
+
}
|
|
460
|
+
],
|
|
455
461
|
"FutureField": {"preserve": True},
|
|
456
462
|
}
|
|
457
463
|
calls = record_raw_post(monkeypatch, transfer_response)
|
|
@@ -472,7 +478,13 @@ def test_lambert_transfer_window_lowers_complete_payload_and_strips_status(
|
|
|
472
478
|
)
|
|
473
479
|
|
|
474
480
|
assert response == {
|
|
475
|
-
"TransferResults": [
|
|
481
|
+
"TransferResults": [
|
|
482
|
+
{
|
|
483
|
+
"RV1": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
|
|
484
|
+
"MinRangeAu": 0.8,
|
|
485
|
+
"MaxRangeAu": 1.6,
|
|
486
|
+
}
|
|
487
|
+
],
|
|
476
488
|
"FutureField": {"preserve": True},
|
|
477
489
|
}
|
|
478
490
|
assert response is not transfer_response
|
|
@@ -78,7 +78,7 @@ Run the live lighting cross-validation tests:
|
|
|
78
78
|
ASTROX_BASE_URL=http://astrox.cn:8765 uv run python -m pytest tests/validation/cross_validation/lighting
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
Orekit-backed
|
|
81
|
+
Orekit-backed validation uses `orekit-jpype[jdk4py]` for independent lighting and libration comparisons. The test loads a commit-pinned Orekit data archive from `OREKIT_DATA_PATH`, defaulting to `$XDG_CACHE_HOME/astrox-python/orekit-data-<revision>.zip` (or `~/.cache` when `XDG_CACHE_HOME` is unset), and downloads it when the cached content is missing or invalid. Because GitLab-generated archive container bytes may change without a repository change, validation pins a canonical SHA-256 over the archive's member paths and uncompressed contents rather than the ZIP file bytes.
|
|
82
82
|
|
|
83
83
|
GMAT-backed validation runs through a prepared Docker image. Scheduled SDK health pulls `ghcr.io/<owner>/astrox-gmat-validation:gmat-r2026a`, self-checks it, and sets `ASTROX_EXTERNAL_VALIDATION=strict` before running validation.
|
|
84
84
|
|