astrox-python 0.1.0__tar.gz → 0.1.1__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-0.1.0 → astrox_python-0.1.1}/PKG-INFO +30 -25
- astrox_python-0.1.1/README.md +59 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/__init__.py +8 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_constraints.py +62 -2
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/_core.py +1 -5
- astrox_python-0.1.1/docs/CONTRIBUTING.md +9 -0
- astrox_python-0.1.1/docs/README.md +10 -0
- astrox_python-0.1.1/docs/docs-principles.md +102 -0
- astrox_python-0.1.1/docs/getting_started.md +71 -0
- astrox_python-0.1.1/docs/how_to/README.md +11 -0
- astrox_python-0.1.1/docs/how_to/build_an_hpop_configuration.md +148 -0
- astrox_python-0.1.1/docs/how_to/compute_access_intervals.md +108 -0
- astrox_python-0.1.1/docs/how_to/compute_lighting_conditions.md +123 -0
- astrox_python-0.1.1/docs/how_to/convert_between_orbit_representations.md +137 -0
- astrox_python-0.1.1/docs/how_to/propagate_an_orbit.md +148 -0
- astrox_python-0.1.1/docs/i18n/en/README.md +59 -0
- astrox_python-0.1.1/docs/i18n/en/getting_started.md +71 -0
- astrox_python-0.1.1/docs/i18n/en/how_to/README.md +11 -0
- astrox_python-0.1.1/docs/i18n/en/how_to/build_an_hpop_configuration.md +148 -0
- astrox_python-0.1.1/docs/i18n/en/how_to/compute_access_intervals.md +108 -0
- astrox_python-0.1.1/docs/i18n/en/how_to/compute_lighting_conditions.md +123 -0
- astrox_python-0.1.1/docs/i18n/en/how_to/convert_between_orbit_representations.md +137 -0
- astrox_python-0.1.1/docs/i18n/en/how_to/propagate_an_orbit.md +148 -0
- astrox_python-0.1.1/docs/i18n/en/manual/README.md +11 -0
- astrox_python-0.1.1/docs/i18n/en/manual/access/README.md +264 -0
- astrox_python-0.1.1/docs/i18n/en/manual/components/README.md +807 -0
- astrox_python-0.1.1/docs/i18n/en/manual/coverage/README.md +403 -0
- astrox_python-0.1.1/docs/i18n/en/manual/lighting/README.md +185 -0
- astrox_python-0.1.1/docs/i18n/en/manual/orbits/README.md +451 -0
- astrox_python-0.1.1/docs/i18n/en/manual/propagator/README.md +634 -0
- astrox_python-0.1.1/docs/i18n/en/manual/rocket/README.md +110 -0
- astrox_python-0.1.1/docs/manual/README.md +11 -0
- astrox_python-0.1.1/docs/manual/access/README.md +264 -0
- astrox_python-0.1.1/docs/manual/components/README.md +807 -0
- astrox_python-0.1.1/docs/manual/coverage/README.md +403 -0
- astrox_python-0.1.1/docs/manual/lighting/README.md +185 -0
- astrox_python-0.1.1/docs/manual/orbits/README.md +451 -0
- astrox_python-0.1.1/docs/manual/propagator/README.md +634 -0
- astrox_python-0.1.1/docs/manual/rocket/README.md +110 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/docs/sdk-principles.md +3 -3
- astrox_python-0.1.1/docs/validation/README.md +15 -0
- astrox_python-0.1.1/docs/validation/access.md +348 -0
- astrox_python-0.1.1/docs/validation/coverage.md +216 -0
- astrox_python-0.1.1/docs/validation/lighting.md +171 -0
- astrox_python-0.1.1/docs/validation/orbits.md +194 -0
- astrox_python-0.1.1/docs/validation/propagator.md +271 -0
- astrox_python-0.1.1/docs/validation/rocket.md +93 -0
- astrox_python-0.1.1/examples/01_propagation/README.md +47 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/ballistic_apogee_alt.py +25 -26
- astrox_python-0.1.1/examples/01_propagation/ballistic_delta_v.py +107 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/ballistic_min_ecc.py +3 -3
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/ballistic_time_of_flight.py +3 -3
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/batch_propagators.py +4 -4
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/hpop.py +9 -9
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/j2_classical.py +11 -11
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/propagator_reference.py +14 -14
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/sgp4_tle.py +4 -4
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/simple_ascent.py +4 -4
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/two_body_classical.py +4 -4
- astrox_python-0.1.1/examples/02_orbits/README.md +30 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/conversions.py +8 -8
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/lambert_delta_v.py +5 -5
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/orbit_system.py +16 -17
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/wizards.py +4 -4
- astrox_python-0.1.1/examples/03_lighting/README.md +26 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/03_lighting/lighting.py +9 -9
- astrox_python-0.1.1/examples/04_access/README.md +30 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/chain.py +5 -5
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/compute.py +7 -7
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/constraints.py +7 -7
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/custom_axes.py +3 -3
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/sensor_pointing.py +3 -3
- astrox_python-0.1.1/examples/05_rocket/README.md +7 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/05_rocket/landing_zone.py +5 -5
- astrox_python-0.1.1/examples/06_coverage/README.md +32 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/compute.py +6 -6
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/fom.py +6 -6
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/grid_points.py +3 -3
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/reports.py +5 -5
- {astrox_python-0.1.0 → astrox_python-0.1.1}/pyproject.toml +1 -1
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/test_chain.py +30 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/test_compute.py +4 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/components/test_components.py +54 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/coverage/test_coverage.py +10 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/coverage/test_coverage_fom.py +11 -1
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/README.md +32 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/README.md +1 -0
- astrox_python-0.1.1/tests/validation/cross_validation/access/_exclusion.py +285 -0
- astrox_python-0.1.1/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +576 -0
- astrox_python-0.1.1/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +266 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +20 -2
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +58 -1
- astrox_python-0.1.1/tests/validation/live_snapshot/access/access.snap.json +1434 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_access.py +23 -6
- astrox_python-0.1.1/tests/validation/live_snapshot/propagator/ballistic.snap.json +213 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_ballistic.py +24 -6
- {astrox_python-0.1.0 → astrox_python-0.1.1}/uv.lock +60 -556
- astrox_python-0.1.0/README.md +0 -54
- astrox_python-0.1.0/docs/sdk/access.md +0 -191
- astrox_python-0.1.0/docs/sdk/components.md +0 -351
- astrox_python-0.1.0/docs/sdk/coverage.md +0 -171
- astrox_python-0.1.0/docs/sdk/lighting.md +0 -75
- astrox_python-0.1.0/docs/sdk/orbits.md +0 -215
- astrox_python-0.1.0/docs/sdk/propagator.md +0 -272
- astrox_python-0.1.0/docs/sdk/rocket.md +0 -55
- astrox_python-0.1.0/examples/01_propagation/README.md +0 -47
- astrox_python-0.1.0/examples/01_propagation/ballistic_delta_v.py +0 -108
- astrox_python-0.1.0/examples/02_orbits/README.md +0 -30
- astrox_python-0.1.0/examples/03_lighting/README.md +0 -26
- astrox_python-0.1.0/examples/04_access/README.md +0 -30
- astrox_python-0.1.0/examples/05_rocket/README.md +0 -7
- astrox_python-0.1.0/examples/06_coverage/README.md +0 -32
- astrox_python-0.1.0/tests/validation/live_snapshot/access/access.snap.json +0 -1434
- astrox_python-0.1.0/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -213
- {astrox_python-0.1.0 → astrox_python-0.1.1}/.gitignore +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/LICENSE +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/_http.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/access.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_axes.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_common.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_objects.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_positions.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_rotations.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_sensors.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_vgt.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/_fom.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/coverage_time.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/number_of_assets.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/response_time.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/revisit_time.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/simple_coverage.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/exceptions.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/lighting.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/orbits.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/propagator.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/rocket.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/docs/automated-workflows.md +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/docs/test-principles.md +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/manifest.toml +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/README.md +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/conftest.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/helpers.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/test_values.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/client/test_client.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/helpers.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/lighting/test_lighting.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/helpers.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_conversions.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_keplerian.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_orbit_system.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_wizards.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/helpers.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_ballistic.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_hpop.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_j2_two_body.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_multi.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_public_contract.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/rocket/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/rocket/test_rocket.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_external/gmat/README.md +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_external/gmat/hpop_driver.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/contracts.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/external_tools.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/gmat.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_contracts.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_external_tools.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_gmat.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_aer.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_cases.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_constraints.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_orientation.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/_fom_helpers.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/rocket/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/coverage/coverage.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/coverage/test_coverage.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/conversions.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_conversions.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_two_body.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/two_body.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
- {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/rocket/test_landing_zone.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: astrox-python
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Python SDK for the ASTROX Web API.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Mtrya/astrox-python
|
|
6
6
|
Project-URL: Repository, https://github.com/Mtrya/astrox-python.git
|
|
@@ -28,55 +28,60 @@ Description-Content-Type: text/markdown
|
|
|
28
28
|
|
|
29
29
|
# astrox-python
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
astrox-python 是 ASTROX Web API 的 Python SDK。
|
|
32
32
|
|
|
33
|
-
##
|
|
33
|
+
## 安装
|
|
34
|
+
|
|
35
|
+
需要 Python 3.10 或更高版本。
|
|
34
36
|
|
|
35
37
|
```bash
|
|
36
38
|
pip install astrox-python
|
|
37
39
|
```
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
## Quickstart
|
|
41
|
+
## 一分钟示例
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
用一组开普勒根数做 J2 传播:
|
|
44
44
|
|
|
45
45
|
```python
|
|
46
|
+
import astrox
|
|
46
47
|
from astrox import orbits, propagator
|
|
47
48
|
|
|
49
|
+
astrox.configure(base_url="http://astrox.cn:8765")
|
|
50
|
+
|
|
48
51
|
orbit = orbits.keplerian(
|
|
49
52
|
semi_major_axis_m=6778137.0,
|
|
50
53
|
eccentricity=0.001,
|
|
51
|
-
inclination_deg=
|
|
54
|
+
inclination_deg=51.6,
|
|
52
55
|
argument_of_periapsis_deg=0.0,
|
|
53
|
-
raan_deg=
|
|
54
|
-
true_anomaly_deg=
|
|
56
|
+
raan_deg=120.0,
|
|
57
|
+
true_anomaly_deg=45.0,
|
|
55
58
|
)
|
|
56
59
|
|
|
57
60
|
period_s, position = propagator.j2(
|
|
58
|
-
start="
|
|
59
|
-
stop="
|
|
60
|
-
orbit_epoch="
|
|
61
|
+
start="2024-01-01T00:00:00.000Z",
|
|
62
|
+
stop="2024-01-01T00:10:00.000Z",
|
|
63
|
+
orbit_epoch="2024-01-01T00:00:00.000Z",
|
|
61
64
|
orbit=orbit,
|
|
62
65
|
)
|
|
66
|
+
|
|
67
|
+
print(f"轨道周期: {period_s:.3f} s")
|
|
68
|
+
print(f"位置/速度采样数: {len(position.cartesian_velocity)}")
|
|
63
69
|
```
|
|
64
70
|
|
|
65
|
-
|
|
71
|
+
完整首次运行流程见 [快速上手](docs/getting_started.md)。
|
|
66
72
|
|
|
67
|
-
|
|
68
|
-
- Runnable examples: [`examples/`](./examples/)
|
|
73
|
+
## 文档
|
|
69
74
|
|
|
70
|
-
|
|
75
|
+
- 完整文档导航:[docs/README.md](docs/README.md)
|
|
76
|
+
- 可运行示例:[examples/](examples/)
|
|
77
|
+
- 英文快照:[docs/i18n/en/README.md](docs/i18n/en/README.md)
|
|
71
78
|
|
|
72
|
-
|
|
79
|
+
## 参与开发
|
|
73
80
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
uv run python -m pytest -q tests/sdk
|
|
78
|
-
```
|
|
81
|
+
开发环境搭建与构建步骤见 [CONTRIBUTING.md](docs/CONTRIBUTING.md)。
|
|
82
|
+
|
|
83
|
+
## 许可
|
|
79
84
|
|
|
80
|
-
|
|
85
|
+
MIT 许可证,详见 [LICENSE](LICENSE)。
|
|
81
86
|
|
|
82
|
-
|
|
87
|
+
本项目目前处于 Alpha 阶段。
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# astrox-python
|
|
2
|
+
|
|
3
|
+
astrox-python 是 ASTROX Web API 的 Python SDK。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
需要 Python 3.10 或更高版本。
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install astrox-python
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 一分钟示例
|
|
14
|
+
|
|
15
|
+
用一组开普勒根数做 J2 传播:
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import astrox
|
|
19
|
+
from astrox import orbits, propagator
|
|
20
|
+
|
|
21
|
+
astrox.configure(base_url="http://astrox.cn:8765")
|
|
22
|
+
|
|
23
|
+
orbit = orbits.keplerian(
|
|
24
|
+
semi_major_axis_m=6778137.0,
|
|
25
|
+
eccentricity=0.001,
|
|
26
|
+
inclination_deg=51.6,
|
|
27
|
+
argument_of_periapsis_deg=0.0,
|
|
28
|
+
raan_deg=120.0,
|
|
29
|
+
true_anomaly_deg=45.0,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
period_s, position = propagator.j2(
|
|
33
|
+
start="2024-01-01T00:00:00.000Z",
|
|
34
|
+
stop="2024-01-01T00:10:00.000Z",
|
|
35
|
+
orbit_epoch="2024-01-01T00:00:00.000Z",
|
|
36
|
+
orbit=orbit,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
print(f"轨道周期: {period_s:.3f} s")
|
|
40
|
+
print(f"位置/速度采样数: {len(position.cartesian_velocity)}")
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
完整首次运行流程见 [快速上手](docs/getting_started.md)。
|
|
44
|
+
|
|
45
|
+
## 文档
|
|
46
|
+
|
|
47
|
+
- 完整文档导航:[docs/README.md](docs/README.md)
|
|
48
|
+
- 可运行示例:[examples/](examples/)
|
|
49
|
+
- 英文快照:[docs/i18n/en/README.md](docs/i18n/en/README.md)
|
|
50
|
+
|
|
51
|
+
## 参与开发
|
|
52
|
+
|
|
53
|
+
开发环境搭建与构建步骤见 [CONTRIBUTING.md](docs/CONTRIBUTING.md)。
|
|
54
|
+
|
|
55
|
+
## 许可
|
|
56
|
+
|
|
57
|
+
MIT 许可证,详见 [LICENSE](LICENSE)。
|
|
58
|
+
|
|
59
|
+
本项目目前处于 Alpha 阶段。
|
|
@@ -36,11 +36,15 @@ from ._constraints import (
|
|
|
36
36
|
AzElMaskConstraint,
|
|
37
37
|
Constraint,
|
|
38
38
|
ElevationConstraint,
|
|
39
|
+
MoonExclusionAngleConstraint,
|
|
39
40
|
RangeConstraint,
|
|
41
|
+
SunExclusionAngleConstraint,
|
|
40
42
|
_constraint_to_wire,
|
|
41
43
|
az_el_mask_constraint,
|
|
42
44
|
elevation_constraint,
|
|
45
|
+
moon_exclusion_angle_constraint,
|
|
43
46
|
range_constraint,
|
|
47
|
+
sun_exclusion_angle_constraint,
|
|
44
48
|
)
|
|
45
49
|
from ._objects import Entity, EntityGroup, entity, entity_group
|
|
46
50
|
from ._positions import (
|
|
@@ -141,6 +145,7 @@ __all__ = [
|
|
|
141
145
|
"HpopPosition",
|
|
142
146
|
"J2Position",
|
|
143
147
|
"LvlhAxes",
|
|
148
|
+
"MoonExclusionAngleConstraint",
|
|
144
149
|
"QuaternionRotation",
|
|
145
150
|
"RangeConstraint",
|
|
146
151
|
"RectangularSensor",
|
|
@@ -150,6 +155,7 @@ __all__ = [
|
|
|
150
155
|
"Sgp4Position",
|
|
151
156
|
"SitePosition",
|
|
152
157
|
"SimpleAscentPosition",
|
|
158
|
+
"SunExclusionAngleConstraint",
|
|
153
159
|
"TwoBodyPosition",
|
|
154
160
|
"VgtAngle",
|
|
155
161
|
"VgtDirection",
|
|
@@ -182,6 +188,7 @@ __all__ = [
|
|
|
182
188
|
"hpop_position",
|
|
183
189
|
"j2_position",
|
|
184
190
|
"lvlh_axes",
|
|
191
|
+
"moon_exclusion_angle_constraint",
|
|
185
192
|
"quaternion_rotation",
|
|
186
193
|
"range_constraint",
|
|
187
194
|
"ra_dec_direction",
|
|
@@ -198,5 +205,6 @@ __all__ = [
|
|
|
198
205
|
"sgp4_position",
|
|
199
206
|
"site_position",
|
|
200
207
|
"simple_ascent_position",
|
|
208
|
+
"sun_exclusion_angle_constraint",
|
|
201
209
|
"two_body_position",
|
|
202
210
|
]
|
|
@@ -65,10 +65,52 @@ class AzElMaskConstraint:
|
|
|
65
65
|
return payload
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
@dataclass(frozen=True, kw_only=True)
|
|
69
|
+
class SunExclusionAngleConstraint:
|
|
70
|
+
"""Sun exclusion-angle constraint fragment shared by ASTROX entity and coverage inputs."""
|
|
71
|
+
|
|
72
|
+
minimum_deg: float | None = None
|
|
73
|
+
text: str | None = None
|
|
74
|
+
|
|
75
|
+
def to_wire(self) -> dict[str, Any]:
|
|
76
|
+
"""Lower to an ASTROX Sun exclusion-angle constraint fragment."""
|
|
77
|
+
payload: dict[str, Any] = {"$type": "SunExclusionAngle"}
|
|
78
|
+
_include_if_supplied(payload, "MinimumValue", self.minimum_deg)
|
|
79
|
+
_include_if_supplied(payload, "Text", self.text)
|
|
80
|
+
return payload
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
@dataclass(frozen=True, kw_only=True)
|
|
84
|
+
class MoonExclusionAngleConstraint:
|
|
85
|
+
"""Moon exclusion-angle constraint fragment shared by ASTROX entity and coverage inputs."""
|
|
86
|
+
|
|
87
|
+
minimum_deg: float | None = None
|
|
88
|
+
text: str | None = None
|
|
89
|
+
|
|
90
|
+
def to_wire(self) -> dict[str, Any]:
|
|
91
|
+
"""Lower to an ASTROX Moon exclusion-angle constraint fragment."""
|
|
92
|
+
payload: dict[str, Any] = {"$type": "MoonExclusionAngle"}
|
|
93
|
+
_include_if_supplied(payload, "MinimumValue", self.minimum_deg)
|
|
94
|
+
_include_if_supplied(payload, "Text", self.text)
|
|
95
|
+
return payload
|
|
69
96
|
|
|
70
97
|
|
|
71
|
-
|
|
98
|
+
Constraint: TypeAlias = (
|
|
99
|
+
ElevationConstraint
|
|
100
|
+
| RangeConstraint
|
|
101
|
+
| AzElMaskConstraint
|
|
102
|
+
| SunExclusionAngleConstraint
|
|
103
|
+
| MoonExclusionAngleConstraint
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
_CONSTRAINT_TYPES = (
|
|
108
|
+
ElevationConstraint,
|
|
109
|
+
RangeConstraint,
|
|
110
|
+
AzElMaskConstraint,
|
|
111
|
+
SunExclusionAngleConstraint,
|
|
112
|
+
MoonExclusionAngleConstraint,
|
|
113
|
+
)
|
|
72
114
|
|
|
73
115
|
|
|
74
116
|
def elevation_constraint(
|
|
@@ -132,6 +174,24 @@ def az_el_mask_constraint(
|
|
|
132
174
|
)
|
|
133
175
|
|
|
134
176
|
|
|
177
|
+
def sun_exclusion_angle_constraint(
|
|
178
|
+
*,
|
|
179
|
+
minimum_deg: float | None = None,
|
|
180
|
+
text: str | None = None,
|
|
181
|
+
) -> SunExclusionAngleConstraint:
|
|
182
|
+
"""Create a Sun exclusion-angle constraint fragment."""
|
|
183
|
+
return SunExclusionAngleConstraint(minimum_deg=minimum_deg, text=text)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def moon_exclusion_angle_constraint(
|
|
187
|
+
*,
|
|
188
|
+
minimum_deg: float | None = None,
|
|
189
|
+
text: str | None = None,
|
|
190
|
+
) -> MoonExclusionAngleConstraint:
|
|
191
|
+
"""Create a Moon exclusion-angle constraint fragment."""
|
|
192
|
+
return MoonExclusionAngleConstraint(minimum_deg=minimum_deg, text=text)
|
|
193
|
+
|
|
194
|
+
|
|
135
195
|
def _constraint_to_wire(constraint: Constraint) -> dict[str, Any]:
|
|
136
196
|
if not isinstance(constraint, _CONSTRAINT_TYPES):
|
|
137
197
|
raise TypeError("constraint must be an astrox.components constraint value")
|
|
@@ -9,6 +9,7 @@ from typing import Any, TypeAlias
|
|
|
9
9
|
|
|
10
10
|
from astrox import components
|
|
11
11
|
from astrox._http import raw
|
|
12
|
+
from astrox.components._constraints import _CONSTRAINT_TYPES
|
|
12
13
|
|
|
13
14
|
__all__ = [
|
|
14
15
|
"CbLatLonGrid",
|
|
@@ -203,11 +204,6 @@ class CbLatLonGrid:
|
|
|
203
204
|
CoverageGrid: TypeAlias = GlobalGrid | LatitudeGrid | LatLonGrid | CbLatLonGrid
|
|
204
205
|
_GRID_TYPES = (GlobalGrid, LatitudeGrid, LatLonGrid, CbLatLonGrid)
|
|
205
206
|
_SENSOR_TYPES = (components.ConicSensor, components.RectangularSensor)
|
|
206
|
-
_CONSTRAINT_TYPES = (
|
|
207
|
-
components.ElevationConstraint,
|
|
208
|
-
components.RangeConstraint,
|
|
209
|
-
components.AzElMaskConstraint,
|
|
210
|
-
)
|
|
211
207
|
|
|
212
208
|
|
|
213
209
|
def global_grid(
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# ASTROX Python SDK 文档
|
|
2
|
+
|
|
3
|
+
本文档树按四层组织,每层面向不同的阅读目标:
|
|
4
|
+
|
|
5
|
+
- [快速上手](getting_started.md):面向第一次使用的用户。提供一条完整的可运行脚本,安装、配置、构造开普勒根数、调用传播器并查看结果,五分钟内看到输出。
|
|
6
|
+
- [How-To 指南](how_to/README.md):面向任务导向的用户。每篇围绕一个具体问题给出最简可用代码,说明需要做的关键选择,并指向手册和验证页获取细节与证据。
|
|
7
|
+
- [手册](manual/README.md):面向希望了解完整约定的用户。按领域组织,先讲概念,再给出 API 参考、参数/单位、返回约定与最简示例。
|
|
8
|
+
- [验证](validation/README.md)(英文):面向维护者和高级用户。记录各领域的验证状态、比较路径、容差与已知残差,链接到 `tests/validation/` 下的脚本。
|
|
9
|
+
|
|
10
|
+
各层互不替代;正常使用时无需逐层通读。
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# ASTROX Documentation Principles
|
|
2
|
+
|
|
3
|
+
User-facing documentation is the primary interface for the ASTROX Python SDK. It must be user-facing without internal jargons. It must be honest about what is verified, clear about what is convention, and never claim what tests do not prove.
|
|
4
|
+
|
|
5
|
+
## Documentation Layers
|
|
6
|
+
|
|
7
|
+
The documentation tree has four layers with non-overlapping jobs.
|
|
8
|
+
|
|
9
|
+
| Layer | Location | Audience | Content | Language |
|
|
10
|
+
|-------|----------|----------|---------|----------|
|
|
11
|
+
| Getting Started | `docs/getting_started.md` | First-time user | One runnable end-to-end example. Install, configure, propagate an orbit, print a position. | Chinese |
|
|
12
|
+
| How-To | `docs/how_to/*.md` | Task-oriented user | Cross-domain task guides. Each solves one specific problem completely. | Chinese |
|
|
13
|
+
| Manual | `docs/manual/<domain>/*.md` | User who wants the full story | Per-function comprehensive walkthrough grouped by domains. Concepts → API reference → algorithms (only if verified). | Chinese |
|
|
14
|
+
| Validation | `docs/validation/*.md` | Maintainer, advanced user | What is verified, against what, known residuals, coverage status. | English |
|
|
15
|
+
|
|
16
|
+
No layer may substitute for another. A user should be able to follow Getting Started without reading Manual, and a maintainer should be able to read Validation without reading How-To.
|
|
17
|
+
|
|
18
|
+
## Content Boundaries
|
|
19
|
+
|
|
20
|
+
### Getting Started
|
|
21
|
+
|
|
22
|
+
- One complete runnable script.
|
|
23
|
+
- No optional arguments, no branches, no caveats.
|
|
24
|
+
- Goal: a new user runs this in five minutes and sees output.
|
|
25
|
+
|
|
26
|
+
### How-To
|
|
27
|
+
|
|
28
|
+
- States the goal in the title.
|
|
29
|
+
- Shows minimal working code.
|
|
30
|
+
- Explains the one or two decisions the user must make.
|
|
31
|
+
- Links to Manual for background and Validation for evidence.
|
|
32
|
+
- Does not discuss calibration residuals, frame conventions, or investigation narratives.
|
|
33
|
+
|
|
34
|
+
### Manual
|
|
35
|
+
|
|
36
|
+
- Concepts: what this domain is, when to use it, how it relates to other domains.
|
|
37
|
+
- API reference: function signatures, argument tables, return types, minimal examples.
|
|
38
|
+
- Algorithms: underlying math or physics only when cross-validation has verified the behavior. Unverified algorithms are marked `unverified` or omitted.
|
|
39
|
+
- Convention notes: one-sentence neutral statements about ASTROX conventions (frame interpretations, advance rules, coordinate definitions).
|
|
40
|
+
- Does not contain investigation narratives, residual discussions, or calibration history.
|
|
41
|
+
|
|
42
|
+
### Validation
|
|
43
|
+
|
|
44
|
+
- Cross-validation results per branch.
|
|
45
|
+
- Known residuals with explanations.
|
|
46
|
+
- Frame and convention discoveries from calibration.
|
|
47
|
+
- Coverage status and comparison paths.
|
|
48
|
+
- Links to relevant cross-validation scripts in `tests/validation/cross_validation/`.
|
|
49
|
+
- Does not contain usage examples or API signatures.
|
|
50
|
+
|
|
51
|
+
## Convention vs. Investigation
|
|
52
|
+
|
|
53
|
+
Content inherited from the former `docs/sdk/*.md` pages was split according to this rule; apply the same rule to any new material:
|
|
54
|
+
|
|
55
|
+
- **Convention statements** stay in Manual as neutral one-sentence asides. Example: "For SGP4 results, `position.reference_frame == 'INERTIAL'` corresponds to GCRF/GCRS-style inertial coordinates."
|
|
56
|
+
- **Investigation narratives** move to Validation. Example: "Cross-validation against Skyfield confirms the sign and units for representative cases. An arcsecond-scale residual remains visible after frame and light-time diagnostics."
|
|
57
|
+
|
|
58
|
+
If a sentence describes what ASTROX does, it is a convention. If a sentence describes how we discovered it or what remains unexplained, it is an investigation narrative.
|
|
59
|
+
|
|
60
|
+
## Evidence Honesty
|
|
61
|
+
|
|
62
|
+
Documentation must not claim what tests do not prove.
|
|
63
|
+
|
|
64
|
+
- If a branch is `verified` in the coverage checklist, the Manual may describe its behavior as documented.
|
|
65
|
+
- If a branch is `partial`, `unresolved`, or `unverifiable`, the Manual must mark it as such or omit the claim.
|
|
66
|
+
- The Manual must not say "correct" or "accurate" unless cross-validation has established a comparison path. Say "ASTROX returns" or "the result is" instead.
|
|
67
|
+
- How-To guides may use verified branches as recommended paths. Unverified branches should not appear in How-To unless clearly marked.
|
|
68
|
+
|
|
69
|
+
## Voice and Tone
|
|
70
|
+
|
|
71
|
+
- **Getting Started:** Encouraging, imperative, minimal. Assume the user knows Python but not astrodynamics.
|
|
72
|
+
- **How-To:** Direct, task-oriented. "Do X to achieve Y."
|
|
73
|
+
- **Manual:** Precise, informative. Explain concepts before showing code. Use explicit unit suffixes (`_m`, `_deg`, `_s`) matching the public API.
|
|
74
|
+
- **Validation:** Evidence-backed, cautious. State tolerances, comparison paths, and model assumptions explicitly. Never say "proven"; say "cross-validated against X within tolerance Y."
|
|
75
|
+
|
|
76
|
+
## Relationship to Examples
|
|
77
|
+
|
|
78
|
+
Examples under `examples/` are runnable artifacts. Docs explain and link to them. Getting Started may inline one short example. How-To and Manual link to relevant examples. Examples must not contain validation narratives or calibration notes.
|
|
79
|
+
|
|
80
|
+
## Chinese-First Policy
|
|
81
|
+
|
|
82
|
+
All user-facing documentation (Getting Started, How-To, Manual) is written in Chinese. English translation is optional and lives in `docs/i18n/en/`.
|
|
83
|
+
|
|
84
|
+
English is preserved for:
|
|
85
|
+
- Validation documentation
|
|
86
|
+
- Architecture and principle documents (`docs-principles.md`, `sdk-principles.md`, `test-principles.md`, `automated-workflows.md`, `AGENTS.md`)
|
|
87
|
+
- Code comments, tests, and validation scripts
|
|
88
|
+
- `README.md` is Chinese-first with a link to the English version
|
|
89
|
+
|
|
90
|
+
## i18n
|
|
91
|
+
|
|
92
|
+
When an English original is preserved in `docs/i18n/en/`, it should be a faithful snapshot of the Chinese source at the time of writing. Do not expand or reduce claims during translation.
|
|
93
|
+
|
|
94
|
+
## Anti-Patterns
|
|
95
|
+
|
|
96
|
+
- Do not mix validation notes into API reference.
|
|
97
|
+
- Do not write "see above" or "as discussed earlier" in Manual pages. Each section should be readable independently.
|
|
98
|
+
- Do not use defensive language like "may return" or "might be" when the behavior is verified. Say what ASTROX does.
|
|
99
|
+
- Do not use absolute language like "correct" or "accurate" when the behavior is unverified.
|
|
100
|
+
- Do not hard-wrap Markdown prose. Preserve unwrapped paragraphs.
|
|
101
|
+
- Do not introduce internal jargons when it's a user-facing material.
|
|
102
|
+
- Do not write Chinese that looks like a machine translation.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# 快速上手
|
|
2
|
+
|
|
3
|
+
本页帮助你在五分钟内完成第一次轨道传播:安装 SDK、配置 ASTROX 服务地址、构造一组开普勒根数、调用 J2 传播器,并查看返回的位置。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
使用 Python 3.10 或更高版本:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install astrox-python
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 编写脚本
|
|
14
|
+
|
|
15
|
+
将以下代码保存为 `first_orbit.py`:
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import astrox
|
|
19
|
+
from astrox import orbits, propagator
|
|
20
|
+
|
|
21
|
+
# 配置 ASTROX 服务地址
|
|
22
|
+
astrox.configure(base_url="http://astrox.cn:8765")
|
|
23
|
+
|
|
24
|
+
# 构造一组开普勒根数:400 km 近圆轨道,51.6° 倾角
|
|
25
|
+
orbit = orbits.keplerian(
|
|
26
|
+
semi_major_axis_m=6778137.0,
|
|
27
|
+
eccentricity=0.001,
|
|
28
|
+
inclination_deg=51.6,
|
|
29
|
+
argument_of_periapsis_deg=0.0,
|
|
30
|
+
raan_deg=120.0,
|
|
31
|
+
true_anomaly_deg=45.0,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# 使用 J2 模型传播 10 分钟
|
|
35
|
+
period_s, position = propagator.j2(
|
|
36
|
+
start="2024-01-01T00:00:00.000Z",
|
|
37
|
+
stop="2024-01-01T00:10:00.000Z",
|
|
38
|
+
orbit_epoch="2024-01-01T00:00:00.000Z",
|
|
39
|
+
orbit=orbit,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
print(f"轨道周期: {period_s:.3f} s")
|
|
43
|
+
print(f"历元: {position.epoch}")
|
|
44
|
+
print(f"中心天体: {position.central_body}")
|
|
45
|
+
print(f"参考系: {position.reference_frame}")
|
|
46
|
+
print(f"位置/速度采样数: {len(position.cartesian_velocity)}")
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 运行
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
python first_orbit.py
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
你会看到类似下面的输出:
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
轨道周期: 5553.624 s
|
|
59
|
+
历元: 2024-01-01T00:00:00.000Z
|
|
60
|
+
中心天体: Earth
|
|
61
|
+
参考系: INERTIAL
|
|
62
|
+
位置/速度采样数: 77
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 刚才发生了什么
|
|
66
|
+
|
|
67
|
+
`orbits.keplerian` 用六个开普勒根数描述了一个轨道:半长轴 `semi_major_axis_m`、偏心率 `eccentricity`、倾角 `inclination_deg`、近地点幅角 `argument_of_periapsis_deg`、升交点赤经 `raan_deg` 和真近点角 `true_anomaly_deg`。`propagator.j2` 把这组根数从给定历元向前传播,返回轨道周期 `period_s` 和一个包含笛卡尔位置/速度采样的 `position` 对象。
|
|
68
|
+
|
|
69
|
+
## 下一步
|
|
70
|
+
|
|
71
|
+
了解更多任务导向的用法,请参阅 [How-To 指南](how_to/README.md)。
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# How-To 指南
|
|
2
|
+
|
|
3
|
+
面向任务的操作指南,每篇解决一个具体问题。
|
|
4
|
+
|
|
5
|
+
- [如何传播一条轨道](propagate_an_orbit.md):根据手头的轨道描述(开普勒根数、TLE 或力模型配置)选择传播器并读取采样结果。
|
|
6
|
+
- [在不同轨道表示之间转换](convert_between_orbit_representations.md):开普勒根数、笛卡尔状态与 Kozai-Izsak 平均根数之间的相互转换。
|
|
7
|
+
- [搭建 HPOP 力模型配置](build_an_hpop_configuration.md):用 `hpop_config` 系列构造器组装积分器、重力场、大气、太阳辐射压与第三方天体摄动。
|
|
8
|
+
- [计算光照条件](compute_lighting_conditions.md):光照/半影/本影区间、太阳辐射强度与太阳 AER 采样。
|
|
9
|
+
- [计算地面站与卫星之间的访问区间](compute_access_intervals.md):直接访问计算、AER 输出与仰角约束。
|
|
10
|
+
|
|
11
|
+
每篇指南的完整参数说明见对应的[手册](../manual/README.md)条目,验证证据见[验证文档](../validation/README.md)。
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# 搭建 HPOP 力模型配置
|
|
2
|
+
|
|
3
|
+
本页解决一个具体任务:用 `propagator.hpop_config(...)` 系列构造器搭一套 HPOP 力模型配置,并用它运行一次高精度轨道传播。
|
|
4
|
+
|
|
5
|
+
## 要做的两个选择
|
|
6
|
+
|
|
7
|
+
1. **为任务选择力模型分量**:HPOP 配置由积分器、重力场、大气、太阳辐射压、第三方天体摄动等可选分量叠加而成。简单任务可以只用二体重力;需要更高精度时,再逐层加入重力场阶次、大气阻力、太阳辐射压和日月第三方天体摄动。
|
|
8
|
+
2. **选择坐标系**:`coord_system` 决定输出位置的参考系。`"Inertial"` 对应惯性参考系输出,`"Fixed"` 对应地固参考系输出;与 J2/二体传播一样,默认由服务器决定,但建议在调用中显式指定。
|
|
9
|
+
|
|
10
|
+
## 完整示例
|
|
11
|
+
|
|
12
|
+
下面的脚本构造一个包含全部可选分量的 HPOP 力模型配置,并用开普勒根数运行一次 10 分钟传播。将代码保存为 `build_an_hpop_configuration.py`:
|
|
13
|
+
|
|
14
|
+
```python
|
|
15
|
+
import astrox
|
|
16
|
+
from astrox import orbits, propagator
|
|
17
|
+
|
|
18
|
+
astrox.configure(base_url="http://astrox.cn:8765")
|
|
19
|
+
|
|
20
|
+
orbit = orbits.keplerian(
|
|
21
|
+
semi_major_axis_m=6778137.0,
|
|
22
|
+
eccentricity=0.001,
|
|
23
|
+
inclination_deg=28.5,
|
|
24
|
+
argument_of_periapsis_deg=0.0,
|
|
25
|
+
raan_deg=0.0,
|
|
26
|
+
true_anomaly_deg=0.0,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
config = propagator.hpop_config(
|
|
30
|
+
central_body="Earth",
|
|
31
|
+
integrator=propagator.hpop_rkf78(
|
|
32
|
+
use_fixed_step=True,
|
|
33
|
+
initial_step_s=60.0,
|
|
34
|
+
max_step_s=60.0,
|
|
35
|
+
min_step_s=0.001,
|
|
36
|
+
max_abs_error=1e-10,
|
|
37
|
+
max_rel_error=1e-12,
|
|
38
|
+
max_iterations=50,
|
|
39
|
+
),
|
|
40
|
+
gravity=propagator.hpop_gravity_field(
|
|
41
|
+
gravity_file_name="EGM2008.grv",
|
|
42
|
+
degree=4,
|
|
43
|
+
order=4,
|
|
44
|
+
use_secular_variations=False,
|
|
45
|
+
solid_tide_type="Permanent tide only",
|
|
46
|
+
eop_file_path="EOP-v1.1.txt",
|
|
47
|
+
),
|
|
48
|
+
atmosphere=propagator.hpop_jacchia_roberts(
|
|
49
|
+
drag_model_type="Spherical",
|
|
50
|
+
atmos_data_source="Constant Values",
|
|
51
|
+
f10p7=150.0,
|
|
52
|
+
f10p7_avg=150.0,
|
|
53
|
+
kp=3.0,
|
|
54
|
+
),
|
|
55
|
+
srp=propagator.hpop_srp_spherical(
|
|
56
|
+
shadow_model="DualCone",
|
|
57
|
+
sun_position="Apparent",
|
|
58
|
+
eclipsing_bodies=["Earth", "Moon"],
|
|
59
|
+
),
|
|
60
|
+
third_bodies=[
|
|
61
|
+
propagator.hpop_third_body(
|
|
62
|
+
"Sun",
|
|
63
|
+
mode_type="PointMass",
|
|
64
|
+
ephem_source="DeFile",
|
|
65
|
+
grav_source="DeFile",
|
|
66
|
+
mu_m3_s2=1.3271244004193938e20,
|
|
67
|
+
),
|
|
68
|
+
propagator.hpop_third_body("Moon"),
|
|
69
|
+
],
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
period_s, position = propagator.hpop(
|
|
73
|
+
start="2024-01-01T00:00:00.000Z",
|
|
74
|
+
stop="2024-01-01T00:10:00.000Z",
|
|
75
|
+
orbit_epoch="2024-01-01T00:00:00.000Z",
|
|
76
|
+
orbit=orbit,
|
|
77
|
+
coord_system="Inertial",
|
|
78
|
+
gravitational_parameter_m3_s2=398600441500000.0,
|
|
79
|
+
coefficient_of_drag=2.2,
|
|
80
|
+
area_mass_ratio_drag_m2_kg=0.01,
|
|
81
|
+
coefficient_of_srp=1.3,
|
|
82
|
+
area_mass_ratio_srp_m2_kg=0.02,
|
|
83
|
+
config=config,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
samples = position.cartesian_velocity
|
|
87
|
+
print(f"轨道周期: {period_s:.3f} s")
|
|
88
|
+
print(f"中心天体: {position.central_body}")
|
|
89
|
+
print(f"参考系: {position.reference_frame}")
|
|
90
|
+
print(f"采样点数: {len(samples) // 7}")
|
|
91
|
+
t = samples[0]
|
|
92
|
+
x, y, z, vx, vy, vz = samples[1:7]
|
|
93
|
+
print(f"首个采样 t={t:.3f} s")
|
|
94
|
+
print(f"位置 (m): x={x:.3f}, y={y:.3f}, z={z:.3f}")
|
|
95
|
+
print(f"速度 (m/s): vx={vx:.6f}, vy={vy:.6f}, vz={vz:.6f}")
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 运行
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
python build_an_hpop_configuration.py
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 实际输出
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
轨道周期: 6000.000 s
|
|
108
|
+
中心天体: Earth
|
|
109
|
+
参考系: INERTIAL
|
|
110
|
+
采样点数: 11
|
|
111
|
+
首个采样 t=0.000 s
|
|
112
|
+
位置 (m): x=6771358.863, y=0.000, z=0.000
|
|
113
|
+
速度 (m/s): vx=0.000000, vy=6746.002785, vz=3662.780662
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 刚才发生了什么
|
|
117
|
+
|
|
118
|
+
上面的示例把所有可选分量都启用了一次,方便你看懂组装方式;实际任务中应根据精度需求裁剪,各分支的验证范围见 [传播器验证](../validation/propagator.md)。
|
|
119
|
+
|
|
120
|
+
`propagator.hpop_config(...)` 把多个力模型分量组装成一个 `HpopConfig` 对象。每个分量都有对应的构造器:
|
|
121
|
+
|
|
122
|
+
- `hpop_rkf78`:配置 RKF7(8) 数值积分器,可指定固定步长、误差容限和最大迭代次数。
|
|
123
|
+
- `hpop_two_body_gravity`:只使用中心天体二体引力。
|
|
124
|
+
- `hpop_gravity_field`:使用重力场文件,可指定阶次、潮汐模型和地球定向参数文件。
|
|
125
|
+
- `hpop_jacchia_roberts`:配置 Jacchia-Roberts 大气模型,用于大气阻力计算。
|
|
126
|
+
- `hpop_srp_spherical`:配置球形太阳辐射压模型,可指定阴影模型(`shadow_model`)、太阳位置和遮挡天体。
|
|
127
|
+
- `hpop_third_body`:为指定天体(如 Sun、Moon)开启第三方天体摄动。
|
|
128
|
+
|
|
129
|
+
`propagator.hpop(...)` 把这些配置发往 ASTROX,返回 `(period_s, position)`。`position.cartesian_velocity` 是 CZML 风格的 `[t, x, y, z, vx, vy, vz, ...]` 扁平序列,每 7 个数一帧,单位分别为秒、米、米/秒。与 `propagator.j2` 不同,HPOP 不暴露 `step_s` 参数,采样由积分器和服务器内部控制。
|
|
130
|
+
|
|
131
|
+
## 简化版:只配二体重力
|
|
132
|
+
|
|
133
|
+
如果任务暂时不需要重力场文件,最小配置可以简化为:
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
config = propagator.hpop_config(
|
|
137
|
+
central_body="Earth",
|
|
138
|
+
gravity=propagator.hpop_two_body_gravity(),
|
|
139
|
+
)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
此时 `hpop` 等价于用 HPOP 数值积分器传播二体问题,适合先验证接口再逐步加入摄动模型。
|
|
143
|
+
|
|
144
|
+
## 了解更多
|
|
145
|
+
|
|
146
|
+
- 各构造器的完整参数、单位与返回值说明请参阅 [传播器手册](../manual/propagator/README.md)。
|
|
147
|
+
- HPOP 各分支的验证状态、GMAT 交叉验证证据与已知残差请参阅 [传播器验证](../validation/propagator.md)。
|
|
148
|
+
- 更多可运行示例见 `examples/01_propagation/hpop.py`。
|