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.
Files changed (264) hide show
  1. {astrox_python-0.1.0 → astrox_python-0.1.1}/PKG-INFO +30 -25
  2. astrox_python-0.1.1/README.md +59 -0
  3. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/__init__.py +8 -0
  4. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_constraints.py +62 -2
  5. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/_core.py +1 -5
  6. astrox_python-0.1.1/docs/CONTRIBUTING.md +9 -0
  7. astrox_python-0.1.1/docs/README.md +10 -0
  8. astrox_python-0.1.1/docs/docs-principles.md +102 -0
  9. astrox_python-0.1.1/docs/getting_started.md +71 -0
  10. astrox_python-0.1.1/docs/how_to/README.md +11 -0
  11. astrox_python-0.1.1/docs/how_to/build_an_hpop_configuration.md +148 -0
  12. astrox_python-0.1.1/docs/how_to/compute_access_intervals.md +108 -0
  13. astrox_python-0.1.1/docs/how_to/compute_lighting_conditions.md +123 -0
  14. astrox_python-0.1.1/docs/how_to/convert_between_orbit_representations.md +137 -0
  15. astrox_python-0.1.1/docs/how_to/propagate_an_orbit.md +148 -0
  16. astrox_python-0.1.1/docs/i18n/en/README.md +59 -0
  17. astrox_python-0.1.1/docs/i18n/en/getting_started.md +71 -0
  18. astrox_python-0.1.1/docs/i18n/en/how_to/README.md +11 -0
  19. astrox_python-0.1.1/docs/i18n/en/how_to/build_an_hpop_configuration.md +148 -0
  20. astrox_python-0.1.1/docs/i18n/en/how_to/compute_access_intervals.md +108 -0
  21. astrox_python-0.1.1/docs/i18n/en/how_to/compute_lighting_conditions.md +123 -0
  22. astrox_python-0.1.1/docs/i18n/en/how_to/convert_between_orbit_representations.md +137 -0
  23. astrox_python-0.1.1/docs/i18n/en/how_to/propagate_an_orbit.md +148 -0
  24. astrox_python-0.1.1/docs/i18n/en/manual/README.md +11 -0
  25. astrox_python-0.1.1/docs/i18n/en/manual/access/README.md +264 -0
  26. astrox_python-0.1.1/docs/i18n/en/manual/components/README.md +807 -0
  27. astrox_python-0.1.1/docs/i18n/en/manual/coverage/README.md +403 -0
  28. astrox_python-0.1.1/docs/i18n/en/manual/lighting/README.md +185 -0
  29. astrox_python-0.1.1/docs/i18n/en/manual/orbits/README.md +451 -0
  30. astrox_python-0.1.1/docs/i18n/en/manual/propagator/README.md +634 -0
  31. astrox_python-0.1.1/docs/i18n/en/manual/rocket/README.md +110 -0
  32. astrox_python-0.1.1/docs/manual/README.md +11 -0
  33. astrox_python-0.1.1/docs/manual/access/README.md +264 -0
  34. astrox_python-0.1.1/docs/manual/components/README.md +807 -0
  35. astrox_python-0.1.1/docs/manual/coverage/README.md +403 -0
  36. astrox_python-0.1.1/docs/manual/lighting/README.md +185 -0
  37. astrox_python-0.1.1/docs/manual/orbits/README.md +451 -0
  38. astrox_python-0.1.1/docs/manual/propagator/README.md +634 -0
  39. astrox_python-0.1.1/docs/manual/rocket/README.md +110 -0
  40. {astrox_python-0.1.0 → astrox_python-0.1.1}/docs/sdk-principles.md +3 -3
  41. astrox_python-0.1.1/docs/validation/README.md +15 -0
  42. astrox_python-0.1.1/docs/validation/access.md +348 -0
  43. astrox_python-0.1.1/docs/validation/coverage.md +216 -0
  44. astrox_python-0.1.1/docs/validation/lighting.md +171 -0
  45. astrox_python-0.1.1/docs/validation/orbits.md +194 -0
  46. astrox_python-0.1.1/docs/validation/propagator.md +271 -0
  47. astrox_python-0.1.1/docs/validation/rocket.md +93 -0
  48. astrox_python-0.1.1/examples/01_propagation/README.md +47 -0
  49. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/ballistic_apogee_alt.py +25 -26
  50. astrox_python-0.1.1/examples/01_propagation/ballistic_delta_v.py +107 -0
  51. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/ballistic_min_ecc.py +3 -3
  52. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/ballistic_time_of_flight.py +3 -3
  53. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/batch_propagators.py +4 -4
  54. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/hpop.py +9 -9
  55. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/j2_classical.py +11 -11
  56. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/propagator_reference.py +14 -14
  57. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/sgp4_tle.py +4 -4
  58. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/simple_ascent.py +4 -4
  59. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/01_propagation/two_body_classical.py +4 -4
  60. astrox_python-0.1.1/examples/02_orbits/README.md +30 -0
  61. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/conversions.py +8 -8
  62. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/lambert_delta_v.py +5 -5
  63. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/orbit_system.py +16 -17
  64. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/02_orbits/wizards.py +4 -4
  65. astrox_python-0.1.1/examples/03_lighting/README.md +26 -0
  66. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/03_lighting/lighting.py +9 -9
  67. astrox_python-0.1.1/examples/04_access/README.md +30 -0
  68. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/chain.py +5 -5
  69. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/compute.py +7 -7
  70. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/constraints.py +7 -7
  71. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/custom_axes.py +3 -3
  72. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/04_access/sensor_pointing.py +3 -3
  73. astrox_python-0.1.1/examples/05_rocket/README.md +7 -0
  74. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/05_rocket/landing_zone.py +5 -5
  75. astrox_python-0.1.1/examples/06_coverage/README.md +32 -0
  76. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/compute.py +6 -6
  77. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/fom.py +6 -6
  78. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/grid_points.py +3 -3
  79. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/06_coverage/reports.py +5 -5
  80. {astrox_python-0.1.0 → astrox_python-0.1.1}/pyproject.toml +1 -1
  81. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/test_chain.py +30 -0
  82. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/test_compute.py +4 -0
  83. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/components/test_components.py +54 -0
  84. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/coverage/test_coverage.py +10 -0
  85. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/coverage/test_coverage_fom.py +11 -1
  86. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/README.md +32 -0
  87. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/README.md +1 -0
  88. astrox_python-0.1.1/tests/validation/cross_validation/access/_exclusion.py +285 -0
  89. astrox_python-0.1.1/tests/validation/cross_validation/access/test_compute_exclusion_constraints_invariants.py +576 -0
  90. astrox_python-0.1.1/tests/validation/cross_validation/coverage/test_exclusion_grid_constraints_skyfield.py +266 -0
  91. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_grid_options_invariants.py +20 -2
  92. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_grid_point_modifiers_invariants.py +58 -1
  93. astrox_python-0.1.1/tests/validation/live_snapshot/access/access.snap.json +1434 -0
  94. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_access.py +23 -6
  95. astrox_python-0.1.1/tests/validation/live_snapshot/propagator/ballistic.snap.json +213 -0
  96. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_ballistic.py +24 -6
  97. {astrox_python-0.1.0 → astrox_python-0.1.1}/uv.lock +60 -556
  98. astrox_python-0.1.0/README.md +0 -54
  99. astrox_python-0.1.0/docs/sdk/access.md +0 -191
  100. astrox_python-0.1.0/docs/sdk/components.md +0 -351
  101. astrox_python-0.1.0/docs/sdk/coverage.md +0 -171
  102. astrox_python-0.1.0/docs/sdk/lighting.md +0 -75
  103. astrox_python-0.1.0/docs/sdk/orbits.md +0 -215
  104. astrox_python-0.1.0/docs/sdk/propagator.md +0 -272
  105. astrox_python-0.1.0/docs/sdk/rocket.md +0 -55
  106. astrox_python-0.1.0/examples/01_propagation/README.md +0 -47
  107. astrox_python-0.1.0/examples/01_propagation/ballistic_delta_v.py +0 -108
  108. astrox_python-0.1.0/examples/02_orbits/README.md +0 -30
  109. astrox_python-0.1.0/examples/03_lighting/README.md +0 -26
  110. astrox_python-0.1.0/examples/04_access/README.md +0 -30
  111. astrox_python-0.1.0/examples/05_rocket/README.md +0 -7
  112. astrox_python-0.1.0/examples/06_coverage/README.md +0 -32
  113. astrox_python-0.1.0/tests/validation/live_snapshot/access/access.snap.json +0 -1434
  114. astrox_python-0.1.0/tests/validation/live_snapshot/propagator/ballistic.snap.json +0 -213
  115. {astrox_python-0.1.0 → astrox_python-0.1.1}/.gitignore +0 -0
  116. {astrox_python-0.1.0 → astrox_python-0.1.1}/LICENSE +0 -0
  117. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/__init__.py +0 -0
  118. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/_http.py +0 -0
  119. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/access.py +0 -0
  120. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_axes.py +0 -0
  121. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_common.py +0 -0
  122. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_objects.py +0 -0
  123. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_positions.py +0 -0
  124. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_rotations.py +0 -0
  125. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_sensors.py +0 -0
  126. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/components/_vgt.py +0 -0
  127. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/__init__.py +0 -0
  128. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/_fom.py +0 -0
  129. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/coverage_time.py +0 -0
  130. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/number_of_assets.py +0 -0
  131. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/response_time.py +0 -0
  132. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/revisit_time.py +0 -0
  133. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/coverage/simple_coverage.py +0 -0
  134. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/exceptions.py +0 -0
  135. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/lighting.py +0 -0
  136. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/orbits.py +0 -0
  137. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/propagator.py +0 -0
  138. {astrox_python-0.1.0 → astrox_python-0.1.1}/astrox/rocket.py +0 -0
  139. {astrox_python-0.1.0 → astrox_python-0.1.1}/docs/automated-workflows.md +0 -0
  140. {astrox_python-0.1.0 → astrox_python-0.1.1}/docs/test-principles.md +0 -0
  141. {astrox_python-0.1.0 → astrox_python-0.1.1}/examples/manifest.toml +0 -0
  142. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/README.md +0 -0
  143. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/conftest.py +0 -0
  144. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/helpers.py +0 -0
  145. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/access/test_values.py +0 -0
  146. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/client/test_client.py +0 -0
  147. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/helpers.py +0 -0
  148. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/lighting/test_lighting.py +0 -0
  149. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/helpers.py +0 -0
  150. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_conversions.py +0 -0
  151. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_keplerian.py +0 -0
  152. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_orbit_system.py +0 -0
  153. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/orbits/test_wizards.py +0 -0
  154. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/helpers.py +0 -0
  155. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_ballistic.py +0 -0
  156. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_hpop.py +0 -0
  157. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_j2_two_body.py +0 -0
  158. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_multi.py +0 -0
  159. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_public_contract.py +0 -0
  160. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/propagator/test_sgp4_simple_ascent.py +0 -0
  161. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/rocket/__init__.py +0 -0
  162. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/sdk/rocket/test_rocket.py +0 -0
  163. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_external/gmat/README.md +0 -0
  164. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_external/gmat/hpop_driver.py +0 -0
  165. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_external/gmat/test_hpop_driver.py +0 -0
  166. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/__init__.py +0 -0
  167. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/contracts.py +0 -0
  168. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/external_tools.py +0 -0
  169. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/gmat.py +0 -0
  170. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/skyfield.py +0 -0
  171. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_contracts.py +0 -0
  172. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_external_tools.py +0 -0
  173. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_gmat.py +0 -0
  174. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/_support/test_skyfield.py +0 -0
  175. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/__init__.py +0 -0
  176. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/__init__.py +0 -0
  177. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_aer.py +0 -0
  178. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_cases.py +0 -0
  179. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_constraints.py +0 -0
  180. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_geometry.py +0 -0
  181. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_mixed_model.py +0 -0
  182. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/_orientation.py +0 -0
  183. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_axes_orientation_geometry.py +0 -0
  184. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_chain_sgp4_skyfield.py +0 -0
  185. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_composite_czml_axes_geometry.py +0 -0
  186. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_constraints_skyfield.py +0 -0
  187. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_ground_sgp4_skyfield.py +0 -0
  188. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_j2_two_body_geometry.py +0 -0
  189. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_sgp4_j2_geometry.py +0 -0
  190. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_site_hpop_geometry.py +0 -0
  191. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_site_j2_geometry.py +0 -0
  192. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_compute_site_two_body_geometry.py +0 -0
  193. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_sensor_pointing_geometry.py +0 -0
  194. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/access/test_vgt_orientation_resolution.py +0 -0
  195. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/_fom_helpers.py +0 -0
  196. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_at_time_boundaries_invariants.py +0 -0
  197. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_edge_cases_invariants.py +0 -0
  198. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_interval_invariants.py +0 -0
  199. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_resource_options_invariants.py +0 -0
  200. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_response_shapes_invariants.py +0 -0
  201. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_fom_response_time_dynamic_invariants.py +0 -0
  202. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_grid_generation_local.py +0 -0
  203. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_resource_reports_invariants.py +0 -0
  204. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/coverage/test_sgp4_grid_membership_skyfield.py +0 -0
  205. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/__init__.py +0 -0
  206. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/test_site_sun_skyfield.py +0 -0
  207. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/test_spacecraft_solar_intensity_orekit.py +0 -0
  208. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/lighting/test_spacecraft_sun_skyfield.py +0 -0
  209. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/__init__.py +0 -0
  210. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/_support.py +0 -0
  211. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/test_convert_czml_position.py +0 -0
  212. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbit_system/test_earth_moon_libration.py +0 -0
  213. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/__init__.py +0 -0
  214. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_kozai_izsak_mean_elements_invariants.py +0 -0
  215. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_lambert_lamberthub.py +0 -0
  216. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_walker_constellation_equations.py +0 -0
  217. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/orbits/test_wizards_local_derivation.py +0 -0
  218. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_ballistic_geodetic.py +0 -0
  219. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_hpop_gmat.py +0 -0
  220. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_j2_analytical.py +0 -0
  221. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_multi_sgp4_skyfield.py +0 -0
  222. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_sgp4_skyfield.py +0 -0
  223. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_simple_ascent_geodetic.py +0 -0
  224. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/propagator/test_two_body_brahe.py +0 -0
  225. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/rocket/__init__.py +0 -0
  226. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/cross_validation/rocket/test_landing_zone_geographiclib.py +0 -0
  227. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/__init__.py +0 -0
  228. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/__init__.py +0 -0
  229. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_chain_topology.py +0 -0
  230. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_compute_model_pairs.py +0 -0
  231. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/access/test_compute_options.py +0 -0
  232. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/coverage/coverage.snap.json +0 -0
  233. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/coverage/test_coverage.py +0 -0
  234. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/lighting/__init__.py +0 -0
  235. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/lighting/lighting.snap.json +0 -0
  236. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/lighting/test_lighting.py +0 -0
  237. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/__init__.py +0 -0
  238. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/conversions.snap.json +0 -0
  239. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/orbit_system.snap.json +0 -0
  240. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_conversion_roundtrip.py +0 -0
  241. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_conversions.py +0 -0
  242. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_orbit_system.py +0 -0
  243. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/test_wizards.py +0 -0
  244. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/orbits/wizards.snap.json +0 -0
  245. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/__init__.py +0 -0
  246. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/hpop.snap.json +0 -0
  247. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/j2.snap.json +0 -0
  248. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/multi_j2.snap.json +0 -0
  249. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/multi_sgp4.snap.json +0 -0
  250. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/multi_two_body.snap.json +0 -0
  251. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/sgp4.snap.json +0 -0
  252. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/simple_ascent.snap.json +0 -0
  253. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_hpop.py +0 -0
  254. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_j2.py +0 -0
  255. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_multi_j2.py +0 -0
  256. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_multi_sgp4.py +0 -0
  257. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_multi_two_body.py +0 -0
  258. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_sgp4.py +0 -0
  259. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_simple_ascent.py +0 -0
  260. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/test_two_body.py +0 -0
  261. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/propagator/two_body.snap.json +0 -0
  262. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/rocket/__init__.py +0 -0
  263. {astrox_python-0.1.0 → astrox_python-0.1.1}/tests/validation/live_snapshot/rocket/landing_zone.snap.json +0 -0
  264. {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.0
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
- Python SDK for the ASTROX Web API.
31
+ astrox-python ASTROX Web API 的 Python SDK。
32
32
 
33
- ## Installation
33
+ ## 安装
34
+
35
+ 需要 Python 3.10 或更高版本。
34
36
 
35
37
  ```bash
36
38
  pip install astrox-python
37
39
  ```
38
40
 
39
- Requires Python 3.10 or later.
40
-
41
- ## Quickstart
41
+ ## 一分钟示例
42
42
 
43
- Propagate a simple Keplerian orbit with J2 perturbations:
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=28.5,
54
+ inclination_deg=51.6,
52
55
  argument_of_periapsis_deg=0.0,
53
- raan_deg=0.0,
54
- true_anomaly_deg=0.0,
56
+ raan_deg=120.0,
57
+ true_anomaly_deg=45.0,
55
58
  )
56
59
 
57
60
  period_s, position = propagator.j2(
58
- start="2026-01-01T00:00:00Z",
59
- stop="2026-01-01T01:00:00Z",
60
- orbit_epoch="2026-01-01T00:00:00Z",
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
- ## Documentation
71
+ 完整首次运行流程见 [快速上手](docs/getting_started.md)。
66
72
 
67
- - SDK guides and API notes: [`docs/sdk/`](./docs/sdk/)
68
- - Runnable examples: [`examples/`](./examples/)
73
+ ## 文档
69
74
 
70
- ## Development
75
+ - 完整文档导航:[docs/README.md](docs/README.md)
76
+ - 可运行示例:[examples/](examples/)
77
+ - 英文快照:[docs/i18n/en/README.md](docs/i18n/en/README.md)
71
78
 
72
- Install from a checkout:
79
+ ## 参与开发
73
80
 
74
- ```bash
75
- uv sync --group dev
76
- uv build --no-build-isolation
77
- uv run python -m pytest -q tests/sdk
78
- ```
81
+ 开发环境搭建与构建步骤见 [CONTRIBUTING.md](docs/CONTRIBUTING.md)。
82
+
83
+ ## 许可
79
84
 
80
- ## License
85
+ MIT 许可证,详见 [LICENSE](LICENSE)。
81
86
 
82
- MIT see [LICENSE](./LICENSE).
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
- Constraint: TypeAlias = ElevationConstraint | RangeConstraint | AzElMaskConstraint
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
- _CONSTRAINT_TYPES = (ElevationConstraint, RangeConstraint, AzElMaskConstraint)
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,9 @@
1
+ # 参与开发
2
+
3
+ 从本仓库检出后,安装开发依赖并运行测试:
4
+
5
+ ```bash
6
+ uv sync --group dev
7
+ uv build --no-build-isolation
8
+ uv run python -m pytest -q tests/sdk
9
+ ```
@@ -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`。